diff --git a/Makefile b/Makefile index 6dcd0c31..d81d7644 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ export PATH := $(LOCAL_BIN_PATH):$(PATH) export CGO_ENABLED=0 # Details of the model to use: -model_version:=v0.0.383 +model_version:=v0.0.384 model_url:=https://github.com/openshift-online/ocm-api-model.git # Details of the metamodel to use: diff --git a/clustersmgmt/client.go b/clustersmgmt/client.go index 40553cce..a46dcc77 100644 --- a/clustersmgmt/client.go +++ b/clustersmgmt/client.go @@ -24,6 +24,7 @@ import ( "path" v1 "github.com/openshift-online/ocm-sdk-go/clustersmgmt/v1" + "github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1" ) // Client is the client for service 'clusters_mgmt'. @@ -48,3 +49,11 @@ func (c *Client) V1() *v1.Client { path.Join(c.path, "v1"), ) } + +// V2alpha1 returns a reference to a client for version 'v2alpha1'. +func (c *Client) V2alpha1() *v2alpha1.Client { + return v2alpha1.NewClient( + c.transport, + path.Join(c.path, "v2alpha1"), + ) +} diff --git a/clustersmgmt/v2alpha1/add_on_builder.go b/clustersmgmt/v2alpha1/add_on_builder.go new file mode 100644 index 00000000..f1b6d6ea --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_builder.go @@ -0,0 +1,447 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnBuilder contains the data and logic needed to build 'add_on' objects. +// +// Representation of an add-on that can be installed in a cluster. +type AddOnBuilder struct { + bitmap_ uint32 + id string + href string + commonAnnotations map[string]string + commonLabels map[string]string + config *AddOnConfigBuilder + credentialsRequests []*CredentialRequestBuilder + description string + docsLink string + icon string + installMode AddOnInstallMode + label string + name string + namespaces []*AddOnNamespaceBuilder + operatorName string + parameters *AddOnParameterListBuilder + requirements []*AddOnRequirementBuilder + resourceCost float64 + resourceName string + subOperators []*AddOnSubOperatorBuilder + targetNamespace string + version *AddOnVersionBuilder + enabled bool + hasExternalResources bool + hidden bool + managedService bool +} + +// NewAddOn creates a new builder of 'add_on' objects. +func NewAddOn() *AddOnBuilder { + return &AddOnBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnBuilder) Link(value bool) *AddOnBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnBuilder) ID(value string) *AddOnBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnBuilder) HREF(value string) *AddOnBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// CommonAnnotations sets the value of the 'common_annotations' attribute to the given value. +func (b *AddOnBuilder) CommonAnnotations(value map[string]string) *AddOnBuilder { + b.commonAnnotations = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// CommonLabels sets the value of the 'common_labels' attribute to the given value. +func (b *AddOnBuilder) CommonLabels(value map[string]string) *AddOnBuilder { + b.commonLabels = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Config sets the value of the 'config' attribute to the given value. +// +// Representation of an add-on config. +// The attributes under it are to be used by the addon once its installed in the cluster. +func (b *AddOnBuilder) Config(value *AddOnConfigBuilder) *AddOnBuilder { + b.config = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// CredentialsRequests sets the value of the 'credentials_requests' attribute to the given values. +func (b *AddOnBuilder) CredentialsRequests(values ...*CredentialRequestBuilder) *AddOnBuilder { + b.credentialsRequests = make([]*CredentialRequestBuilder, len(values)) + copy(b.credentialsRequests, values) + b.bitmap_ |= 64 + return b +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *AddOnBuilder) Description(value string) *AddOnBuilder { + b.description = value + b.bitmap_ |= 128 + return b +} + +// DocsLink sets the value of the 'docs_link' attribute to the given value. +func (b *AddOnBuilder) DocsLink(value string) *AddOnBuilder { + b.docsLink = value + b.bitmap_ |= 256 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AddOnBuilder) Enabled(value bool) *AddOnBuilder { + b.enabled = value + b.bitmap_ |= 512 + return b +} + +// HasExternalResources sets the value of the 'has_external_resources' attribute to the given value. +func (b *AddOnBuilder) HasExternalResources(value bool) *AddOnBuilder { + b.hasExternalResources = value + b.bitmap_ |= 1024 + return b +} + +// Hidden sets the value of the 'hidden' attribute to the given value. +func (b *AddOnBuilder) Hidden(value bool) *AddOnBuilder { + b.hidden = value + b.bitmap_ |= 2048 + return b +} + +// Icon sets the value of the 'icon' attribute to the given value. +func (b *AddOnBuilder) Icon(value string) *AddOnBuilder { + b.icon = value + b.bitmap_ |= 4096 + return b +} + +// InstallMode sets the value of the 'install_mode' attribute to the given value. +// +// Representation of an add-on InstallMode field. +func (b *AddOnBuilder) InstallMode(value AddOnInstallMode) *AddOnBuilder { + b.installMode = value + b.bitmap_ |= 8192 + return b +} + +// Label sets the value of the 'label' attribute to the given value. +func (b *AddOnBuilder) Label(value string) *AddOnBuilder { + b.label = value + b.bitmap_ |= 16384 + return b +} + +// ManagedService sets the value of the 'managed_service' attribute to the given value. +func (b *AddOnBuilder) ManagedService(value bool) *AddOnBuilder { + b.managedService = value + b.bitmap_ |= 32768 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AddOnBuilder) Name(value string) *AddOnBuilder { + b.name = value + b.bitmap_ |= 65536 + return b +} + +// Namespaces sets the value of the 'namespaces' attribute to the given values. +func (b *AddOnBuilder) Namespaces(values ...*AddOnNamespaceBuilder) *AddOnBuilder { + b.namespaces = make([]*AddOnNamespaceBuilder, len(values)) + copy(b.namespaces, values) + b.bitmap_ |= 131072 + return b +} + +// OperatorName sets the value of the 'operator_name' attribute to the given value. +func (b *AddOnBuilder) OperatorName(value string) *AddOnBuilder { + b.operatorName = value + b.bitmap_ |= 262144 + return b +} + +// Parameters sets the value of the 'parameters' attribute to the given values. +func (b *AddOnBuilder) Parameters(value *AddOnParameterListBuilder) *AddOnBuilder { + b.parameters = value + b.bitmap_ |= 524288 + return b +} + +// Requirements sets the value of the 'requirements' attribute to the given values. +func (b *AddOnBuilder) Requirements(values ...*AddOnRequirementBuilder) *AddOnBuilder { + b.requirements = make([]*AddOnRequirementBuilder, len(values)) + copy(b.requirements, values) + b.bitmap_ |= 1048576 + return b +} + +// ResourceCost sets the value of the 'resource_cost' attribute to the given value. +func (b *AddOnBuilder) ResourceCost(value float64) *AddOnBuilder { + b.resourceCost = value + b.bitmap_ |= 2097152 + return b +} + +// ResourceName sets the value of the 'resource_name' attribute to the given value. +func (b *AddOnBuilder) ResourceName(value string) *AddOnBuilder { + b.resourceName = value + b.bitmap_ |= 4194304 + return b +} + +// SubOperators sets the value of the 'sub_operators' attribute to the given values. +func (b *AddOnBuilder) SubOperators(values ...*AddOnSubOperatorBuilder) *AddOnBuilder { + b.subOperators = make([]*AddOnSubOperatorBuilder, len(values)) + copy(b.subOperators, values) + b.bitmap_ |= 8388608 + return b +} + +// TargetNamespace sets the value of the 'target_namespace' attribute to the given value. +func (b *AddOnBuilder) TargetNamespace(value string) *AddOnBuilder { + b.targetNamespace = value + b.bitmap_ |= 16777216 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +// +// Representation of an add-on version. +func (b *AddOnBuilder) Version(value *AddOnVersionBuilder) *AddOnBuilder { + b.version = value + if value != nil { + b.bitmap_ |= 33554432 + } else { + b.bitmap_ &^= 33554432 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnBuilder) Copy(object *AddOn) *AddOnBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if len(object.commonAnnotations) > 0 { + b.commonAnnotations = map[string]string{} + for k, v := range object.commonAnnotations { + b.commonAnnotations[k] = v + } + } else { + b.commonAnnotations = nil + } + if len(object.commonLabels) > 0 { + b.commonLabels = map[string]string{} + for k, v := range object.commonLabels { + b.commonLabels[k] = v + } + } else { + b.commonLabels = nil + } + if object.config != nil { + b.config = NewAddOnConfig().Copy(object.config) + } else { + b.config = nil + } + if object.credentialsRequests != nil { + b.credentialsRequests = make([]*CredentialRequestBuilder, len(object.credentialsRequests)) + for i, v := range object.credentialsRequests { + b.credentialsRequests[i] = NewCredentialRequest().Copy(v) + } + } else { + b.credentialsRequests = nil + } + b.description = object.description + b.docsLink = object.docsLink + b.enabled = object.enabled + b.hasExternalResources = object.hasExternalResources + b.hidden = object.hidden + b.icon = object.icon + b.installMode = object.installMode + b.label = object.label + b.managedService = object.managedService + b.name = object.name + if object.namespaces != nil { + b.namespaces = make([]*AddOnNamespaceBuilder, len(object.namespaces)) + for i, v := range object.namespaces { + b.namespaces[i] = NewAddOnNamespace().Copy(v) + } + } else { + b.namespaces = nil + } + b.operatorName = object.operatorName + if object.parameters != nil { + b.parameters = NewAddOnParameterList().Copy(object.parameters) + } else { + b.parameters = nil + } + if object.requirements != nil { + b.requirements = make([]*AddOnRequirementBuilder, len(object.requirements)) + for i, v := range object.requirements { + b.requirements[i] = NewAddOnRequirement().Copy(v) + } + } else { + b.requirements = nil + } + b.resourceCost = object.resourceCost + b.resourceName = object.resourceName + if object.subOperators != nil { + b.subOperators = make([]*AddOnSubOperatorBuilder, len(object.subOperators)) + for i, v := range object.subOperators { + b.subOperators[i] = NewAddOnSubOperator().Copy(v) + } + } else { + b.subOperators = nil + } + b.targetNamespace = object.targetNamespace + if object.version != nil { + b.version = NewAddOnVersion().Copy(object.version) + } else { + b.version = nil + } + return b +} + +// Build creates a 'add_on' object using the configuration stored in the builder. +func (b *AddOnBuilder) Build() (object *AddOn, err error) { + object = new(AddOn) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.commonAnnotations != nil { + object.commonAnnotations = make(map[string]string) + for k, v := range b.commonAnnotations { + object.commonAnnotations[k] = v + } + } + if b.commonLabels != nil { + object.commonLabels = make(map[string]string) + for k, v := range b.commonLabels { + object.commonLabels[k] = v + } + } + if b.config != nil { + object.config, err = b.config.Build() + if err != nil { + return + } + } + if b.credentialsRequests != nil { + object.credentialsRequests = make([]*CredentialRequest, len(b.credentialsRequests)) + for i, v := range b.credentialsRequests { + object.credentialsRequests[i], err = v.Build() + if err != nil { + return + } + } + } + object.description = b.description + object.docsLink = b.docsLink + object.enabled = b.enabled + object.hasExternalResources = b.hasExternalResources + object.hidden = b.hidden + object.icon = b.icon + object.installMode = b.installMode + object.label = b.label + object.managedService = b.managedService + object.name = b.name + if b.namespaces != nil { + object.namespaces = make([]*AddOnNamespace, len(b.namespaces)) + for i, v := range b.namespaces { + object.namespaces[i], err = v.Build() + if err != nil { + return + } + } + } + object.operatorName = b.operatorName + if b.parameters != nil { + object.parameters, err = b.parameters.Build() + if err != nil { + return + } + } + if b.requirements != nil { + object.requirements = make([]*AddOnRequirement, len(b.requirements)) + for i, v := range b.requirements { + object.requirements[i], err = v.Build() + if err != nil { + return + } + } + } + object.resourceCost = b.resourceCost + object.resourceName = b.resourceName + if b.subOperators != nil { + object.subOperators = make([]*AddOnSubOperator, len(b.subOperators)) + for i, v := range b.subOperators { + object.subOperators[i], err = v.Build() + if err != nil { + return + } + } + } + object.targetNamespace = b.targetNamespace + if b.version != nil { + object.version, err = b.version.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_client.go b/clustersmgmt/v2alpha1/add_on_client.go new file mode 100644 index 00000000..448f2f14 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_client.go @@ -0,0 +1,589 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddOnClient is the client of the 'add_on' resource. +// +// Manages a specific add-on. +type AddOnClient struct { + transport http.RoundTripper + path string +} + +// NewAddOnClient creates a new client for the 'add_on' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddOnClient(transport http.RoundTripper, path string) *AddOnClient { + return &AddOnClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the add-on. +func (c *AddOnClient) Delete() *AddOnDeleteRequest { + return &AddOnDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the add-on. +func (c *AddOnClient) Get() *AddOnGetRequest { + return &AddOnGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the add-on. +func (c *AddOnClient) Update() *AddOnUpdateRequest { + return &AddOnUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// Versions returns the target 'add_on_versions' resource. +// +// Reference to the resource that manages the collection of addon versions. +func (c *AddOnClient) Versions() *AddOnVersionsClient { + return NewAddOnVersionsClient( + c.transport, + path.Join(c.path, "versions"), + ) +} + +// AddOnPollRequest is the request for the Poll method. +type AddOnPollRequest struct { + request *AddOnGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AddOnPollRequest) Parameter(name string, value interface{}) *AddOnPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AddOnPollRequest) Header(name string, value interface{}) *AddOnPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AddOnPollRequest) Interval(value time.Duration) *AddOnPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AddOnPollRequest) Status(value int) *AddOnPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AddOnPollRequest) Predicate(value func(*AddOnGetResponse) bool) *AddOnPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AddOnGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AddOnPollRequest) StartContext(ctx context.Context) (response *AddOnPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AddOnPollResponse{ + response: result.(*AddOnGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AddOnPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AddOnPollResponse is the response for the Poll method. +type AddOnPollResponse struct { + response *AddOnGetResponse +} + +// Status returns the response status code. +func (r *AddOnPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AddOnPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AddOnPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnPollResponse) Body() *AddOn { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnPollResponse) GetBody() (value *AddOn, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AddOnClient) Poll() *AddOnPollRequest { + return &AddOnPollRequest{ + request: c.Get(), + } +} + +// AddOnDeleteRequest is the request for the 'delete' method. +type AddOnDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddOnDeleteRequest) Parameter(name string, value interface{}) *AddOnDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnDeleteRequest) Header(name string, value interface{}) *AddOnDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnDeleteRequest) Impersonate(user string) *AddOnDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnDeleteRequest) Send() (result *AddOnDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnDeleteRequest) SendContext(ctx context.Context) (result *AddOnDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// AddOnDeleteResponse is the response for the 'delete' method. +type AddOnDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *AddOnDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AddOnGetRequest is the request for the 'get' method. +type AddOnGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddOnGetRequest) Parameter(name string, value interface{}) *AddOnGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnGetRequest) Header(name string, value interface{}) *AddOnGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnGetRequest) Impersonate(user string) *AddOnGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnGetRequest) Send() (result *AddOnGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnGetRequest) SendContext(ctx context.Context) (result *AddOnGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnGetResponse is the response for the 'get' method. +type AddOnGetResponse struct { + status int + header http.Header + err *errors.Error + body *AddOn +} + +// Status returns the response status code. +func (r *AddOnGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnGetResponse) Body() *AddOn { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnGetResponse) GetBody() (value *AddOn, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddOnUpdateRequest is the request for the 'update' method. +type AddOnUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddOn +} + +// Parameter adds a query parameter. +func (r *AddOnUpdateRequest) Parameter(name string, value interface{}) *AddOnUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnUpdateRequest) Header(name string, value interface{}) *AddOnUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnUpdateRequest) Impersonate(user string) *AddOnUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *AddOnUpdateRequest) Body(value *AddOn) *AddOnUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnUpdateRequest) Send() (result *AddOnUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnUpdateRequest) SendContext(ctx context.Context) (result *AddOnUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddOnUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnUpdateResponse is the response for the 'update' method. +type AddOnUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *AddOn +} + +// Status returns the response status code. +func (r *AddOnUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnUpdateResponse) Body() *AddOn { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnUpdateResponse) GetBody() (value *AddOn, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_config_builder.go b/clustersmgmt/v2alpha1/add_on_config_builder.go new file mode 100644 index 00000000..a3db11a4 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_config_builder.go @@ -0,0 +1,132 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnConfigBuilder contains the data and logic needed to build 'add_on_config' objects. +// +// Representation of an add-on config. +// The attributes under it are to be used by the addon once its installed in the cluster. +type AddOnConfigBuilder struct { + bitmap_ uint32 + id string + href string + addOnEnvironmentVariables []*AddOnEnvironmentVariableBuilder + secretPropagations []*AddOnSecretPropagationBuilder +} + +// NewAddOnConfig creates a new builder of 'add_on_config' objects. +func NewAddOnConfig() *AddOnConfigBuilder { + return &AddOnConfigBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnConfigBuilder) Link(value bool) *AddOnConfigBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnConfigBuilder) ID(value string) *AddOnConfigBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnConfigBuilder) HREF(value string) *AddOnConfigBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnConfigBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AddOnEnvironmentVariables sets the value of the 'add_on_environment_variables' attribute to the given values. +func (b *AddOnConfigBuilder) AddOnEnvironmentVariables(values ...*AddOnEnvironmentVariableBuilder) *AddOnConfigBuilder { + b.addOnEnvironmentVariables = make([]*AddOnEnvironmentVariableBuilder, len(values)) + copy(b.addOnEnvironmentVariables, values) + b.bitmap_ |= 8 + return b +} + +// SecretPropagations sets the value of the 'secret_propagations' attribute to the given values. +func (b *AddOnConfigBuilder) SecretPropagations(values ...*AddOnSecretPropagationBuilder) *AddOnConfigBuilder { + b.secretPropagations = make([]*AddOnSecretPropagationBuilder, len(values)) + copy(b.secretPropagations, values) + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnConfigBuilder) Copy(object *AddOnConfig) *AddOnConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.addOnEnvironmentVariables != nil { + b.addOnEnvironmentVariables = make([]*AddOnEnvironmentVariableBuilder, len(object.addOnEnvironmentVariables)) + for i, v := range object.addOnEnvironmentVariables { + b.addOnEnvironmentVariables[i] = NewAddOnEnvironmentVariable().Copy(v) + } + } else { + b.addOnEnvironmentVariables = nil + } + if object.secretPropagations != nil { + b.secretPropagations = make([]*AddOnSecretPropagationBuilder, len(object.secretPropagations)) + for i, v := range object.secretPropagations { + b.secretPropagations[i] = NewAddOnSecretPropagation().Copy(v) + } + } else { + b.secretPropagations = nil + } + return b +} + +// Build creates a 'add_on_config' object using the configuration stored in the builder. +func (b *AddOnConfigBuilder) Build() (object *AddOnConfig, err error) { + object = new(AddOnConfig) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.addOnEnvironmentVariables != nil { + object.addOnEnvironmentVariables = make([]*AddOnEnvironmentVariable, len(b.addOnEnvironmentVariables)) + for i, v := range b.addOnEnvironmentVariables { + object.addOnEnvironmentVariables[i], err = v.Build() + if err != nil { + return + } + } + } + if b.secretPropagations != nil { + object.secretPropagations = make([]*AddOnSecretPropagation, len(b.secretPropagations)) + for i, v := range b.secretPropagations { + object.secretPropagations[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_config_list_builder.go b/clustersmgmt/v2alpha1/add_on_config_list_builder.go new file mode 100644 index 00000000..56372d1e --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnConfigListBuilder contains the data and logic needed to build +// 'add_on_config' objects. +type AddOnConfigListBuilder struct { + items []*AddOnConfigBuilder +} + +// NewAddOnConfigList creates a new builder of 'add_on_config' objects. +func NewAddOnConfigList() *AddOnConfigListBuilder { + return new(AddOnConfigListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnConfigListBuilder) Items(values ...*AddOnConfigBuilder) *AddOnConfigListBuilder { + b.items = make([]*AddOnConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnConfigListBuilder) Copy(list *AddOnConfigList) *AddOnConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_config' objects using the +// configuration stored in the builder. +func (b *AddOnConfigListBuilder) Build() (list *AddOnConfigList, err error) { + items := make([]*AddOnConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_config_list_type_json.go b/clustersmgmt/v2alpha1/add_on_config_list_type_json.go new file mode 100644 index 00000000..25264233 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnConfigList writes a list of values of the 'add_on_config' type to +// the given writer. +func MarshalAddOnConfigList(list []*AddOnConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnConfigList writes a list of value of the 'add_on_config' type to +// the given stream. +func writeAddOnConfigList(list []*AddOnConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnConfigList reads a list of values of the 'add_on_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnConfigList(source interface{}) (items []*AddOnConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnConfigList(iterator) + err = iterator.Error + return +} + +// readAddOnConfigList reads list of values of the ”add_on_config' type from +// the given iterator. +func readAddOnConfigList(iterator *jsoniter.Iterator) []*AddOnConfig { + list := []*AddOnConfig{} + for iterator.ReadArray() { + item := readAddOnConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_config_type.go b/clustersmgmt/v2alpha1/add_on_config_type.go new file mode 100644 index 00000000..378fa3c4 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_config_type.go @@ -0,0 +1,267 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnConfigKind is the name of the type used to represent objects +// of type 'add_on_config'. +const AddOnConfigKind = "AddOnConfig" + +// AddOnConfigLinkKind is the name of the type used to represent links +// to objects of type 'add_on_config'. +const AddOnConfigLinkKind = "AddOnConfigLink" + +// AddOnConfigNilKind is the name of the type used to nil references +// to objects of type 'add_on_config'. +const AddOnConfigNilKind = "AddOnConfigNil" + +// AddOnConfig represents the values of the 'add_on_config' type. +// +// Representation of an add-on config. +// The attributes under it are to be used by the addon once its installed in the cluster. +type AddOnConfig struct { + bitmap_ uint32 + id string + href string + addOnEnvironmentVariables []*AddOnEnvironmentVariable + secretPropagations []*AddOnSecretPropagation +} + +// Kind returns the name of the type of the object. +func (o *AddOnConfig) Kind() string { + if o == nil { + return AddOnConfigNilKind + } + if o.bitmap_&1 != 0 { + return AddOnConfigLinkKind + } + return AddOnConfigKind +} + +// Link returns true iif this is a link. +func (o *AddOnConfig) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnConfig) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnConfig) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnConfig) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnConfig) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AddOnEnvironmentVariables returns the value of the 'add_on_environment_variables' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of environment variables for the addon +func (o *AddOnConfig) AddOnEnvironmentVariables() []*AddOnEnvironmentVariable { + if o != nil && o.bitmap_&8 != 0 { + return o.addOnEnvironmentVariables + } + return nil +} + +// GetAddOnEnvironmentVariables returns the value of the 'add_on_environment_variables' attribute and +// a flag indicating if the attribute has a value. +// +// List of environment variables for the addon +func (o *AddOnConfig) GetAddOnEnvironmentVariables() (value []*AddOnEnvironmentVariable, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.addOnEnvironmentVariables + } + return +} + +// SecretPropagations returns the value of the 'secret_propagations' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of secret propagations for the addon +func (o *AddOnConfig) SecretPropagations() []*AddOnSecretPropagation { + if o != nil && o.bitmap_&16 != 0 { + return o.secretPropagations + } + return nil +} + +// GetSecretPropagations returns the value of the 'secret_propagations' attribute and +// a flag indicating if the attribute has a value. +// +// List of secret propagations for the addon +func (o *AddOnConfig) GetSecretPropagations() (value []*AddOnSecretPropagation, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.secretPropagations + } + return +} + +// AddOnConfigListKind is the name of the type used to represent list of objects of +// type 'add_on_config'. +const AddOnConfigListKind = "AddOnConfigList" + +// AddOnConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_config'. +const AddOnConfigListLinkKind = "AddOnConfigListLink" + +// AddOnConfigNilKind is the name of the type used to nil lists of objects of +// type 'add_on_config'. +const AddOnConfigListNilKind = "AddOnConfigListNil" + +// AddOnConfigList is a list of values of the 'add_on_config' type. +type AddOnConfigList struct { + href string + link bool + items []*AddOnConfig +} + +// Kind returns the name of the type of the object. +func (l *AddOnConfigList) Kind() string { + if l == nil { + return AddOnConfigListNilKind + } + if l.link { + return AddOnConfigListLinkKind + } + return AddOnConfigListKind +} + +// Link returns true iif this is a link. +func (l *AddOnConfigList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnConfigList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnConfigList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnConfigList) Get(i int) *AddOnConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnConfigList) Slice() []*AddOnConfig { + var slice []*AddOnConfig + if l == nil { + slice = make([]*AddOnConfig, 0) + } else { + slice = make([]*AddOnConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnConfigList) Each(f func(item *AddOnConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnConfigList) Range(f func(index int, item *AddOnConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_config_type_json.go b/clustersmgmt/v2alpha1/add_on_config_type_json.go new file mode 100644 index 00000000..b7992d4b --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_config_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnConfig writes a value of the 'add_on_config' type to the given writer. +func MarshalAddOnConfig(object *AddOnConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnConfig writes a value of the 'add_on_config' type to the given stream. +func writeAddOnConfig(object *AddOnConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnConfigLinkKind) + } else { + stream.WriteString(AddOnConfigKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.addOnEnvironmentVariables != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("add_on_environment_variables") + writeAddOnEnvironmentVariableList(object.addOnEnvironmentVariables, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.secretPropagations != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("secret_propagations") + writeAddOnSecretPropagationList(object.secretPropagations, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnConfig reads a value of the 'add_on_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnConfig(source interface{}) (object *AddOnConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnConfig(iterator) + err = iterator.Error + return +} + +// readAddOnConfig reads a value of the 'add_on_config' type from the given iterator. +func readAddOnConfig(iterator *jsoniter.Iterator) *AddOnConfig { + object := &AddOnConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnConfigLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "add_on_environment_variables": + value := readAddOnEnvironmentVariableList(iterator) + object.addOnEnvironmentVariables = value + object.bitmap_ |= 8 + case "secret_propagations": + value := readAddOnSecretPropagationList(iterator) + object.secretPropagations = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_environment_variable_builder.go b/clustersmgmt/v2alpha1/add_on_environment_variable_builder.go new file mode 100644 index 00000000..80266aba --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_environment_variable_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnEnvironmentVariableBuilder contains the data and logic needed to build 'add_on_environment_variable' objects. +// +// Representation of an add-on env object. +type AddOnEnvironmentVariableBuilder struct { + bitmap_ uint32 + id string + href string + name string + value string +} + +// NewAddOnEnvironmentVariable creates a new builder of 'add_on_environment_variable' objects. +func NewAddOnEnvironmentVariable() *AddOnEnvironmentVariableBuilder { + return &AddOnEnvironmentVariableBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnEnvironmentVariableBuilder) Link(value bool) *AddOnEnvironmentVariableBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnEnvironmentVariableBuilder) ID(value string) *AddOnEnvironmentVariableBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnEnvironmentVariableBuilder) HREF(value string) *AddOnEnvironmentVariableBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnEnvironmentVariableBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AddOnEnvironmentVariableBuilder) Name(value string) *AddOnEnvironmentVariableBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *AddOnEnvironmentVariableBuilder) Value(value string) *AddOnEnvironmentVariableBuilder { + b.value = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnEnvironmentVariableBuilder) Copy(object *AddOnEnvironmentVariable) *AddOnEnvironmentVariableBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.name = object.name + b.value = object.value + return b +} + +// Build creates a 'add_on_environment_variable' object using the configuration stored in the builder. +func (b *AddOnEnvironmentVariableBuilder) Build() (object *AddOnEnvironmentVariable, err error) { + object = new(AddOnEnvironmentVariable) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.name = b.name + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/add_on_environment_variable_list_builder.go b/clustersmgmt/v2alpha1/add_on_environment_variable_list_builder.go new file mode 100644 index 00000000..a3886a3f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_environment_variable_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnEnvironmentVariableListBuilder contains the data and logic needed to build +// 'add_on_environment_variable' objects. +type AddOnEnvironmentVariableListBuilder struct { + items []*AddOnEnvironmentVariableBuilder +} + +// NewAddOnEnvironmentVariableList creates a new builder of 'add_on_environment_variable' objects. +func NewAddOnEnvironmentVariableList() *AddOnEnvironmentVariableListBuilder { + return new(AddOnEnvironmentVariableListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnEnvironmentVariableListBuilder) Items(values ...*AddOnEnvironmentVariableBuilder) *AddOnEnvironmentVariableListBuilder { + b.items = make([]*AddOnEnvironmentVariableBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnEnvironmentVariableListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnEnvironmentVariableListBuilder) Copy(list *AddOnEnvironmentVariableList) *AddOnEnvironmentVariableListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnEnvironmentVariableBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnEnvironmentVariable().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_environment_variable' objects using the +// configuration stored in the builder. +func (b *AddOnEnvironmentVariableListBuilder) Build() (list *AddOnEnvironmentVariableList, err error) { + items := make([]*AddOnEnvironmentVariable, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnEnvironmentVariableList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_environment_variable_list_type_json.go b/clustersmgmt/v2alpha1/add_on_environment_variable_list_type_json.go new file mode 100644 index 00000000..8212e9d3 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_environment_variable_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnEnvironmentVariableList writes a list of values of the 'add_on_environment_variable' type to +// the given writer. +func MarshalAddOnEnvironmentVariableList(list []*AddOnEnvironmentVariable, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnEnvironmentVariableList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnEnvironmentVariableList writes a list of value of the 'add_on_environment_variable' type to +// the given stream. +func writeAddOnEnvironmentVariableList(list []*AddOnEnvironmentVariable, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnEnvironmentVariable(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnEnvironmentVariableList reads a list of values of the 'add_on_environment_variable' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnEnvironmentVariableList(source interface{}) (items []*AddOnEnvironmentVariable, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnEnvironmentVariableList(iterator) + err = iterator.Error + return +} + +// readAddOnEnvironmentVariableList reads list of values of the ”add_on_environment_variable' type from +// the given iterator. +func readAddOnEnvironmentVariableList(iterator *jsoniter.Iterator) []*AddOnEnvironmentVariable { + list := []*AddOnEnvironmentVariable{} + for iterator.ReadArray() { + item := readAddOnEnvironmentVariable(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_environment_variable_type.go b/clustersmgmt/v2alpha1/add_on_environment_variable_type.go new file mode 100644 index 00000000..78f1e68f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_environment_variable_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnEnvironmentVariableKind is the name of the type used to represent objects +// of type 'add_on_environment_variable'. +const AddOnEnvironmentVariableKind = "AddOnEnvironmentVariable" + +// AddOnEnvironmentVariableLinkKind is the name of the type used to represent links +// to objects of type 'add_on_environment_variable'. +const AddOnEnvironmentVariableLinkKind = "AddOnEnvironmentVariableLink" + +// AddOnEnvironmentVariableNilKind is the name of the type used to nil references +// to objects of type 'add_on_environment_variable'. +const AddOnEnvironmentVariableNilKind = "AddOnEnvironmentVariableNil" + +// AddOnEnvironmentVariable represents the values of the 'add_on_environment_variable' type. +// +// Representation of an add-on env object. +type AddOnEnvironmentVariable struct { + bitmap_ uint32 + id string + href string + name string + value string +} + +// Kind returns the name of the type of the object. +func (o *AddOnEnvironmentVariable) Kind() string { + if o == nil { + return AddOnEnvironmentVariableNilKind + } + if o.bitmap_&1 != 0 { + return AddOnEnvironmentVariableLinkKind + } + return AddOnEnvironmentVariableKind +} + +// Link returns true iif this is a link. +func (o *AddOnEnvironmentVariable) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnEnvironmentVariable) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnEnvironmentVariable) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnEnvironmentVariable) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnEnvironmentVariable) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnEnvironmentVariable) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the env object. +func (o *AddOnEnvironmentVariable) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the env object. +func (o *AddOnEnvironmentVariable) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Value of the env object. +func (o *AddOnEnvironmentVariable) Value() string { + if o != nil && o.bitmap_&16 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// Value of the env object. +func (o *AddOnEnvironmentVariable) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.value + } + return +} + +// AddOnEnvironmentVariableListKind is the name of the type used to represent list of objects of +// type 'add_on_environment_variable'. +const AddOnEnvironmentVariableListKind = "AddOnEnvironmentVariableList" + +// AddOnEnvironmentVariableListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_environment_variable'. +const AddOnEnvironmentVariableListLinkKind = "AddOnEnvironmentVariableListLink" + +// AddOnEnvironmentVariableNilKind is the name of the type used to nil lists of objects of +// type 'add_on_environment_variable'. +const AddOnEnvironmentVariableListNilKind = "AddOnEnvironmentVariableListNil" + +// AddOnEnvironmentVariableList is a list of values of the 'add_on_environment_variable' type. +type AddOnEnvironmentVariableList struct { + href string + link bool + items []*AddOnEnvironmentVariable +} + +// Kind returns the name of the type of the object. +func (l *AddOnEnvironmentVariableList) Kind() string { + if l == nil { + return AddOnEnvironmentVariableListNilKind + } + if l.link { + return AddOnEnvironmentVariableListLinkKind + } + return AddOnEnvironmentVariableListKind +} + +// Link returns true iif this is a link. +func (l *AddOnEnvironmentVariableList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnEnvironmentVariableList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnEnvironmentVariableList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnEnvironmentVariableList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnEnvironmentVariableList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnEnvironmentVariableList) Get(i int) *AddOnEnvironmentVariable { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnEnvironmentVariableList) Slice() []*AddOnEnvironmentVariable { + var slice []*AddOnEnvironmentVariable + if l == nil { + slice = make([]*AddOnEnvironmentVariable, 0) + } else { + slice = make([]*AddOnEnvironmentVariable, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnEnvironmentVariableList) Each(f func(item *AddOnEnvironmentVariable) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnEnvironmentVariableList) Range(f func(index int, item *AddOnEnvironmentVariable) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_environment_variable_type_json.go b/clustersmgmt/v2alpha1/add_on_environment_variable_type_json.go new file mode 100644 index 00000000..ecfc560e --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_environment_variable_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnEnvironmentVariable writes a value of the 'add_on_environment_variable' type to the given writer. +func MarshalAddOnEnvironmentVariable(object *AddOnEnvironmentVariable, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnEnvironmentVariable(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnEnvironmentVariable writes a value of the 'add_on_environment_variable' type to the given stream. +func writeAddOnEnvironmentVariable(object *AddOnEnvironmentVariable, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnEnvironmentVariableLinkKind) + } else { + stream.WriteString(AddOnEnvironmentVariableKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnEnvironmentVariable reads a value of the 'add_on_environment_variable' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnEnvironmentVariable(source interface{}) (object *AddOnEnvironmentVariable, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnEnvironmentVariable(iterator) + err = iterator.Error + return +} + +// readAddOnEnvironmentVariable reads a value of the 'add_on_environment_variable' type from the given iterator. +func readAddOnEnvironmentVariable(iterator *jsoniter.Iterator) *AddOnEnvironmentVariable { + object := &AddOnEnvironmentVariable{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnEnvironmentVariableLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_install_mode_list_type_json.go b/clustersmgmt/v2alpha1/add_on_install_mode_list_type_json.go new file mode 100644 index 00000000..c04061bf --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_install_mode_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallModeList writes a list of values of the 'add_on_install_mode' type to +// the given writer. +func MarshalAddOnInstallModeList(list []AddOnInstallMode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallModeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallModeList writes a list of value of the 'add_on_install_mode' type to +// the given stream. +func writeAddOnInstallModeList(list []AddOnInstallMode, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnInstallModeList reads a list of values of the 'add_on_install_mode' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnInstallModeList(source interface{}) (items []AddOnInstallMode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnInstallModeList(iterator) + err = iterator.Error + return +} + +// readAddOnInstallModeList reads list of values of the ”add_on_install_mode' type from +// the given iterator. +func readAddOnInstallModeList(iterator *jsoniter.Iterator) []AddOnInstallMode { + list := []AddOnInstallMode{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := AddOnInstallMode(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_install_mode_type.go b/clustersmgmt/v2alpha1/add_on_install_mode_type.go new file mode 100644 index 00000000..9008e4e2 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_install_mode_type.go @@ -0,0 +1,32 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallMode represents the values of the 'add_on_install_mode' enumerated type. +type AddOnInstallMode string + +const ( + // This mode means that the addon is deployed in all namespaces. + // However, the addon status is retrieved from the target namespace + AddOnInstallModeAllNamespaces AddOnInstallMode = "all_namespaces" + // This mode means that the the addon CRD exists in a single specific namespace. + // This namespace is reflected by the TargetNamespace addon field + AddOnInstallModeOwnNamespace AddOnInstallMode = "own_namespace" +) diff --git a/clustersmgmt/v2alpha1/add_on_installation_billing_builder.go b/clustersmgmt/v2alpha1/add_on_installation_billing_builder.go new file mode 100644 index 00000000..269cafa3 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_billing_builder.go @@ -0,0 +1,101 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationBillingBuilder contains the data and logic needed to build 'add_on_installation_billing' objects. +// +// Representation of an add-on installation billing. +type AddOnInstallationBillingBuilder struct { + bitmap_ uint32 + id string + href string + billingMarketplaceAccount string + billingModel BillingModel +} + +// NewAddOnInstallationBilling creates a new builder of 'add_on_installation_billing' objects. +func NewAddOnInstallationBilling() *AddOnInstallationBillingBuilder { + return &AddOnInstallationBillingBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnInstallationBillingBuilder) Link(value bool) *AddOnInstallationBillingBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnInstallationBillingBuilder) ID(value string) *AddOnInstallationBillingBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnInstallationBillingBuilder) HREF(value string) *AddOnInstallationBillingBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnInstallationBillingBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// BillingMarketplaceAccount sets the value of the 'billing_marketplace_account' attribute to the given value. +func (b *AddOnInstallationBillingBuilder) BillingMarketplaceAccount(value string) *AddOnInstallationBillingBuilder { + b.billingMarketplaceAccount = value + b.bitmap_ |= 8 + return b +} + +// BillingModel sets the value of the 'billing_model' attribute to the given value. +// +// Billing model for cluster resources. +func (b *AddOnInstallationBillingBuilder) BillingModel(value BillingModel) *AddOnInstallationBillingBuilder { + b.billingModel = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnInstallationBillingBuilder) Copy(object *AddOnInstallationBilling) *AddOnInstallationBillingBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.billingMarketplaceAccount = object.billingMarketplaceAccount + b.billingModel = object.billingModel + return b +} + +// Build creates a 'add_on_installation_billing' object using the configuration stored in the builder. +func (b *AddOnInstallationBillingBuilder) Build() (object *AddOnInstallationBilling, err error) { + object = new(AddOnInstallationBilling) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.billingMarketplaceAccount = b.billingMarketplaceAccount + object.billingModel = b.billingModel + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_billing_list_builder.go b/clustersmgmt/v2alpha1/add_on_installation_billing_list_builder.go new file mode 100644 index 00000000..1ec7bb94 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_billing_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationBillingListBuilder contains the data and logic needed to build +// 'add_on_installation_billing' objects. +type AddOnInstallationBillingListBuilder struct { + items []*AddOnInstallationBillingBuilder +} + +// NewAddOnInstallationBillingList creates a new builder of 'add_on_installation_billing' objects. +func NewAddOnInstallationBillingList() *AddOnInstallationBillingListBuilder { + return new(AddOnInstallationBillingListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnInstallationBillingListBuilder) Items(values ...*AddOnInstallationBillingBuilder) *AddOnInstallationBillingListBuilder { + b.items = make([]*AddOnInstallationBillingBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnInstallationBillingListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnInstallationBillingListBuilder) Copy(list *AddOnInstallationBillingList) *AddOnInstallationBillingListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnInstallationBillingBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnInstallationBilling().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_installation_billing' objects using the +// configuration stored in the builder. +func (b *AddOnInstallationBillingListBuilder) Build() (list *AddOnInstallationBillingList, err error) { + items := make([]*AddOnInstallationBilling, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnInstallationBillingList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_billing_list_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_billing_list_type_json.go new file mode 100644 index 00000000..1c021eef --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_billing_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallationBillingList writes a list of values of the 'add_on_installation_billing' type to +// the given writer. +func MarshalAddOnInstallationBillingList(list []*AddOnInstallationBilling, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallationBillingList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallationBillingList writes a list of value of the 'add_on_installation_billing' type to +// the given stream. +func writeAddOnInstallationBillingList(list []*AddOnInstallationBilling, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnInstallationBilling(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnInstallationBillingList reads a list of values of the 'add_on_installation_billing' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnInstallationBillingList(source interface{}) (items []*AddOnInstallationBilling, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnInstallationBillingList(iterator) + err = iterator.Error + return +} + +// readAddOnInstallationBillingList reads list of values of the ”add_on_installation_billing' type from +// the given iterator. +func readAddOnInstallationBillingList(iterator *jsoniter.Iterator) []*AddOnInstallationBilling { + list := []*AddOnInstallationBilling{} + for iterator.ReadArray() { + item := readAddOnInstallationBilling(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_billing_type.go b/clustersmgmt/v2alpha1/add_on_installation_billing_type.go new file mode 100644 index 00000000..89ed3be3 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_billing_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationBillingKind is the name of the type used to represent objects +// of type 'add_on_installation_billing'. +const AddOnInstallationBillingKind = "AddOnInstallationBilling" + +// AddOnInstallationBillingLinkKind is the name of the type used to represent links +// to objects of type 'add_on_installation_billing'. +const AddOnInstallationBillingLinkKind = "AddOnInstallationBillingLink" + +// AddOnInstallationBillingNilKind is the name of the type used to nil references +// to objects of type 'add_on_installation_billing'. +const AddOnInstallationBillingNilKind = "AddOnInstallationBillingNil" + +// AddOnInstallationBilling represents the values of the 'add_on_installation_billing' type. +// +// Representation of an add-on installation billing. +type AddOnInstallationBilling struct { + bitmap_ uint32 + id string + href string + billingMarketplaceAccount string + billingModel BillingModel +} + +// Kind returns the name of the type of the object. +func (o *AddOnInstallationBilling) Kind() string { + if o == nil { + return AddOnInstallationBillingNilKind + } + if o.bitmap_&1 != 0 { + return AddOnInstallationBillingLinkKind + } + return AddOnInstallationBillingKind +} + +// Link returns true iif this is a link. +func (o *AddOnInstallationBilling) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnInstallationBilling) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnInstallationBilling) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnInstallationBilling) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnInstallationBilling) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnInstallationBilling) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// BillingMarketplaceAccount returns the value of the 'billing_marketplace_account' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Account ID for billing market place +func (o *AddOnInstallationBilling) BillingMarketplaceAccount() string { + if o != nil && o.bitmap_&8 != 0 { + return o.billingMarketplaceAccount + } + return "" +} + +// GetBillingMarketplaceAccount returns the value of the 'billing_marketplace_account' attribute and +// a flag indicating if the attribute has a value. +// +// Account ID for billing market place +func (o *AddOnInstallationBilling) GetBillingMarketplaceAccount() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.billingMarketplaceAccount + } + return +} + +// BillingModel returns the value of the 'billing_model' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Billing Model for addon resources +func (o *AddOnInstallationBilling) BillingModel() BillingModel { + if o != nil && o.bitmap_&16 != 0 { + return o.billingModel + } + return BillingModel("") +} + +// GetBillingModel returns the value of the 'billing_model' attribute and +// a flag indicating if the attribute has a value. +// +// Billing Model for addon resources +func (o *AddOnInstallationBilling) GetBillingModel() (value BillingModel, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.billingModel + } + return +} + +// AddOnInstallationBillingListKind is the name of the type used to represent list of objects of +// type 'add_on_installation_billing'. +const AddOnInstallationBillingListKind = "AddOnInstallationBillingList" + +// AddOnInstallationBillingListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_installation_billing'. +const AddOnInstallationBillingListLinkKind = "AddOnInstallationBillingListLink" + +// AddOnInstallationBillingNilKind is the name of the type used to nil lists of objects of +// type 'add_on_installation_billing'. +const AddOnInstallationBillingListNilKind = "AddOnInstallationBillingListNil" + +// AddOnInstallationBillingList is a list of values of the 'add_on_installation_billing' type. +type AddOnInstallationBillingList struct { + href string + link bool + items []*AddOnInstallationBilling +} + +// Kind returns the name of the type of the object. +func (l *AddOnInstallationBillingList) Kind() string { + if l == nil { + return AddOnInstallationBillingListNilKind + } + if l.link { + return AddOnInstallationBillingListLinkKind + } + return AddOnInstallationBillingListKind +} + +// Link returns true iif this is a link. +func (l *AddOnInstallationBillingList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnInstallationBillingList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnInstallationBillingList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnInstallationBillingList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnInstallationBillingList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnInstallationBillingList) Get(i int) *AddOnInstallationBilling { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnInstallationBillingList) Slice() []*AddOnInstallationBilling { + var slice []*AddOnInstallationBilling + if l == nil { + slice = make([]*AddOnInstallationBilling, 0) + } else { + slice = make([]*AddOnInstallationBilling, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnInstallationBillingList) Each(f func(item *AddOnInstallationBilling) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnInstallationBillingList) Range(f func(index int, item *AddOnInstallationBilling) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_billing_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_billing_type_json.go new file mode 100644 index 00000000..cca6d8dc --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_billing_type_json.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallationBilling writes a value of the 'add_on_installation_billing' type to the given writer. +func MarshalAddOnInstallationBilling(object *AddOnInstallationBilling, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallationBilling(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallationBilling writes a value of the 'add_on_installation_billing' type to the given stream. +func writeAddOnInstallationBilling(object *AddOnInstallationBilling, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnInstallationBillingLinkKind) + } else { + stream.WriteString(AddOnInstallationBillingKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing_marketplace_account") + stream.WriteString(object.billingMarketplaceAccount) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing_model") + stream.WriteString(string(object.billingModel)) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnInstallationBilling reads a value of the 'add_on_installation_billing' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnInstallationBilling(source interface{}) (object *AddOnInstallationBilling, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnInstallationBilling(iterator) + err = iterator.Error + return +} + +// readAddOnInstallationBilling reads a value of the 'add_on_installation_billing' type from the given iterator. +func readAddOnInstallationBilling(iterator *jsoniter.Iterator) *AddOnInstallationBilling { + object := &AddOnInstallationBilling{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnInstallationBillingLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "billing_marketplace_account": + value := iterator.ReadString() + object.billingMarketplaceAccount = value + object.bitmap_ |= 8 + case "billing_model": + text := iterator.ReadString() + value := BillingModel(text) + object.billingModel = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_builder.go b/clustersmgmt/v2alpha1/add_on_installation_builder.go new file mode 100644 index 00000000..c6cd247f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_builder.go @@ -0,0 +1,229 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// AddOnInstallationBuilder contains the data and logic needed to build 'add_on_installation' objects. +// +// Representation of an add-on installation in a cluster. +type AddOnInstallationBuilder struct { + bitmap_ uint32 + id string + href string + addon *AddOnBuilder + addonVersion *AddOnVersionBuilder + billing *AddOnInstallationBillingBuilder + creationTimestamp time.Time + operatorVersion string + parameters *AddOnInstallationParameterListBuilder + state AddOnInstallationState + stateDescription string + updatedTimestamp time.Time +} + +// NewAddOnInstallation creates a new builder of 'add_on_installation' objects. +func NewAddOnInstallation() *AddOnInstallationBuilder { + return &AddOnInstallationBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnInstallationBuilder) Link(value bool) *AddOnInstallationBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnInstallationBuilder) ID(value string) *AddOnInstallationBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnInstallationBuilder) HREF(value string) *AddOnInstallationBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnInstallationBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Addon sets the value of the 'addon' attribute to the given value. +// +// Representation of an add-on that can be installed in a cluster. +func (b *AddOnInstallationBuilder) Addon(value *AddOnBuilder) *AddOnInstallationBuilder { + b.addon = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// AddonVersion sets the value of the 'addon_version' attribute to the given value. +// +// Representation of an add-on version. +func (b *AddOnInstallationBuilder) AddonVersion(value *AddOnVersionBuilder) *AddOnInstallationBuilder { + b.addonVersion = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Billing sets the value of the 'billing' attribute to the given value. +// +// Representation of an add-on installation billing. +func (b *AddOnInstallationBuilder) Billing(value *AddOnInstallationBillingBuilder) *AddOnInstallationBuilder { + b.billing = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *AddOnInstallationBuilder) CreationTimestamp(value time.Time) *AddOnInstallationBuilder { + b.creationTimestamp = value + b.bitmap_ |= 64 + return b +} + +// OperatorVersion sets the value of the 'operator_version' attribute to the given value. +func (b *AddOnInstallationBuilder) OperatorVersion(value string) *AddOnInstallationBuilder { + b.operatorVersion = value + b.bitmap_ |= 128 + return b +} + +// Parameters sets the value of the 'parameters' attribute to the given values. +func (b *AddOnInstallationBuilder) Parameters(value *AddOnInstallationParameterListBuilder) *AddOnInstallationBuilder { + b.parameters = value + b.bitmap_ |= 256 + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// Representation of an add-on installation State field. +func (b *AddOnInstallationBuilder) State(value AddOnInstallationState) *AddOnInstallationBuilder { + b.state = value + b.bitmap_ |= 512 + return b +} + +// StateDescription sets the value of the 'state_description' attribute to the given value. +func (b *AddOnInstallationBuilder) StateDescription(value string) *AddOnInstallationBuilder { + b.stateDescription = value + b.bitmap_ |= 1024 + return b +} + +// UpdatedTimestamp sets the value of the 'updated_timestamp' attribute to the given value. +func (b *AddOnInstallationBuilder) UpdatedTimestamp(value time.Time) *AddOnInstallationBuilder { + b.updatedTimestamp = value + b.bitmap_ |= 2048 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnInstallationBuilder) Copy(object *AddOnInstallation) *AddOnInstallationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.addon != nil { + b.addon = NewAddOn().Copy(object.addon) + } else { + b.addon = nil + } + if object.addonVersion != nil { + b.addonVersion = NewAddOnVersion().Copy(object.addonVersion) + } else { + b.addonVersion = nil + } + if object.billing != nil { + b.billing = NewAddOnInstallationBilling().Copy(object.billing) + } else { + b.billing = nil + } + b.creationTimestamp = object.creationTimestamp + b.operatorVersion = object.operatorVersion + if object.parameters != nil { + b.parameters = NewAddOnInstallationParameterList().Copy(object.parameters) + } else { + b.parameters = nil + } + b.state = object.state + b.stateDescription = object.stateDescription + b.updatedTimestamp = object.updatedTimestamp + return b +} + +// Build creates a 'add_on_installation' object using the configuration stored in the builder. +func (b *AddOnInstallationBuilder) Build() (object *AddOnInstallation, err error) { + object = new(AddOnInstallation) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.addon != nil { + object.addon, err = b.addon.Build() + if err != nil { + return + } + } + if b.addonVersion != nil { + object.addonVersion, err = b.addonVersion.Build() + if err != nil { + return + } + } + if b.billing != nil { + object.billing, err = b.billing.Build() + if err != nil { + return + } + } + object.creationTimestamp = b.creationTimestamp + object.operatorVersion = b.operatorVersion + if b.parameters != nil { + object.parameters, err = b.parameters.Build() + if err != nil { + return + } + } + object.state = b.state + object.stateDescription = b.stateDescription + object.updatedTimestamp = b.updatedTimestamp + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_client.go b/clustersmgmt/v2alpha1/add_on_installation_client.go new file mode 100644 index 00000000..c0e86224 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddOnInstallationClient is the client of the 'add_on_installation' resource. +// +// Manages a specific add-on installation. +type AddOnInstallationClient struct { + transport http.RoundTripper + path string +} + +// NewAddOnInstallationClient creates a new client for the 'add_on_installation' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddOnInstallationClient(transport http.RoundTripper, path string) *AddOnInstallationClient { + return &AddOnInstallationClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Delete an add-on installation and remove it from the collection of add-on installations on the cluster. +func (c *AddOnInstallationClient) Delete() *AddOnInstallationDeleteRequest { + return &AddOnInstallationDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the add-on installation. +func (c *AddOnInstallationClient) Get() *AddOnInstallationGetRequest { + return &AddOnInstallationGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the add-on installation. +func (c *AddOnInstallationClient) Update() *AddOnInstallationUpdateRequest { + return &AddOnInstallationUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// AddOnInstallationPollRequest is the request for the Poll method. +type AddOnInstallationPollRequest struct { + request *AddOnInstallationGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AddOnInstallationPollRequest) Parameter(name string, value interface{}) *AddOnInstallationPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AddOnInstallationPollRequest) Header(name string, value interface{}) *AddOnInstallationPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AddOnInstallationPollRequest) Interval(value time.Duration) *AddOnInstallationPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AddOnInstallationPollRequest) Status(value int) *AddOnInstallationPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AddOnInstallationPollRequest) Predicate(value func(*AddOnInstallationGetResponse) bool) *AddOnInstallationPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AddOnInstallationGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AddOnInstallationPollRequest) StartContext(ctx context.Context) (response *AddOnInstallationPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AddOnInstallationPollResponse{ + response: result.(*AddOnInstallationGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AddOnInstallationPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AddOnInstallationPollResponse is the response for the Poll method. +type AddOnInstallationPollResponse struct { + response *AddOnInstallationGetResponse +} + +// Status returns the response status code. +func (r *AddOnInstallationPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AddOnInstallationPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AddOnInstallationPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnInstallationPollResponse) Body() *AddOnInstallation { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnInstallationPollResponse) GetBody() (value *AddOnInstallation, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AddOnInstallationClient) Poll() *AddOnInstallationPollRequest { + return &AddOnInstallationPollRequest{ + request: c.Get(), + } +} + +// AddOnInstallationDeleteRequest is the request for the 'delete' method. +type AddOnInstallationDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddOnInstallationDeleteRequest) Parameter(name string, value interface{}) *AddOnInstallationDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnInstallationDeleteRequest) Header(name string, value interface{}) *AddOnInstallationDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnInstallationDeleteRequest) Impersonate(user string) *AddOnInstallationDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnInstallationDeleteRequest) Send() (result *AddOnInstallationDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnInstallationDeleteRequest) SendContext(ctx context.Context) (result *AddOnInstallationDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnInstallationDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// AddOnInstallationDeleteResponse is the response for the 'delete' method. +type AddOnInstallationDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *AddOnInstallationDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnInstallationDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnInstallationDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AddOnInstallationGetRequest is the request for the 'get' method. +type AddOnInstallationGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddOnInstallationGetRequest) Parameter(name string, value interface{}) *AddOnInstallationGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnInstallationGetRequest) Header(name string, value interface{}) *AddOnInstallationGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnInstallationGetRequest) Impersonate(user string) *AddOnInstallationGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnInstallationGetRequest) Send() (result *AddOnInstallationGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnInstallationGetRequest) SendContext(ctx context.Context) (result *AddOnInstallationGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnInstallationGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnInstallationGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnInstallationGetResponse is the response for the 'get' method. +type AddOnInstallationGetResponse struct { + status int + header http.Header + err *errors.Error + body *AddOnInstallation +} + +// Status returns the response status code. +func (r *AddOnInstallationGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnInstallationGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnInstallationGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnInstallationGetResponse) Body() *AddOnInstallation { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnInstallationGetResponse) GetBody() (value *AddOnInstallation, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddOnInstallationUpdateRequest is the request for the 'update' method. +type AddOnInstallationUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddOnInstallation +} + +// Parameter adds a query parameter. +func (r *AddOnInstallationUpdateRequest) Parameter(name string, value interface{}) *AddOnInstallationUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnInstallationUpdateRequest) Header(name string, value interface{}) *AddOnInstallationUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnInstallationUpdateRequest) Impersonate(user string) *AddOnInstallationUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *AddOnInstallationUpdateRequest) Body(value *AddOnInstallation) *AddOnInstallationUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnInstallationUpdateRequest) Send() (result *AddOnInstallationUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnInstallationUpdateRequest) SendContext(ctx context.Context) (result *AddOnInstallationUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddOnInstallationUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnInstallationUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnInstallationUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnInstallationUpdateResponse is the response for the 'update' method. +type AddOnInstallationUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *AddOnInstallation +} + +// Status returns the response status code. +func (r *AddOnInstallationUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnInstallationUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnInstallationUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnInstallationUpdateResponse) Body() *AddOnInstallation { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnInstallationUpdateResponse) GetBody() (value *AddOnInstallation, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_list_builder.go b/clustersmgmt/v2alpha1/add_on_installation_list_builder.go new file mode 100644 index 00000000..dc47f383 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationListBuilder contains the data and logic needed to build +// 'add_on_installation' objects. +type AddOnInstallationListBuilder struct { + items []*AddOnInstallationBuilder +} + +// NewAddOnInstallationList creates a new builder of 'add_on_installation' objects. +func NewAddOnInstallationList() *AddOnInstallationListBuilder { + return new(AddOnInstallationListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnInstallationListBuilder) Items(values ...*AddOnInstallationBuilder) *AddOnInstallationListBuilder { + b.items = make([]*AddOnInstallationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnInstallationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnInstallationListBuilder) Copy(list *AddOnInstallationList) *AddOnInstallationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnInstallationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnInstallation().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_installation' objects using the +// configuration stored in the builder. +func (b *AddOnInstallationListBuilder) Build() (list *AddOnInstallationList, err error) { + items := make([]*AddOnInstallation, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnInstallationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_list_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_list_type_json.go new file mode 100644 index 00000000..13d5565b --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallationList writes a list of values of the 'add_on_installation' type to +// the given writer. +func MarshalAddOnInstallationList(list []*AddOnInstallation, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallationList writes a list of value of the 'add_on_installation' type to +// the given stream. +func writeAddOnInstallationList(list []*AddOnInstallation, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnInstallation(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnInstallationList reads a list of values of the 'add_on_installation' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnInstallationList(source interface{}) (items []*AddOnInstallation, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnInstallationList(iterator) + err = iterator.Error + return +} + +// readAddOnInstallationList reads list of values of the ”add_on_installation' type from +// the given iterator. +func readAddOnInstallationList(iterator *jsoniter.Iterator) []*AddOnInstallation { + list := []*AddOnInstallation{} + for iterator.ReadArray() { + item := readAddOnInstallation(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_parameter_builder.go b/clustersmgmt/v2alpha1/add_on_installation_parameter_builder.go new file mode 100644 index 00000000..f82149c6 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_parameter_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationParameterBuilder contains the data and logic needed to build 'add_on_installation_parameter' objects. +// +// Representation of an add-on installation parameter. +type AddOnInstallationParameterBuilder struct { + bitmap_ uint32 + id string + href string + value string +} + +// NewAddOnInstallationParameter creates a new builder of 'add_on_installation_parameter' objects. +func NewAddOnInstallationParameter() *AddOnInstallationParameterBuilder { + return &AddOnInstallationParameterBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnInstallationParameterBuilder) Link(value bool) *AddOnInstallationParameterBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnInstallationParameterBuilder) ID(value string) *AddOnInstallationParameterBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnInstallationParameterBuilder) HREF(value string) *AddOnInstallationParameterBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnInstallationParameterBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *AddOnInstallationParameterBuilder) Value(value string) *AddOnInstallationParameterBuilder { + b.value = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnInstallationParameterBuilder) Copy(object *AddOnInstallationParameter) *AddOnInstallationParameterBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.value = object.value + return b +} + +// Build creates a 'add_on_installation_parameter' object using the configuration stored in the builder. +func (b *AddOnInstallationParameterBuilder) Build() (object *AddOnInstallationParameter, err error) { + object = new(AddOnInstallationParameter) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_parameter_list_builder.go b/clustersmgmt/v2alpha1/add_on_installation_parameter_list_builder.go new file mode 100644 index 00000000..e31eddc2 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_parameter_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationParameterListBuilder contains the data and logic needed to build +// 'add_on_installation_parameter' objects. +type AddOnInstallationParameterListBuilder struct { + items []*AddOnInstallationParameterBuilder +} + +// NewAddOnInstallationParameterList creates a new builder of 'add_on_installation_parameter' objects. +func NewAddOnInstallationParameterList() *AddOnInstallationParameterListBuilder { + return new(AddOnInstallationParameterListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnInstallationParameterListBuilder) Items(values ...*AddOnInstallationParameterBuilder) *AddOnInstallationParameterListBuilder { + b.items = make([]*AddOnInstallationParameterBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnInstallationParameterListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnInstallationParameterListBuilder) Copy(list *AddOnInstallationParameterList) *AddOnInstallationParameterListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnInstallationParameterBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnInstallationParameter().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_installation_parameter' objects using the +// configuration stored in the builder. +func (b *AddOnInstallationParameterListBuilder) Build() (list *AddOnInstallationParameterList, err error) { + items := make([]*AddOnInstallationParameter, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnInstallationParameterList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_parameter_list_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_parameter_list_type_json.go new file mode 100644 index 00000000..d8b08b80 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_parameter_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallationParameterList writes a list of values of the 'add_on_installation_parameter' type to +// the given writer. +func MarshalAddOnInstallationParameterList(list []*AddOnInstallationParameter, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallationParameterList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallationParameterList writes a list of value of the 'add_on_installation_parameter' type to +// the given stream. +func writeAddOnInstallationParameterList(list []*AddOnInstallationParameter, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnInstallationParameter(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnInstallationParameterList reads a list of values of the 'add_on_installation_parameter' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnInstallationParameterList(source interface{}) (items []*AddOnInstallationParameter, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnInstallationParameterList(iterator) + err = iterator.Error + return +} + +// readAddOnInstallationParameterList reads list of values of the ”add_on_installation_parameter' type from +// the given iterator. +func readAddOnInstallationParameterList(iterator *jsoniter.Iterator) []*AddOnInstallationParameter { + list := []*AddOnInstallationParameter{} + for iterator.ReadArray() { + item := readAddOnInstallationParameter(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_parameter_type.go b/clustersmgmt/v2alpha1/add_on_installation_parameter_type.go new file mode 100644 index 00000000..db072e17 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_parameter_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationParameterKind is the name of the type used to represent objects +// of type 'add_on_installation_parameter'. +const AddOnInstallationParameterKind = "AddOnInstallationParameter" + +// AddOnInstallationParameterLinkKind is the name of the type used to represent links +// to objects of type 'add_on_installation_parameter'. +const AddOnInstallationParameterLinkKind = "AddOnInstallationParameterLink" + +// AddOnInstallationParameterNilKind is the name of the type used to nil references +// to objects of type 'add_on_installation_parameter'. +const AddOnInstallationParameterNilKind = "AddOnInstallationParameterNil" + +// AddOnInstallationParameter represents the values of the 'add_on_installation_parameter' type. +// +// Representation of an add-on installation parameter. +type AddOnInstallationParameter struct { + bitmap_ uint32 + id string + href string + value string +} + +// Kind returns the name of the type of the object. +func (o *AddOnInstallationParameter) Kind() string { + if o == nil { + return AddOnInstallationParameterNilKind + } + if o.bitmap_&1 != 0 { + return AddOnInstallationParameterLinkKind + } + return AddOnInstallationParameterKind +} + +// Link returns true iif this is a link. +func (o *AddOnInstallationParameter) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnInstallationParameter) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnInstallationParameter) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnInstallationParameter) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnInstallationParameter) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnInstallationParameter) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Value of the parameter. +func (o *AddOnInstallationParameter) Value() string { + if o != nil && o.bitmap_&8 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// Value of the parameter. +func (o *AddOnInstallationParameter) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.value + } + return +} + +// AddOnInstallationParameterListKind is the name of the type used to represent list of objects of +// type 'add_on_installation_parameter'. +const AddOnInstallationParameterListKind = "AddOnInstallationParameterList" + +// AddOnInstallationParameterListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_installation_parameter'. +const AddOnInstallationParameterListLinkKind = "AddOnInstallationParameterListLink" + +// AddOnInstallationParameterNilKind is the name of the type used to nil lists of objects of +// type 'add_on_installation_parameter'. +const AddOnInstallationParameterListNilKind = "AddOnInstallationParameterListNil" + +// AddOnInstallationParameterList is a list of values of the 'add_on_installation_parameter' type. +type AddOnInstallationParameterList struct { + href string + link bool + items []*AddOnInstallationParameter +} + +// Kind returns the name of the type of the object. +func (l *AddOnInstallationParameterList) Kind() string { + if l == nil { + return AddOnInstallationParameterListNilKind + } + if l.link { + return AddOnInstallationParameterListLinkKind + } + return AddOnInstallationParameterListKind +} + +// Link returns true iif this is a link. +func (l *AddOnInstallationParameterList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnInstallationParameterList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnInstallationParameterList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnInstallationParameterList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnInstallationParameterList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnInstallationParameterList) Get(i int) *AddOnInstallationParameter { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnInstallationParameterList) Slice() []*AddOnInstallationParameter { + var slice []*AddOnInstallationParameter + if l == nil { + slice = make([]*AddOnInstallationParameter, 0) + } else { + slice = make([]*AddOnInstallationParameter, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnInstallationParameterList) Each(f func(item *AddOnInstallationParameter) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnInstallationParameterList) Range(f func(index int, item *AddOnInstallationParameter) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_parameter_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_parameter_type_json.go new file mode 100644 index 00000000..ec84618d --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_parameter_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallationParameter writes a value of the 'add_on_installation_parameter' type to the given writer. +func MarshalAddOnInstallationParameter(object *AddOnInstallationParameter, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallationParameter(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallationParameter writes a value of the 'add_on_installation_parameter' type to the given stream. +func writeAddOnInstallationParameter(object *AddOnInstallationParameter, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnInstallationParameterLinkKind) + } else { + stream.WriteString(AddOnInstallationParameterKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnInstallationParameter reads a value of the 'add_on_installation_parameter' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnInstallationParameter(source interface{}) (object *AddOnInstallationParameter, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnInstallationParameter(iterator) + err = iterator.Error + return +} + +// readAddOnInstallationParameter reads a value of the 'add_on_installation_parameter' type from the given iterator. +func readAddOnInstallationParameter(iterator *jsoniter.Iterator) *AddOnInstallationParameter { + object := &AddOnInstallationParameter{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnInstallationParameterLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_resource_json.go b/clustersmgmt/v2alpha1/add_on_installation_resource_json.go new file mode 100644 index 00000000..58adaf5e --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAddOnInstallationDeleteRequest(request *AddOnInstallationDeleteRequest, writer io.Writer) error { + return nil +} +func readAddOnInstallationDeleteResponse(response *AddOnInstallationDeleteResponse, reader io.Reader) error { + return nil +} +func writeAddOnInstallationGetRequest(request *AddOnInstallationGetRequest, writer io.Writer) error { + return nil +} +func readAddOnInstallationGetResponse(response *AddOnInstallationGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOnInstallation(reader) + return err +} +func writeAddOnInstallationUpdateRequest(request *AddOnInstallationUpdateRequest, writer io.Writer) error { + return MarshalAddOnInstallation(request.body, writer) +} +func readAddOnInstallationUpdateResponse(response *AddOnInstallationUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOnInstallation(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_state_list_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_state_list_type_json.go new file mode 100644 index 00000000..92a2495c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallationStateList writes a list of values of the 'add_on_installation_state' type to +// the given writer. +func MarshalAddOnInstallationStateList(list []AddOnInstallationState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallationStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallationStateList writes a list of value of the 'add_on_installation_state' type to +// the given stream. +func writeAddOnInstallationStateList(list []AddOnInstallationState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnInstallationStateList reads a list of values of the 'add_on_installation_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnInstallationStateList(source interface{}) (items []AddOnInstallationState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnInstallationStateList(iterator) + err = iterator.Error + return +} + +// readAddOnInstallationStateList reads list of values of the ”add_on_installation_state' type from +// the given iterator. +func readAddOnInstallationStateList(iterator *jsoniter.Iterator) []AddOnInstallationState { + list := []AddOnInstallationState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := AddOnInstallationState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_state_type.go b/clustersmgmt/v2alpha1/add_on_installation_state_type.go new file mode 100644 index 00000000..ed9cae7a --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_state_type.go @@ -0,0 +1,36 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnInstallationState represents the values of the 'add_on_installation_state' enumerated type. +type AddOnInstallationState string + +const ( + // The add-on is being deleted. + AddOnInstallationStateDeleting AddOnInstallationState = "deleting" + // Error during installation. + AddOnInstallationStateFailed AddOnInstallationState = "failed" + // The add-on is still being installed. + AddOnInstallationStateInstalling AddOnInstallationState = "installing" + // The add-on is in pending state. + AddOnInstallationStatePending AddOnInstallationState = "pending" + // The add-on is ready to be used. + AddOnInstallationStateReady AddOnInstallationState = "ready" +) diff --git a/clustersmgmt/v2alpha1/add_on_installation_type.go b/clustersmgmt/v2alpha1/add_on_installation_type.go new file mode 100644 index 00000000..c88b3eb9 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_type.go @@ -0,0 +1,438 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// AddOnInstallationKind is the name of the type used to represent objects +// of type 'add_on_installation'. +const AddOnInstallationKind = "AddOnInstallation" + +// AddOnInstallationLinkKind is the name of the type used to represent links +// to objects of type 'add_on_installation'. +const AddOnInstallationLinkKind = "AddOnInstallationLink" + +// AddOnInstallationNilKind is the name of the type used to nil references +// to objects of type 'add_on_installation'. +const AddOnInstallationNilKind = "AddOnInstallationNil" + +// AddOnInstallation represents the values of the 'add_on_installation' type. +// +// Representation of an add-on installation in a cluster. +type AddOnInstallation struct { + bitmap_ uint32 + id string + href string + addon *AddOn + addonVersion *AddOnVersion + billing *AddOnInstallationBilling + creationTimestamp time.Time + operatorVersion string + parameters *AddOnInstallationParameterList + state AddOnInstallationState + stateDescription string + updatedTimestamp time.Time +} + +// Kind returns the name of the type of the object. +func (o *AddOnInstallation) Kind() string { + if o == nil { + return AddOnInstallationNilKind + } + if o.bitmap_&1 != 0 { + return AddOnInstallationLinkKind + } + return AddOnInstallationKind +} + +// Link returns true iif this is a link. +func (o *AddOnInstallation) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnInstallation) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnInstallation) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnInstallation) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnInstallation) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnInstallation) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Addon returns the value of the 'addon' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to add-on attached to this cluster. +func (o *AddOnInstallation) Addon() *AddOn { + if o != nil && o.bitmap_&8 != 0 { + return o.addon + } + return nil +} + +// GetAddon returns the value of the 'addon' attribute and +// a flag indicating if the attribute has a value. +// +// Link to add-on attached to this cluster. +func (o *AddOnInstallation) GetAddon() (value *AddOn, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.addon + } + return +} + +// AddonVersion returns the value of the 'addon_version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the installed version of this add-on. +func (o *AddOnInstallation) AddonVersion() *AddOnVersion { + if o != nil && o.bitmap_&16 != 0 { + return o.addonVersion + } + return nil +} + +// GetAddonVersion returns the value of the 'addon_version' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the installed version of this add-on. +func (o *AddOnInstallation) GetAddonVersion() (value *AddOnVersion, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.addonVersion + } + return +} + +// Billing returns the value of the 'billing' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Billing details for add-on installation resource +func (o *AddOnInstallation) Billing() *AddOnInstallationBilling { + if o != nil && o.bitmap_&32 != 0 { + return o.billing + } + return nil +} + +// GetBilling returns the value of the 'billing' attribute and +// a flag indicating if the attribute has a value. +// +// Billing details for add-on installation resource +func (o *AddOnInstallation) GetBilling() (value *AddOnInstallationBilling, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.billing + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the add-on was initially installed in the cluster. +func (o *AddOnInstallation) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&64 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the add-on was initially installed in the cluster. +func (o *AddOnInstallation) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// OperatorVersion returns the value of the 'operator_version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version of the operator installed by the add-on. +func (o *AddOnInstallation) OperatorVersion() string { + if o != nil && o.bitmap_&128 != 0 { + return o.operatorVersion + } + return "" +} + +// GetOperatorVersion returns the value of the 'operator_version' attribute and +// a flag indicating if the attribute has a value. +// +// Version of the operator installed by the add-on. +func (o *AddOnInstallation) GetOperatorVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.operatorVersion + } + return +} + +// Parameters returns the value of the 'parameters' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of add-on parameters for this add-on installation. +func (o *AddOnInstallation) Parameters() *AddOnInstallationParameterList { + if o != nil && o.bitmap_&256 != 0 { + return o.parameters + } + return nil +} + +// GetParameters returns the value of the 'parameters' attribute and +// a flag indicating if the attribute has a value. +// +// List of add-on parameters for this add-on installation. +func (o *AddOnInstallation) GetParameters() (value *AddOnInstallationParameterList, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.parameters + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Overall state of the add-on installation. +func (o *AddOnInstallation) State() AddOnInstallationState { + if o != nil && o.bitmap_&512 != 0 { + return o.state + } + return AddOnInstallationState("") +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// Overall state of the add-on installation. +func (o *AddOnInstallation) GetState() (value AddOnInstallationState, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.state + } + return +} + +// StateDescription returns the value of the 'state_description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Reason for the current State. +func (o *AddOnInstallation) StateDescription() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.stateDescription + } + return "" +} + +// GetStateDescription returns the value of the 'state_description' attribute and +// a flag indicating if the attribute has a value. +// +// Reason for the current State. +func (o *AddOnInstallation) GetStateDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.stateDescription + } + return +} + +// UpdatedTimestamp returns the value of the 'updated_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the add-on installation information was last updated. +func (o *AddOnInstallation) UpdatedTimestamp() time.Time { + if o != nil && o.bitmap_&2048 != 0 { + return o.updatedTimestamp + } + return time.Time{} +} + +// GetUpdatedTimestamp returns the value of the 'updated_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the add-on installation information was last updated. +func (o *AddOnInstallation) GetUpdatedTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.updatedTimestamp + } + return +} + +// AddOnInstallationListKind is the name of the type used to represent list of objects of +// type 'add_on_installation'. +const AddOnInstallationListKind = "AddOnInstallationList" + +// AddOnInstallationListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_installation'. +const AddOnInstallationListLinkKind = "AddOnInstallationListLink" + +// AddOnInstallationNilKind is the name of the type used to nil lists of objects of +// type 'add_on_installation'. +const AddOnInstallationListNilKind = "AddOnInstallationListNil" + +// AddOnInstallationList is a list of values of the 'add_on_installation' type. +type AddOnInstallationList struct { + href string + link bool + items []*AddOnInstallation +} + +// Kind returns the name of the type of the object. +func (l *AddOnInstallationList) Kind() string { + if l == nil { + return AddOnInstallationListNilKind + } + if l.link { + return AddOnInstallationListLinkKind + } + return AddOnInstallationListKind +} + +// Link returns true iif this is a link. +func (l *AddOnInstallationList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnInstallationList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnInstallationList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnInstallationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnInstallationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnInstallationList) Get(i int) *AddOnInstallation { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnInstallationList) Slice() []*AddOnInstallation { + var slice []*AddOnInstallation + if l == nil { + slice = make([]*AddOnInstallation, 0) + } else { + slice = make([]*AddOnInstallation, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnInstallationList) Each(f func(item *AddOnInstallation) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnInstallationList) Range(f func(index int, item *AddOnInstallation) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_installation_type_json.go b/clustersmgmt/v2alpha1/add_on_installation_type_json.go new file mode 100644 index 00000000..54294e5f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installation_type_json.go @@ -0,0 +1,254 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnInstallation writes a value of the 'add_on_installation' type to the given writer. +func MarshalAddOnInstallation(object *AddOnInstallation, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnInstallation(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnInstallation writes a value of the 'add_on_installation' type to the given stream. +func writeAddOnInstallation(object *AddOnInstallation, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnInstallationLinkKind) + } else { + stream.WriteString(AddOnInstallationKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.addon != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("addon") + writeAddOn(object.addon, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.addonVersion != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("addon_version") + writeAddOnVersion(object.addonVersion, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.billing != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing") + writeAddOnInstallationBilling(object.billing, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator_version") + stream.WriteString(object.operatorVersion) + count++ + } + present_ = object.bitmap_&256 != 0 && object.parameters != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("parameters") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeAddOnInstallationParameterList(object.parameters.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(string(object.state)) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state_description") + stream.WriteString(object.stateDescription) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("updated_timestamp") + stream.WriteString((object.updatedTimestamp).Format(time.RFC3339)) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnInstallation reads a value of the 'add_on_installation' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnInstallation(source interface{}) (object *AddOnInstallation, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnInstallation(iterator) + err = iterator.Error + return +} + +// readAddOnInstallation reads a value of the 'add_on_installation' type from the given iterator. +func readAddOnInstallation(iterator *jsoniter.Iterator) *AddOnInstallation { + object := &AddOnInstallation{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnInstallationLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "addon": + value := readAddOn(iterator) + object.addon = value + object.bitmap_ |= 8 + case "addon_version": + value := readAddOnVersion(iterator) + object.addonVersion = value + object.bitmap_ |= 16 + case "billing": + value := readAddOnInstallationBilling(iterator) + object.billing = value + object.bitmap_ |= 32 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 64 + case "operator_version": + value := iterator.ReadString() + object.operatorVersion = value + object.bitmap_ |= 128 + case "parameters": + value := &AddOnInstallationParameterList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == AddOnInstallationParameterListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readAddOnInstallationParameterList(iterator) + default: + iterator.ReadAny() + } + } + object.parameters = value + object.bitmap_ |= 256 + case "state": + text := iterator.ReadString() + value := AddOnInstallationState(text) + object.state = value + object.bitmap_ |= 512 + case "state_description": + value := iterator.ReadString() + object.stateDescription = value + object.bitmap_ |= 1024 + case "updated_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.updatedTimestamp = value + object.bitmap_ |= 2048 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_installations_client.go b/clustersmgmt/v2alpha1/add_on_installations_client.go new file mode 100644 index 00000000..e2db01a4 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installations_client.go @@ -0,0 +1,507 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddOnInstallationsClient is the client of the 'add_on_installations' resource. +// +// Manages the collection of add-on installations. +type AddOnInstallationsClient struct { + transport http.RoundTripper + path string +} + +// NewAddOnInstallationsClient creates a new client for the 'add_on_installations' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddOnInstallationsClient(transport http.RoundTripper, path string) *AddOnInstallationsClient { + return &AddOnInstallationsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Create a new add-on installation and add it to the collection of add-on installations on the cluster. +func (c *AddOnInstallationsClient) Add() *AddOnInstallationsAddRequest { + return &AddOnInstallationsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of add-on installations. +func (c *AddOnInstallationsClient) List() *AddOnInstallationsListRequest { + return &AddOnInstallationsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Addoninstallation returns the target 'add_on_installation' resource for the given identifier. +// +// Returns a reference to the service that manages a specific add-on installation. +func (c *AddOnInstallationsClient) Addoninstallation(id string) *AddOnInstallationClient { + return NewAddOnInstallationClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AddOnInstallationsAddRequest is the request for the 'add' method. +type AddOnInstallationsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddOnInstallation +} + +// Parameter adds a query parameter. +func (r *AddOnInstallationsAddRequest) Parameter(name string, value interface{}) *AddOnInstallationsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnInstallationsAddRequest) Header(name string, value interface{}) *AddOnInstallationsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnInstallationsAddRequest) Impersonate(user string) *AddOnInstallationsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the add-on installation. +func (r *AddOnInstallationsAddRequest) Body(value *AddOnInstallation) *AddOnInstallationsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnInstallationsAddRequest) Send() (result *AddOnInstallationsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnInstallationsAddRequest) SendContext(ctx context.Context) (result *AddOnInstallationsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddOnInstallationsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnInstallationsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnInstallationsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnInstallationsAddResponse is the response for the 'add' method. +type AddOnInstallationsAddResponse struct { + status int + header http.Header + err *errors.Error + body *AddOnInstallation +} + +// Status returns the response status code. +func (r *AddOnInstallationsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnInstallationsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnInstallationsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the add-on installation. +func (r *AddOnInstallationsAddResponse) Body() *AddOnInstallation { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the add-on installation. +func (r *AddOnInstallationsAddResponse) GetBody() (value *AddOnInstallation, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddOnInstallationsListRequest is the request for the 'list' method. +type AddOnInstallationsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AddOnInstallationsListRequest) Parameter(name string, value interface{}) *AddOnInstallationsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnInstallationsListRequest) Header(name string, value interface{}) *AddOnInstallationsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnInstallationsListRequest) Impersonate(user string) *AddOnInstallationsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the add-on installation +// instead of the names of the columns of a table. For example, in order to sort the +// add-on installations descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AddOnInstallationsListRequest) Order(value string) *AddOnInstallationsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnInstallationsListRequest) Page(value int) *AddOnInstallationsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the add-on installation +// instead of the names of the columns of a table. For example, in order to retrieve +// all the add-on installations with a name starting with `my` the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the add-on +// installations that the user has permission to see will be returned. +func (r *AddOnInstallationsListRequest) Search(value string) *AddOnInstallationsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnInstallationsListRequest) Size(value int) *AddOnInstallationsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnInstallationsListRequest) Send() (result *AddOnInstallationsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnInstallationsListRequest) SendContext(ctx context.Context) (result *AddOnInstallationsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnInstallationsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnInstallationsListResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnInstallationsListResponse is the response for the 'list' method. +type AddOnInstallationsListResponse struct { + status int + header http.Header + err *errors.Error + items *AddOnInstallationList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AddOnInstallationsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnInstallationsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnInstallationsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of add-on installations. +func (r *AddOnInstallationsListResponse) Items() *AddOnInstallationList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of add-on installations. +func (r *AddOnInstallationsListResponse) GetItems() (value *AddOnInstallationList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnInstallationsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnInstallationsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnInstallationsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnInstallationsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddOnInstallationsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddOnInstallationsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_installations_resource_json.go b/clustersmgmt/v2alpha1/add_on_installations_resource_json.go new file mode 100644 index 00000000..9ed22f7c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_installations_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAddOnInstallationsAddRequest(request *AddOnInstallationsAddRequest, writer io.Writer) error { + return MarshalAddOnInstallation(request.body, writer) +} +func readAddOnInstallationsAddResponse(response *AddOnInstallationsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOnInstallation(reader) + return err +} +func writeAddOnInstallationsListRequest(request *AddOnInstallationsListRequest, writer io.Writer) error { + return nil +} +func readAddOnInstallationsListResponse(response *AddOnInstallationsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAddOnInstallationList(iterator) + response.items = &AddOnInstallationList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/add_on_list_builder.go b/clustersmgmt/v2alpha1/add_on_list_builder.go new file mode 100644 index 00000000..fd7f2a0f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnListBuilder contains the data and logic needed to build +// 'add_on' objects. +type AddOnListBuilder struct { + items []*AddOnBuilder +} + +// NewAddOnList creates a new builder of 'add_on' objects. +func NewAddOnList() *AddOnListBuilder { + return new(AddOnListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnListBuilder) Items(values ...*AddOnBuilder) *AddOnListBuilder { + b.items = make([]*AddOnBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnListBuilder) Copy(list *AddOnList) *AddOnListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOn().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on' objects using the +// configuration stored in the builder. +func (b *AddOnListBuilder) Build() (list *AddOnList, err error) { + items := make([]*AddOn, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_list_type_json.go b/clustersmgmt/v2alpha1/add_on_list_type_json.go new file mode 100644 index 00000000..2fd1e0e3 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnList writes a list of values of the 'add_on' type to +// the given writer. +func MarshalAddOnList(list []*AddOn, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnList writes a list of value of the 'add_on' type to +// the given stream. +func writeAddOnList(list []*AddOn, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOn(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnList reads a list of values of the 'add_on' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnList(source interface{}) (items []*AddOn, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnList(iterator) + err = iterator.Error + return +} + +// readAddOnList reads list of values of the ”add_on' type from +// the given iterator. +func readAddOnList(iterator *jsoniter.Iterator) []*AddOn { + list := []*AddOn{} + for iterator.ReadArray() { + item := readAddOn(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_namespace_builder.go b/clustersmgmt/v2alpha1/add_on_namespace_builder.go new file mode 100644 index 00000000..8fbaa370 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_namespace_builder.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnNamespaceBuilder contains the data and logic needed to build 'add_on_namespace' objects. +type AddOnNamespaceBuilder struct { + bitmap_ uint32 + id string + href string + annotations map[string]string + labels map[string]string + name string +} + +// NewAddOnNamespace creates a new builder of 'add_on_namespace' objects. +func NewAddOnNamespace() *AddOnNamespaceBuilder { + return &AddOnNamespaceBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnNamespaceBuilder) Link(value bool) *AddOnNamespaceBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnNamespaceBuilder) ID(value string) *AddOnNamespaceBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnNamespaceBuilder) HREF(value string) *AddOnNamespaceBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnNamespaceBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Annotations sets the value of the 'annotations' attribute to the given value. +func (b *AddOnNamespaceBuilder) Annotations(value map[string]string) *AddOnNamespaceBuilder { + b.annotations = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Labels sets the value of the 'labels' attribute to the given value. +func (b *AddOnNamespaceBuilder) Labels(value map[string]string) *AddOnNamespaceBuilder { + b.labels = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AddOnNamespaceBuilder) Name(value string) *AddOnNamespaceBuilder { + b.name = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnNamespaceBuilder) Copy(object *AddOnNamespace) *AddOnNamespaceBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if len(object.annotations) > 0 { + b.annotations = map[string]string{} + for k, v := range object.annotations { + b.annotations[k] = v + } + } else { + b.annotations = nil + } + if len(object.labels) > 0 { + b.labels = map[string]string{} + for k, v := range object.labels { + b.labels[k] = v + } + } else { + b.labels = nil + } + b.name = object.name + return b +} + +// Build creates a 'add_on_namespace' object using the configuration stored in the builder. +func (b *AddOnNamespaceBuilder) Build() (object *AddOnNamespace, err error) { + object = new(AddOnNamespace) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.annotations != nil { + object.annotations = make(map[string]string) + for k, v := range b.annotations { + object.annotations[k] = v + } + } + if b.labels != nil { + object.labels = make(map[string]string) + for k, v := range b.labels { + object.labels[k] = v + } + } + object.name = b.name + return +} diff --git a/clustersmgmt/v2alpha1/add_on_namespace_list_builder.go b/clustersmgmt/v2alpha1/add_on_namespace_list_builder.go new file mode 100644 index 00000000..0431ff2e --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_namespace_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnNamespaceListBuilder contains the data and logic needed to build +// 'add_on_namespace' objects. +type AddOnNamespaceListBuilder struct { + items []*AddOnNamespaceBuilder +} + +// NewAddOnNamespaceList creates a new builder of 'add_on_namespace' objects. +func NewAddOnNamespaceList() *AddOnNamespaceListBuilder { + return new(AddOnNamespaceListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnNamespaceListBuilder) Items(values ...*AddOnNamespaceBuilder) *AddOnNamespaceListBuilder { + b.items = make([]*AddOnNamespaceBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnNamespaceListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnNamespaceListBuilder) Copy(list *AddOnNamespaceList) *AddOnNamespaceListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnNamespaceBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnNamespace().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_namespace' objects using the +// configuration stored in the builder. +func (b *AddOnNamespaceListBuilder) Build() (list *AddOnNamespaceList, err error) { + items := make([]*AddOnNamespace, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnNamespaceList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_namespace_list_type_json.go b/clustersmgmt/v2alpha1/add_on_namespace_list_type_json.go new file mode 100644 index 00000000..581e2fc9 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_namespace_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnNamespaceList writes a list of values of the 'add_on_namespace' type to +// the given writer. +func MarshalAddOnNamespaceList(list []*AddOnNamespace, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnNamespaceList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnNamespaceList writes a list of value of the 'add_on_namespace' type to +// the given stream. +func writeAddOnNamespaceList(list []*AddOnNamespace, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnNamespace(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnNamespaceList reads a list of values of the 'add_on_namespace' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnNamespaceList(source interface{}) (items []*AddOnNamespace, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnNamespaceList(iterator) + err = iterator.Error + return +} + +// readAddOnNamespaceList reads list of values of the ”add_on_namespace' type from +// the given iterator. +func readAddOnNamespaceList(iterator *jsoniter.Iterator) []*AddOnNamespace { + list := []*AddOnNamespace{} + for iterator.ReadArray() { + item := readAddOnNamespace(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_namespace_type.go b/clustersmgmt/v2alpha1/add_on_namespace_type.go new file mode 100644 index 00000000..7ea4ca1e --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_namespace_type.go @@ -0,0 +1,288 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnNamespaceKind is the name of the type used to represent objects +// of type 'add_on_namespace'. +const AddOnNamespaceKind = "AddOnNamespace" + +// AddOnNamespaceLinkKind is the name of the type used to represent links +// to objects of type 'add_on_namespace'. +const AddOnNamespaceLinkKind = "AddOnNamespaceLink" + +// AddOnNamespaceNilKind is the name of the type used to nil references +// to objects of type 'add_on_namespace'. +const AddOnNamespaceNilKind = "AddOnNamespaceNil" + +// AddOnNamespace represents the values of the 'add_on_namespace' type. +type AddOnNamespace struct { + bitmap_ uint32 + id string + href string + annotations map[string]string + labels map[string]string + name string +} + +// Kind returns the name of the type of the object. +func (o *AddOnNamespace) Kind() string { + if o == nil { + return AddOnNamespaceNilKind + } + if o.bitmap_&1 != 0 { + return AddOnNamespaceLinkKind + } + return AddOnNamespaceKind +} + +// Link returns true iif this is a link. +func (o *AddOnNamespace) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnNamespace) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnNamespace) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnNamespace) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnNamespace) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnNamespace) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Annotations returns the value of the 'annotations' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Annotations to be applied to this namespace. +func (o *AddOnNamespace) Annotations() map[string]string { + if o != nil && o.bitmap_&8 != 0 { + return o.annotations + } + return nil +} + +// GetAnnotations returns the value of the 'annotations' attribute and +// a flag indicating if the attribute has a value. +// +// Annotations to be applied to this namespace. +func (o *AddOnNamespace) GetAnnotations() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.annotations + } + return +} + +// Labels returns the value of the 'labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Labels to be applied to this namespace. +func (o *AddOnNamespace) Labels() map[string]string { + if o != nil && o.bitmap_&16 != 0 { + return o.labels + } + return nil +} + +// GetLabels returns the value of the 'labels' attribute and +// a flag indicating if the attribute has a value. +// +// Labels to be applied to this namespace. +func (o *AddOnNamespace) GetLabels() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.labels + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the namespace. +func (o *AddOnNamespace) Name() string { + if o != nil && o.bitmap_&32 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the namespace. +func (o *AddOnNamespace) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.name + } + return +} + +// AddOnNamespaceListKind is the name of the type used to represent list of objects of +// type 'add_on_namespace'. +const AddOnNamespaceListKind = "AddOnNamespaceList" + +// AddOnNamespaceListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_namespace'. +const AddOnNamespaceListLinkKind = "AddOnNamespaceListLink" + +// AddOnNamespaceNilKind is the name of the type used to nil lists of objects of +// type 'add_on_namespace'. +const AddOnNamespaceListNilKind = "AddOnNamespaceListNil" + +// AddOnNamespaceList is a list of values of the 'add_on_namespace' type. +type AddOnNamespaceList struct { + href string + link bool + items []*AddOnNamespace +} + +// Kind returns the name of the type of the object. +func (l *AddOnNamespaceList) Kind() string { + if l == nil { + return AddOnNamespaceListNilKind + } + if l.link { + return AddOnNamespaceListLinkKind + } + return AddOnNamespaceListKind +} + +// Link returns true iif this is a link. +func (l *AddOnNamespaceList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnNamespaceList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnNamespaceList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnNamespaceList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnNamespaceList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnNamespaceList) Get(i int) *AddOnNamespace { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnNamespaceList) Slice() []*AddOnNamespace { + var slice []*AddOnNamespace + if l == nil { + slice = make([]*AddOnNamespace, 0) + } else { + slice = make([]*AddOnNamespace, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnNamespaceList) Each(f func(item *AddOnNamespace) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnNamespaceList) Range(f func(index int, item *AddOnNamespace) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_namespace_type_json.go b/clustersmgmt/v2alpha1/add_on_namespace_type_json.go new file mode 100644 index 00000000..32a008fd --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_namespace_type_json.go @@ -0,0 +1,203 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnNamespace writes a value of the 'add_on_namespace' type to the given writer. +func MarshalAddOnNamespace(object *AddOnNamespace, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnNamespace(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnNamespace writes a value of the 'add_on_namespace' type to the given stream. +func writeAddOnNamespace(object *AddOnNamespace, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnNamespaceLinkKind) + } else { + stream.WriteString(AddOnNamespaceKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.annotations != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("annotations") + if object.annotations != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.annotations)) + i := 0 + for key := range object.annotations { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.annotations[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&16 != 0 && object.labels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("labels") + if object.labels != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.labels)) + i := 0 + for key := range object.labels { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.labels[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnNamespace reads a value of the 'add_on_namespace' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnNamespace(source interface{}) (object *AddOnNamespace, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnNamespace(iterator) + err = iterator.Error + return +} + +// readAddOnNamespace reads a value of the 'add_on_namespace' type from the given iterator. +func readAddOnNamespace(iterator *jsoniter.Iterator) *AddOnNamespace { + object := &AddOnNamespace{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnNamespaceLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "annotations": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.annotations = value + object.bitmap_ |= 8 + case "labels": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.labels = value + object.bitmap_ |= 16 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_builder.go b/clustersmgmt/v2alpha1/add_on_parameter_builder.go new file mode 100644 index 00000000..0a3529f9 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_builder.go @@ -0,0 +1,256 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnParameterBuilder contains the data and logic needed to build 'add_on_parameter' objects. +// +// Representation of an add-on parameter. +type AddOnParameterBuilder struct { + bitmap_ uint32 + id string + href string + addon *AddOnBuilder + conditions []*AddOnRequirementBuilder + defaultValue string + description string + editableDirection string + name string + options []*AddOnParameterOptionBuilder + validation string + validationErrMsg string + valueType string + editable bool + enabled bool + required bool +} + +// NewAddOnParameter creates a new builder of 'add_on_parameter' objects. +func NewAddOnParameter() *AddOnParameterBuilder { + return &AddOnParameterBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnParameterBuilder) Link(value bool) *AddOnParameterBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnParameterBuilder) ID(value string) *AddOnParameterBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnParameterBuilder) HREF(value string) *AddOnParameterBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnParameterBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Addon sets the value of the 'addon' attribute to the given value. +// +// Representation of an add-on that can be installed in a cluster. +func (b *AddOnParameterBuilder) Addon(value *AddOnBuilder) *AddOnParameterBuilder { + b.addon = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Conditions sets the value of the 'conditions' attribute to the given values. +func (b *AddOnParameterBuilder) Conditions(values ...*AddOnRequirementBuilder) *AddOnParameterBuilder { + b.conditions = make([]*AddOnRequirementBuilder, len(values)) + copy(b.conditions, values) + b.bitmap_ |= 16 + return b +} + +// DefaultValue sets the value of the 'default_value' attribute to the given value. +func (b *AddOnParameterBuilder) DefaultValue(value string) *AddOnParameterBuilder { + b.defaultValue = value + b.bitmap_ |= 32 + return b +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *AddOnParameterBuilder) Description(value string) *AddOnParameterBuilder { + b.description = value + b.bitmap_ |= 64 + return b +} + +// Editable sets the value of the 'editable' attribute to the given value. +func (b *AddOnParameterBuilder) Editable(value bool) *AddOnParameterBuilder { + b.editable = value + b.bitmap_ |= 128 + return b +} + +// EditableDirection sets the value of the 'editable_direction' attribute to the given value. +func (b *AddOnParameterBuilder) EditableDirection(value string) *AddOnParameterBuilder { + b.editableDirection = value + b.bitmap_ |= 256 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AddOnParameterBuilder) Enabled(value bool) *AddOnParameterBuilder { + b.enabled = value + b.bitmap_ |= 512 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AddOnParameterBuilder) Name(value string) *AddOnParameterBuilder { + b.name = value + b.bitmap_ |= 1024 + return b +} + +// Options sets the value of the 'options' attribute to the given values. +func (b *AddOnParameterBuilder) Options(values ...*AddOnParameterOptionBuilder) *AddOnParameterBuilder { + b.options = make([]*AddOnParameterOptionBuilder, len(values)) + copy(b.options, values) + b.bitmap_ |= 2048 + return b +} + +// Required sets the value of the 'required' attribute to the given value. +func (b *AddOnParameterBuilder) Required(value bool) *AddOnParameterBuilder { + b.required = value + b.bitmap_ |= 4096 + return b +} + +// Validation sets the value of the 'validation' attribute to the given value. +func (b *AddOnParameterBuilder) Validation(value string) *AddOnParameterBuilder { + b.validation = value + b.bitmap_ |= 8192 + return b +} + +// ValidationErrMsg sets the value of the 'validation_err_msg' attribute to the given value. +func (b *AddOnParameterBuilder) ValidationErrMsg(value string) *AddOnParameterBuilder { + b.validationErrMsg = value + b.bitmap_ |= 16384 + return b +} + +// ValueType sets the value of the 'value_type' attribute to the given value. +func (b *AddOnParameterBuilder) ValueType(value string) *AddOnParameterBuilder { + b.valueType = value + b.bitmap_ |= 32768 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnParameterBuilder) Copy(object *AddOnParameter) *AddOnParameterBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.addon != nil { + b.addon = NewAddOn().Copy(object.addon) + } else { + b.addon = nil + } + if object.conditions != nil { + b.conditions = make([]*AddOnRequirementBuilder, len(object.conditions)) + for i, v := range object.conditions { + b.conditions[i] = NewAddOnRequirement().Copy(v) + } + } else { + b.conditions = nil + } + b.defaultValue = object.defaultValue + b.description = object.description + b.editable = object.editable + b.editableDirection = object.editableDirection + b.enabled = object.enabled + b.name = object.name + if object.options != nil { + b.options = make([]*AddOnParameterOptionBuilder, len(object.options)) + for i, v := range object.options { + b.options[i] = NewAddOnParameterOption().Copy(v) + } + } else { + b.options = nil + } + b.required = object.required + b.validation = object.validation + b.validationErrMsg = object.validationErrMsg + b.valueType = object.valueType + return b +} + +// Build creates a 'add_on_parameter' object using the configuration stored in the builder. +func (b *AddOnParameterBuilder) Build() (object *AddOnParameter, err error) { + object = new(AddOnParameter) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.addon != nil { + object.addon, err = b.addon.Build() + if err != nil { + return + } + } + if b.conditions != nil { + object.conditions = make([]*AddOnRequirement, len(b.conditions)) + for i, v := range b.conditions { + object.conditions[i], err = v.Build() + if err != nil { + return + } + } + } + object.defaultValue = b.defaultValue + object.description = b.description + object.editable = b.editable + object.editableDirection = b.editableDirection + object.enabled = b.enabled + object.name = b.name + if b.options != nil { + object.options = make([]*AddOnParameterOption, len(b.options)) + for i, v := range b.options { + object.options[i], err = v.Build() + if err != nil { + return + } + } + } + object.required = b.required + object.validation = b.validation + object.validationErrMsg = b.validationErrMsg + object.valueType = b.valueType + return +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_list_builder.go b/clustersmgmt/v2alpha1/add_on_parameter_list_builder.go new file mode 100644 index 00000000..0f3bbe6a --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnParameterListBuilder contains the data and logic needed to build +// 'add_on_parameter' objects. +type AddOnParameterListBuilder struct { + items []*AddOnParameterBuilder +} + +// NewAddOnParameterList creates a new builder of 'add_on_parameter' objects. +func NewAddOnParameterList() *AddOnParameterListBuilder { + return new(AddOnParameterListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnParameterListBuilder) Items(values ...*AddOnParameterBuilder) *AddOnParameterListBuilder { + b.items = make([]*AddOnParameterBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnParameterListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnParameterListBuilder) Copy(list *AddOnParameterList) *AddOnParameterListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnParameterBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnParameter().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_parameter' objects using the +// configuration stored in the builder. +func (b *AddOnParameterListBuilder) Build() (list *AddOnParameterList, err error) { + items := make([]*AddOnParameter, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnParameterList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_list_type_json.go b/clustersmgmt/v2alpha1/add_on_parameter_list_type_json.go new file mode 100644 index 00000000..ed3d6d89 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnParameterList writes a list of values of the 'add_on_parameter' type to +// the given writer. +func MarshalAddOnParameterList(list []*AddOnParameter, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnParameterList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnParameterList writes a list of value of the 'add_on_parameter' type to +// the given stream. +func writeAddOnParameterList(list []*AddOnParameter, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnParameter(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnParameterList reads a list of values of the 'add_on_parameter' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnParameterList(source interface{}) (items []*AddOnParameter, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnParameterList(iterator) + err = iterator.Error + return +} + +// readAddOnParameterList reads list of values of the ”add_on_parameter' type from +// the given iterator. +func readAddOnParameterList(iterator *jsoniter.Iterator) []*AddOnParameter { + list := []*AddOnParameter{} + for iterator.ReadArray() { + item := readAddOnParameter(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_option_builder.go b/clustersmgmt/v2alpha1/add_on_parameter_option_builder.go new file mode 100644 index 00000000..e124b467 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_option_builder.go @@ -0,0 +1,109 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnParameterOptionBuilder contains the data and logic needed to build 'add_on_parameter_option' objects. +// +// Representation of an add-on parameter option. +type AddOnParameterOptionBuilder struct { + bitmap_ uint32 + name string + rank int + requirements []*AddOnRequirementBuilder + value string +} + +// NewAddOnParameterOption creates a new builder of 'add_on_parameter_option' objects. +func NewAddOnParameterOption() *AddOnParameterOptionBuilder { + return &AddOnParameterOptionBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnParameterOptionBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AddOnParameterOptionBuilder) Name(value string) *AddOnParameterOptionBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Rank sets the value of the 'rank' attribute to the given value. +func (b *AddOnParameterOptionBuilder) Rank(value int) *AddOnParameterOptionBuilder { + b.rank = value + b.bitmap_ |= 2 + return b +} + +// Requirements sets the value of the 'requirements' attribute to the given values. +func (b *AddOnParameterOptionBuilder) Requirements(values ...*AddOnRequirementBuilder) *AddOnParameterOptionBuilder { + b.requirements = make([]*AddOnRequirementBuilder, len(values)) + copy(b.requirements, values) + b.bitmap_ |= 4 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *AddOnParameterOptionBuilder) Value(value string) *AddOnParameterOptionBuilder { + b.value = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnParameterOptionBuilder) Copy(object *AddOnParameterOption) *AddOnParameterOptionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + b.rank = object.rank + if object.requirements != nil { + b.requirements = make([]*AddOnRequirementBuilder, len(object.requirements)) + for i, v := range object.requirements { + b.requirements[i] = NewAddOnRequirement().Copy(v) + } + } else { + b.requirements = nil + } + b.value = object.value + return b +} + +// Build creates a 'add_on_parameter_option' object using the configuration stored in the builder. +func (b *AddOnParameterOptionBuilder) Build() (object *AddOnParameterOption, err error) { + object = new(AddOnParameterOption) + object.bitmap_ = b.bitmap_ + object.name = b.name + object.rank = b.rank + if b.requirements != nil { + object.requirements = make([]*AddOnRequirement, len(b.requirements)) + for i, v := range b.requirements { + object.requirements[i], err = v.Build() + if err != nil { + return + } + } + } + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_option_list_builder.go b/clustersmgmt/v2alpha1/add_on_parameter_option_list_builder.go new file mode 100644 index 00000000..9fe9d1a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_option_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnParameterOptionListBuilder contains the data and logic needed to build +// 'add_on_parameter_option' objects. +type AddOnParameterOptionListBuilder struct { + items []*AddOnParameterOptionBuilder +} + +// NewAddOnParameterOptionList creates a new builder of 'add_on_parameter_option' objects. +func NewAddOnParameterOptionList() *AddOnParameterOptionListBuilder { + return new(AddOnParameterOptionListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnParameterOptionListBuilder) Items(values ...*AddOnParameterOptionBuilder) *AddOnParameterOptionListBuilder { + b.items = make([]*AddOnParameterOptionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnParameterOptionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnParameterOptionListBuilder) Copy(list *AddOnParameterOptionList) *AddOnParameterOptionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnParameterOptionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnParameterOption().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_parameter_option' objects using the +// configuration stored in the builder. +func (b *AddOnParameterOptionListBuilder) Build() (list *AddOnParameterOptionList, err error) { + items := make([]*AddOnParameterOption, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnParameterOptionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_option_list_type_json.go b/clustersmgmt/v2alpha1/add_on_parameter_option_list_type_json.go new file mode 100644 index 00000000..e4ac20ff --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_option_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnParameterOptionList writes a list of values of the 'add_on_parameter_option' type to +// the given writer. +func MarshalAddOnParameterOptionList(list []*AddOnParameterOption, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnParameterOptionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnParameterOptionList writes a list of value of the 'add_on_parameter_option' type to +// the given stream. +func writeAddOnParameterOptionList(list []*AddOnParameterOption, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnParameterOption(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnParameterOptionList reads a list of values of the 'add_on_parameter_option' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnParameterOptionList(source interface{}) (items []*AddOnParameterOption, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnParameterOptionList(iterator) + err = iterator.Error + return +} + +// readAddOnParameterOptionList reads list of values of the ”add_on_parameter_option' type from +// the given iterator. +func readAddOnParameterOptionList(iterator *jsoniter.Iterator) []*AddOnParameterOption { + list := []*AddOnParameterOption{} + for iterator.ReadArray() { + item := readAddOnParameterOption(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_option_type.go b/clustersmgmt/v2alpha1/add_on_parameter_option_type.go new file mode 100644 index 00000000..758ac529 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_option_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnParameterOption represents the values of the 'add_on_parameter_option' type. +// +// Representation of an add-on parameter option. +type AddOnParameterOption struct { + bitmap_ uint32 + name string + rank int + requirements []*AddOnRequirement + value string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnParameterOption) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the add-on parameter option. +func (o *AddOnParameterOption) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the add-on parameter option. +func (o *AddOnParameterOption) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Rank returns the value of the 'rank' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Rank of option to be used in cases where editable direction should be restricted. +func (o *AddOnParameterOption) Rank() int { + if o != nil && o.bitmap_&2 != 0 { + return o.rank + } + return 0 +} + +// GetRank returns the value of the 'rank' attribute and +// a flag indicating if the attribute has a value. +// +// Rank of option to be used in cases where editable direction should be restricted. +func (o *AddOnParameterOption) GetRank() (value int, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.rank + } + return +} + +// Requirements returns the value of the 'requirements' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of add-on requirements for this parameter option. +func (o *AddOnParameterOption) Requirements() []*AddOnRequirement { + if o != nil && o.bitmap_&4 != 0 { + return o.requirements + } + return nil +} + +// GetRequirements returns the value of the 'requirements' attribute and +// a flag indicating if the attribute has a value. +// +// List of add-on requirements for this parameter option. +func (o *AddOnParameterOption) GetRequirements() (value []*AddOnRequirement, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.requirements + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Value of the add-on parameter option. +func (o *AddOnParameterOption) Value() string { + if o != nil && o.bitmap_&8 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// Value of the add-on parameter option. +func (o *AddOnParameterOption) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.value + } + return +} + +// AddOnParameterOptionListKind is the name of the type used to represent list of objects of +// type 'add_on_parameter_option'. +const AddOnParameterOptionListKind = "AddOnParameterOptionList" + +// AddOnParameterOptionListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_parameter_option'. +const AddOnParameterOptionListLinkKind = "AddOnParameterOptionListLink" + +// AddOnParameterOptionNilKind is the name of the type used to nil lists of objects of +// type 'add_on_parameter_option'. +const AddOnParameterOptionListNilKind = "AddOnParameterOptionListNil" + +// AddOnParameterOptionList is a list of values of the 'add_on_parameter_option' type. +type AddOnParameterOptionList struct { + href string + link bool + items []*AddOnParameterOption +} + +// Len returns the length of the list. +func (l *AddOnParameterOptionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnParameterOptionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnParameterOptionList) Get(i int) *AddOnParameterOption { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnParameterOptionList) Slice() []*AddOnParameterOption { + var slice []*AddOnParameterOption + if l == nil { + slice = make([]*AddOnParameterOption, 0) + } else { + slice = make([]*AddOnParameterOption, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnParameterOptionList) Each(f func(item *AddOnParameterOption) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnParameterOptionList) Range(f func(index int, item *AddOnParameterOption) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_option_type_json.go b/clustersmgmt/v2alpha1/add_on_parameter_option_type_json.go new file mode 100644 index 00000000..3d23d57f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_option_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnParameterOption writes a value of the 'add_on_parameter_option' type to the given writer. +func MarshalAddOnParameterOption(object *AddOnParameterOption, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnParameterOption(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnParameterOption writes a value of the 'add_on_parameter_option' type to the given stream. +func writeAddOnParameterOption(object *AddOnParameterOption, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("rank") + stream.WriteInt(object.rank) + count++ + } + present_ = object.bitmap_&4 != 0 && object.requirements != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("requirements") + writeAddOnRequirementList(object.requirements, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnParameterOption reads a value of the 'add_on_parameter_option' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnParameterOption(source interface{}) (object *AddOnParameterOption, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnParameterOption(iterator) + err = iterator.Error + return +} + +// readAddOnParameterOption reads a value of the 'add_on_parameter_option' type from the given iterator. +func readAddOnParameterOption(iterator *jsoniter.Iterator) *AddOnParameterOption { + object := &AddOnParameterOption{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "rank": + value := iterator.ReadInt() + object.rank = value + object.bitmap_ |= 2 + case "requirements": + value := readAddOnRequirementList(iterator) + object.requirements = value + object.bitmap_ |= 4 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_type.go b/clustersmgmt/v2alpha1/add_on_parameter_type.go new file mode 100644 index 00000000..2c2752f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_type.go @@ -0,0 +1,532 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnParameterKind is the name of the type used to represent objects +// of type 'add_on_parameter'. +const AddOnParameterKind = "AddOnParameter" + +// AddOnParameterLinkKind is the name of the type used to represent links +// to objects of type 'add_on_parameter'. +const AddOnParameterLinkKind = "AddOnParameterLink" + +// AddOnParameterNilKind is the name of the type used to nil references +// to objects of type 'add_on_parameter'. +const AddOnParameterNilKind = "AddOnParameterNil" + +// AddOnParameter represents the values of the 'add_on_parameter' type. +// +// Representation of an add-on parameter. +type AddOnParameter struct { + bitmap_ uint32 + id string + href string + addon *AddOn + conditions []*AddOnRequirement + defaultValue string + description string + editableDirection string + name string + options []*AddOnParameterOption + validation string + validationErrMsg string + valueType string + editable bool + enabled bool + required bool +} + +// Kind returns the name of the type of the object. +func (o *AddOnParameter) Kind() string { + if o == nil { + return AddOnParameterNilKind + } + if o.bitmap_&1 != 0 { + return AddOnParameterLinkKind + } + return AddOnParameterKind +} + +// Link returns true iif this is a link. +func (o *AddOnParameter) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnParameter) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnParameter) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnParameter) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnParameter) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnParameter) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Addon returns the value of the 'addon' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to add-on. +func (o *AddOnParameter) Addon() *AddOn { + if o != nil && o.bitmap_&8 != 0 { + return o.addon + } + return nil +} + +// GetAddon returns the value of the 'addon' attribute and +// a flag indicating if the attribute has a value. +// +// Link to add-on. +func (o *AddOnParameter) GetAddon() (value *AddOn, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.addon + } + return +} + +// Conditions returns the value of the 'conditions' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Conditions in which this parameter is valid for +func (o *AddOnParameter) Conditions() []*AddOnRequirement { + if o != nil && o.bitmap_&16 != 0 { + return o.conditions + } + return nil +} + +// GetConditions returns the value of the 'conditions' attribute and +// a flag indicating if the attribute has a value. +// +// Conditions in which this parameter is valid for +func (o *AddOnParameter) GetConditions() (value []*AddOnRequirement, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.conditions + } + return +} + +// DefaultValue returns the value of the 'default_value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates the value default for the add-on parameter. +func (o *AddOnParameter) DefaultValue() string { + if o != nil && o.bitmap_&32 != 0 { + return o.defaultValue + } + return "" +} + +// GetDefaultValue returns the value of the 'default_value' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates the value default for the add-on parameter. +func (o *AddOnParameter) GetDefaultValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.defaultValue + } + return +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the add-on parameter. +func (o *AddOnParameter) Description() string { + if o != nil && o.bitmap_&64 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the add-on parameter. +func (o *AddOnParameter) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.description + } + return +} + +// Editable returns the value of the 'editable' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this parameter can be edited after creation. +func (o *AddOnParameter) Editable() bool { + if o != nil && o.bitmap_&128 != 0 { + return o.editable + } + return false +} + +// GetEditable returns the value of the 'editable' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this parameter can be edited after creation. +func (o *AddOnParameter) GetEditable() (value bool, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.editable + } + return +} + +// EditableDirection returns the value of the 'editable_direction' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Restricts if the parameter can be upscaled/downscaled +// Expected values are "up", "down", or "" (no restriction). +func (o *AddOnParameter) EditableDirection() string { + if o != nil && o.bitmap_&256 != 0 { + return o.editableDirection + } + return "" +} + +// GetEditableDirection returns the value of the 'editable_direction' attribute and +// a flag indicating if the attribute has a value. +// +// Restricts if the parameter can be upscaled/downscaled +// Expected values are "up", "down", or "" (no restriction). +func (o *AddOnParameter) GetEditableDirection() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.editableDirection + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this parameter is enabled for the add-on. +func (o *AddOnParameter) Enabled() bool { + if o != nil && o.bitmap_&512 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this parameter is enabled for the add-on. +func (o *AddOnParameter) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.enabled + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the add-on parameter. +func (o *AddOnParameter) Name() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the add-on parameter. +func (o *AddOnParameter) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.name + } + return +} + +// Options returns the value of the 'options' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of options for the add-on parameter value. +func (o *AddOnParameter) Options() []*AddOnParameterOption { + if o != nil && o.bitmap_&2048 != 0 { + return o.options + } + return nil +} + +// GetOptions returns the value of the 'options' attribute and +// a flag indicating if the attribute has a value. +// +// List of options for the add-on parameter value. +func (o *AddOnParameter) GetOptions() (value []*AddOnParameterOption, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.options + } + return +} + +// Required returns the value of the 'required' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this parameter is required by the add-on. +func (o *AddOnParameter) Required() bool { + if o != nil && o.bitmap_&4096 != 0 { + return o.required + } + return false +} + +// GetRequired returns the value of the 'required' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this parameter is required by the add-on. +func (o *AddOnParameter) GetRequired() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.required + } + return +} + +// Validation returns the value of the 'validation' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Validation rule for the add-on parameter. +func (o *AddOnParameter) Validation() string { + if o != nil && o.bitmap_&8192 != 0 { + return o.validation + } + return "" +} + +// GetValidation returns the value of the 'validation' attribute and +// a flag indicating if the attribute has a value. +// +// Validation rule for the add-on parameter. +func (o *AddOnParameter) GetValidation() (value string, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.validation + } + return +} + +// ValidationErrMsg returns the value of the 'validation_err_msg' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Error message to return should the parameter be invalid. +func (o *AddOnParameter) ValidationErrMsg() string { + if o != nil && o.bitmap_&16384 != 0 { + return o.validationErrMsg + } + return "" +} + +// GetValidationErrMsg returns the value of the 'validation_err_msg' attribute and +// a flag indicating if the attribute has a value. +// +// Error message to return should the parameter be invalid. +func (o *AddOnParameter) GetValidationErrMsg() (value string, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.validationErrMsg + } + return +} + +// ValueType returns the value of the 'value_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Type of value of the add-on parameter. +func (o *AddOnParameter) ValueType() string { + if o != nil && o.bitmap_&32768 != 0 { + return o.valueType + } + return "" +} + +// GetValueType returns the value of the 'value_type' attribute and +// a flag indicating if the attribute has a value. +// +// Type of value of the add-on parameter. +func (o *AddOnParameter) GetValueType() (value string, ok bool) { + ok = o != nil && o.bitmap_&32768 != 0 + if ok { + value = o.valueType + } + return +} + +// AddOnParameterListKind is the name of the type used to represent list of objects of +// type 'add_on_parameter'. +const AddOnParameterListKind = "AddOnParameterList" + +// AddOnParameterListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_parameter'. +const AddOnParameterListLinkKind = "AddOnParameterListLink" + +// AddOnParameterNilKind is the name of the type used to nil lists of objects of +// type 'add_on_parameter'. +const AddOnParameterListNilKind = "AddOnParameterListNil" + +// AddOnParameterList is a list of values of the 'add_on_parameter' type. +type AddOnParameterList struct { + href string + link bool + items []*AddOnParameter +} + +// Kind returns the name of the type of the object. +func (l *AddOnParameterList) Kind() string { + if l == nil { + return AddOnParameterListNilKind + } + if l.link { + return AddOnParameterListLinkKind + } + return AddOnParameterListKind +} + +// Link returns true iif this is a link. +func (l *AddOnParameterList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnParameterList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnParameterList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnParameterList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnParameterList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnParameterList) Get(i int) *AddOnParameter { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnParameterList) Slice() []*AddOnParameter { + var slice []*AddOnParameter + if l == nil { + slice = make([]*AddOnParameter, 0) + } else { + slice = make([]*AddOnParameter, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnParameterList) Each(f func(item *AddOnParameter) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnParameterList) Range(f func(index int, item *AddOnParameter) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_parameter_type_json.go b/clustersmgmt/v2alpha1/add_on_parameter_type_json.go new file mode 100644 index 00000000..46cfd51c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_parameter_type_json.go @@ -0,0 +1,276 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnParameter writes a value of the 'add_on_parameter' type to the given writer. +func MarshalAddOnParameter(object *AddOnParameter, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnParameter(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnParameter writes a value of the 'add_on_parameter' type to the given stream. +func writeAddOnParameter(object *AddOnParameter, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnParameterLinkKind) + } else { + stream.WriteString(AddOnParameterKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.addon != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("addon") + writeAddOn(object.addon, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.conditions != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("conditions") + writeAddOnRequirementList(object.conditions, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("default_value") + stream.WriteString(object.defaultValue) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("editable") + stream.WriteBool(object.editable) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("editable_direction") + stream.WriteString(object.editableDirection) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.options != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("options") + writeAddOnParameterOptionList(object.options, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("required") + stream.WriteBool(object.required) + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("validation") + stream.WriteString(object.validation) + count++ + } + present_ = object.bitmap_&16384 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("validation_err_msg") + stream.WriteString(object.validationErrMsg) + count++ + } + present_ = object.bitmap_&32768 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value_type") + stream.WriteString(object.valueType) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnParameter reads a value of the 'add_on_parameter' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnParameter(source interface{}) (object *AddOnParameter, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnParameter(iterator) + err = iterator.Error + return +} + +// readAddOnParameter reads a value of the 'add_on_parameter' type from the given iterator. +func readAddOnParameter(iterator *jsoniter.Iterator) *AddOnParameter { + object := &AddOnParameter{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnParameterLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "addon": + value := readAddOn(iterator) + object.addon = value + object.bitmap_ |= 8 + case "conditions": + value := readAddOnRequirementList(iterator) + object.conditions = value + object.bitmap_ |= 16 + case "default_value": + value := iterator.ReadString() + object.defaultValue = value + object.bitmap_ |= 32 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 64 + case "editable": + value := iterator.ReadBool() + object.editable = value + object.bitmap_ |= 128 + case "editable_direction": + value := iterator.ReadString() + object.editableDirection = value + object.bitmap_ |= 256 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 512 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1024 + case "options": + value := readAddOnParameterOptionList(iterator) + object.options = value + object.bitmap_ |= 2048 + case "required": + value := iterator.ReadBool() + object.required = value + object.bitmap_ |= 4096 + case "validation": + value := iterator.ReadString() + object.validation = value + object.bitmap_ |= 8192 + case "validation_err_msg": + value := iterator.ReadString() + object.validationErrMsg = value + object.bitmap_ |= 16384 + case "value_type": + value := iterator.ReadString() + object.valueType = value + object.bitmap_ |= 32768 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_builder.go b/clustersmgmt/v2alpha1/add_on_requirement_builder.go new file mode 100644 index 00000000..00c7d37f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_builder.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnRequirementBuilder contains the data and logic needed to build 'add_on_requirement' objects. +// +// Representation of an add-on requirement. +type AddOnRequirementBuilder struct { + bitmap_ uint32 + id string + data map[string]interface{} + resource string + status *AddOnRequirementStatusBuilder + enabled bool +} + +// NewAddOnRequirement creates a new builder of 'add_on_requirement' objects. +func NewAddOnRequirement() *AddOnRequirementBuilder { + return &AddOnRequirementBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnRequirementBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *AddOnRequirementBuilder) ID(value string) *AddOnRequirementBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// Data sets the value of the 'data' attribute to the given value. +func (b *AddOnRequirementBuilder) Data(value map[string]interface{}) *AddOnRequirementBuilder { + b.data = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AddOnRequirementBuilder) Enabled(value bool) *AddOnRequirementBuilder { + b.enabled = value + b.bitmap_ |= 4 + return b +} + +// Resource sets the value of the 'resource' attribute to the given value. +func (b *AddOnRequirementBuilder) Resource(value string) *AddOnRequirementBuilder { + b.resource = value + b.bitmap_ |= 8 + return b +} + +// Status sets the value of the 'status' attribute to the given value. +// +// Representation of an add-on requirement status. +func (b *AddOnRequirementBuilder) Status(value *AddOnRequirementStatusBuilder) *AddOnRequirementBuilder { + b.status = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnRequirementBuilder) Copy(object *AddOnRequirement) *AddOnRequirementBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + if len(object.data) > 0 { + b.data = map[string]interface{}{} + for k, v := range object.data { + b.data[k] = v + } + } else { + b.data = nil + } + b.enabled = object.enabled + b.resource = object.resource + if object.status != nil { + b.status = NewAddOnRequirementStatus().Copy(object.status) + } else { + b.status = nil + } + return b +} + +// Build creates a 'add_on_requirement' object using the configuration stored in the builder. +func (b *AddOnRequirementBuilder) Build() (object *AddOnRequirement, err error) { + object = new(AddOnRequirement) + object.bitmap_ = b.bitmap_ + object.id = b.id + if b.data != nil { + object.data = make(map[string]interface{}) + for k, v := range b.data { + object.data[k] = v + } + } + object.enabled = b.enabled + object.resource = b.resource + if b.status != nil { + object.status, err = b.status.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_list_builder.go b/clustersmgmt/v2alpha1/add_on_requirement_list_builder.go new file mode 100644 index 00000000..dbcf24cb --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnRequirementListBuilder contains the data and logic needed to build +// 'add_on_requirement' objects. +type AddOnRequirementListBuilder struct { + items []*AddOnRequirementBuilder +} + +// NewAddOnRequirementList creates a new builder of 'add_on_requirement' objects. +func NewAddOnRequirementList() *AddOnRequirementListBuilder { + return new(AddOnRequirementListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnRequirementListBuilder) Items(values ...*AddOnRequirementBuilder) *AddOnRequirementListBuilder { + b.items = make([]*AddOnRequirementBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnRequirementListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnRequirementListBuilder) Copy(list *AddOnRequirementList) *AddOnRequirementListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnRequirementBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnRequirement().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_requirement' objects using the +// configuration stored in the builder. +func (b *AddOnRequirementListBuilder) Build() (list *AddOnRequirementList, err error) { + items := make([]*AddOnRequirement, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnRequirementList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_list_type_json.go b/clustersmgmt/v2alpha1/add_on_requirement_list_type_json.go new file mode 100644 index 00000000..3b0f2463 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnRequirementList writes a list of values of the 'add_on_requirement' type to +// the given writer. +func MarshalAddOnRequirementList(list []*AddOnRequirement, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnRequirementList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnRequirementList writes a list of value of the 'add_on_requirement' type to +// the given stream. +func writeAddOnRequirementList(list []*AddOnRequirement, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnRequirement(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnRequirementList reads a list of values of the 'add_on_requirement' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnRequirementList(source interface{}) (items []*AddOnRequirement, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnRequirementList(iterator) + err = iterator.Error + return +} + +// readAddOnRequirementList reads list of values of the ”add_on_requirement' type from +// the given iterator. +func readAddOnRequirementList(iterator *jsoniter.Iterator) []*AddOnRequirement { + list := []*AddOnRequirement{} + for iterator.ReadArray() { + item := readAddOnRequirement(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_status_builder.go b/clustersmgmt/v2alpha1/add_on_requirement_status_builder.go new file mode 100644 index 00000000..8448185c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_status_builder.go @@ -0,0 +1,82 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnRequirementStatusBuilder contains the data and logic needed to build 'add_on_requirement_status' objects. +// +// Representation of an add-on requirement status. +type AddOnRequirementStatusBuilder struct { + bitmap_ uint32 + errorMsgs []string + fulfilled bool +} + +// NewAddOnRequirementStatus creates a new builder of 'add_on_requirement_status' objects. +func NewAddOnRequirementStatus() *AddOnRequirementStatusBuilder { + return &AddOnRequirementStatusBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnRequirementStatusBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ErrorMsgs sets the value of the 'error_msgs' attribute to the given values. +func (b *AddOnRequirementStatusBuilder) ErrorMsgs(values ...string) *AddOnRequirementStatusBuilder { + b.errorMsgs = make([]string, len(values)) + copy(b.errorMsgs, values) + b.bitmap_ |= 1 + return b +} + +// Fulfilled sets the value of the 'fulfilled' attribute to the given value. +func (b *AddOnRequirementStatusBuilder) Fulfilled(value bool) *AddOnRequirementStatusBuilder { + b.fulfilled = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnRequirementStatusBuilder) Copy(object *AddOnRequirementStatus) *AddOnRequirementStatusBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.errorMsgs != nil { + b.errorMsgs = make([]string, len(object.errorMsgs)) + copy(b.errorMsgs, object.errorMsgs) + } else { + b.errorMsgs = nil + } + b.fulfilled = object.fulfilled + return b +} + +// Build creates a 'add_on_requirement_status' object using the configuration stored in the builder. +func (b *AddOnRequirementStatusBuilder) Build() (object *AddOnRequirementStatus, err error) { + object = new(AddOnRequirementStatus) + object.bitmap_ = b.bitmap_ + if b.errorMsgs != nil { + object.errorMsgs = make([]string, len(b.errorMsgs)) + copy(object.errorMsgs, b.errorMsgs) + } + object.fulfilled = b.fulfilled + return +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_status_list_builder.go b/clustersmgmt/v2alpha1/add_on_requirement_status_list_builder.go new file mode 100644 index 00000000..be7ad757 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_status_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnRequirementStatusListBuilder contains the data and logic needed to build +// 'add_on_requirement_status' objects. +type AddOnRequirementStatusListBuilder struct { + items []*AddOnRequirementStatusBuilder +} + +// NewAddOnRequirementStatusList creates a new builder of 'add_on_requirement_status' objects. +func NewAddOnRequirementStatusList() *AddOnRequirementStatusListBuilder { + return new(AddOnRequirementStatusListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnRequirementStatusListBuilder) Items(values ...*AddOnRequirementStatusBuilder) *AddOnRequirementStatusListBuilder { + b.items = make([]*AddOnRequirementStatusBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnRequirementStatusListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnRequirementStatusListBuilder) Copy(list *AddOnRequirementStatusList) *AddOnRequirementStatusListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnRequirementStatusBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnRequirementStatus().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_requirement_status' objects using the +// configuration stored in the builder. +func (b *AddOnRequirementStatusListBuilder) Build() (list *AddOnRequirementStatusList, err error) { + items := make([]*AddOnRequirementStatus, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnRequirementStatusList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_status_list_type_json.go b/clustersmgmt/v2alpha1/add_on_requirement_status_list_type_json.go new file mode 100644 index 00000000..95aee664 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_status_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnRequirementStatusList writes a list of values of the 'add_on_requirement_status' type to +// the given writer. +func MarshalAddOnRequirementStatusList(list []*AddOnRequirementStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnRequirementStatusList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnRequirementStatusList writes a list of value of the 'add_on_requirement_status' type to +// the given stream. +func writeAddOnRequirementStatusList(list []*AddOnRequirementStatus, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnRequirementStatus(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnRequirementStatusList reads a list of values of the 'add_on_requirement_status' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnRequirementStatusList(source interface{}) (items []*AddOnRequirementStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnRequirementStatusList(iterator) + err = iterator.Error + return +} + +// readAddOnRequirementStatusList reads list of values of the ”add_on_requirement_status' type from +// the given iterator. +func readAddOnRequirementStatusList(iterator *jsoniter.Iterator) []*AddOnRequirementStatus { + list := []*AddOnRequirementStatus{} + for iterator.ReadArray() { + item := readAddOnRequirementStatus(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_status_type.go b/clustersmgmt/v2alpha1/add_on_requirement_status_type.go new file mode 100644 index 00000000..2c846316 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_status_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnRequirementStatus represents the values of the 'add_on_requirement_status' type. +// +// Representation of an add-on requirement status. +type AddOnRequirementStatus struct { + bitmap_ uint32 + errorMsgs []string + fulfilled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnRequirementStatus) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ErrorMsgs returns the value of the 'error_msgs' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Error messages detailing reasons for unfulfilled requirements. +func (o *AddOnRequirementStatus) ErrorMsgs() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.errorMsgs + } + return nil +} + +// GetErrorMsgs returns the value of the 'error_msgs' attribute and +// a flag indicating if the attribute has a value. +// +// Error messages detailing reasons for unfulfilled requirements. +func (o *AddOnRequirementStatus) GetErrorMsgs() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.errorMsgs + } + return +} + +// Fulfilled returns the value of the 'fulfilled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this requirement is fulfilled. +func (o *AddOnRequirementStatus) Fulfilled() bool { + if o != nil && o.bitmap_&2 != 0 { + return o.fulfilled + } + return false +} + +// GetFulfilled returns the value of the 'fulfilled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this requirement is fulfilled. +func (o *AddOnRequirementStatus) GetFulfilled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.fulfilled + } + return +} + +// AddOnRequirementStatusListKind is the name of the type used to represent list of objects of +// type 'add_on_requirement_status'. +const AddOnRequirementStatusListKind = "AddOnRequirementStatusList" + +// AddOnRequirementStatusListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_requirement_status'. +const AddOnRequirementStatusListLinkKind = "AddOnRequirementStatusListLink" + +// AddOnRequirementStatusNilKind is the name of the type used to nil lists of objects of +// type 'add_on_requirement_status'. +const AddOnRequirementStatusListNilKind = "AddOnRequirementStatusListNil" + +// AddOnRequirementStatusList is a list of values of the 'add_on_requirement_status' type. +type AddOnRequirementStatusList struct { + href string + link bool + items []*AddOnRequirementStatus +} + +// Len returns the length of the list. +func (l *AddOnRequirementStatusList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnRequirementStatusList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnRequirementStatusList) Get(i int) *AddOnRequirementStatus { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnRequirementStatusList) Slice() []*AddOnRequirementStatus { + var slice []*AddOnRequirementStatus + if l == nil { + slice = make([]*AddOnRequirementStatus, 0) + } else { + slice = make([]*AddOnRequirementStatus, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnRequirementStatusList) Each(f func(item *AddOnRequirementStatus) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnRequirementStatusList) Range(f func(index int, item *AddOnRequirementStatus) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_status_type_json.go b/clustersmgmt/v2alpha1/add_on_requirement_status_type_json.go new file mode 100644 index 00000000..c16dc54a --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_status_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnRequirementStatus writes a value of the 'add_on_requirement_status' type to the given writer. +func MarshalAddOnRequirementStatus(object *AddOnRequirementStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnRequirementStatus(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnRequirementStatus writes a value of the 'add_on_requirement_status' type to the given stream. +func writeAddOnRequirementStatus(object *AddOnRequirementStatus, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.errorMsgs != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("error_msgs") + writeStringList(object.errorMsgs, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("fulfilled") + stream.WriteBool(object.fulfilled) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnRequirementStatus reads a value of the 'add_on_requirement_status' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnRequirementStatus(source interface{}) (object *AddOnRequirementStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnRequirementStatus(iterator) + err = iterator.Error + return +} + +// readAddOnRequirementStatus reads a value of the 'add_on_requirement_status' type from the given iterator. +func readAddOnRequirementStatus(iterator *jsoniter.Iterator) *AddOnRequirementStatus { + object := &AddOnRequirementStatus{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "error_msgs": + value := readStringList(iterator) + object.errorMsgs = value + object.bitmap_ |= 1 + case "fulfilled": + value := iterator.ReadBool() + object.fulfilled = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_type.go b/clustersmgmt/v2alpha1/add_on_requirement_type.go new file mode 100644 index 00000000..b438cf89 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_type.go @@ -0,0 +1,238 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnRequirement represents the values of the 'add_on_requirement' type. +// +// Representation of an add-on requirement. +type AddOnRequirement struct { + bitmap_ uint32 + id string + data map[string]interface{} + resource string + status *AddOnRequirementStatus + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnRequirement) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID of the add-on requirement. +func (o *AddOnRequirement) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID of the add-on requirement. +func (o *AddOnRequirement) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// Data returns the value of the 'data' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Data for the add-on requirement. +func (o *AddOnRequirement) Data() map[string]interface{} { + if o != nil && o.bitmap_&2 != 0 { + return o.data + } + return nil +} + +// GetData returns the value of the 'data' attribute and +// a flag indicating if the attribute has a value. +// +// Data for the add-on requirement. +func (o *AddOnRequirement) GetData() (value map[string]interface{}, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.data + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this requirement is enabled for the add-on. +func (o *AddOnRequirement) Enabled() bool { + if o != nil && o.bitmap_&4 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this requirement is enabled for the add-on. +func (o *AddOnRequirement) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.enabled + } + return +} + +// Resource returns the value of the 'resource' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Type of resource of the add-on requirement. +func (o *AddOnRequirement) Resource() string { + if o != nil && o.bitmap_&8 != 0 { + return o.resource + } + return "" +} + +// GetResource returns the value of the 'resource' attribute and +// a flag indicating if the attribute has a value. +// +// Type of resource of the add-on requirement. +func (o *AddOnRequirement) GetResource() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.resource + } + return +} + +// Status returns the value of the 'status' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional cluster specific status for the add-on. +func (o *AddOnRequirement) Status() *AddOnRequirementStatus { + if o != nil && o.bitmap_&16 != 0 { + return o.status + } + return nil +} + +// GetStatus returns the value of the 'status' attribute and +// a flag indicating if the attribute has a value. +// +// Optional cluster specific status for the add-on. +func (o *AddOnRequirement) GetStatus() (value *AddOnRequirementStatus, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.status + } + return +} + +// AddOnRequirementListKind is the name of the type used to represent list of objects of +// type 'add_on_requirement'. +const AddOnRequirementListKind = "AddOnRequirementList" + +// AddOnRequirementListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_requirement'. +const AddOnRequirementListLinkKind = "AddOnRequirementListLink" + +// AddOnRequirementNilKind is the name of the type used to nil lists of objects of +// type 'add_on_requirement'. +const AddOnRequirementListNilKind = "AddOnRequirementListNil" + +// AddOnRequirementList is a list of values of the 'add_on_requirement' type. +type AddOnRequirementList struct { + href string + link bool + items []*AddOnRequirement +} + +// Len returns the length of the list. +func (l *AddOnRequirementList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnRequirementList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnRequirementList) Get(i int) *AddOnRequirement { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnRequirementList) Slice() []*AddOnRequirement { + var slice []*AddOnRequirement + if l == nil { + slice = make([]*AddOnRequirement, 0) + } else { + slice = make([]*AddOnRequirement, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnRequirementList) Each(f func(item *AddOnRequirement) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnRequirementList) Range(f func(index int, item *AddOnRequirement) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_requirement_type_json.go b/clustersmgmt/v2alpha1/add_on_requirement_type_json.go new file mode 100644 index 00000000..37b11834 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_requirement_type_json.go @@ -0,0 +1,168 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnRequirement writes a value of the 'add_on_requirement' type to the given writer. +func MarshalAddOnRequirement(object *AddOnRequirement, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnRequirement(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnRequirement writes a value of the 'add_on_requirement' type to the given stream. +func writeAddOnRequirement(object *AddOnRequirement, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 && object.data != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("data") + if object.data != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.data)) + i := 0 + for key := range object.data { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.data[key] + stream.WriteObjectField(key) + stream.WriteVal(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource") + stream.WriteString(object.resource) + count++ + } + present_ = object.bitmap_&16 != 0 && object.status != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("status") + writeAddOnRequirementStatus(object.status, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnRequirement reads a value of the 'add_on_requirement' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnRequirement(source interface{}) (object *AddOnRequirement, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnRequirement(iterator) + err = iterator.Error + return +} + +// readAddOnRequirement reads a value of the 'add_on_requirement' type from the given iterator. +func readAddOnRequirement(iterator *jsoniter.Iterator) *AddOnRequirement { + object := &AddOnRequirement{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "data": + value := map[string]interface{}{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + var item interface{} + iterator.ReadVal(&item) + value[key] = item + } + object.data = value + object.bitmap_ |= 2 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 4 + case "resource": + value := iterator.ReadString() + object.resource = value + object.bitmap_ |= 8 + case "status": + value := readAddOnRequirementStatus(iterator) + object.status = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_resource_json.go b/clustersmgmt/v2alpha1/add_on_resource_json.go new file mode 100644 index 00000000..5c16bc2f --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAddOnDeleteRequest(request *AddOnDeleteRequest, writer io.Writer) error { + return nil +} +func readAddOnDeleteResponse(response *AddOnDeleteResponse, reader io.Reader) error { + return nil +} +func writeAddOnGetRequest(request *AddOnGetRequest, writer io.Writer) error { + return nil +} +func readAddOnGetResponse(response *AddOnGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOn(reader) + return err +} +func writeAddOnUpdateRequest(request *AddOnUpdateRequest, writer io.Writer) error { + return MarshalAddOn(request.body, writer) +} +func readAddOnUpdateResponse(response *AddOnUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOn(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/add_on_secret_propagation_builder.go b/clustersmgmt/v2alpha1/add_on_secret_propagation_builder.go new file mode 100644 index 00000000..d970f108 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_secret_propagation_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnSecretPropagationBuilder contains the data and logic needed to build 'add_on_secret_propagation' objects. +// +// Representation of an addon secret propagation +type AddOnSecretPropagationBuilder struct { + bitmap_ uint32 + id string + destinationSecret string + sourceSecret string + enabled bool +} + +// NewAddOnSecretPropagation creates a new builder of 'add_on_secret_propagation' objects. +func NewAddOnSecretPropagation() *AddOnSecretPropagationBuilder { + return &AddOnSecretPropagationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnSecretPropagationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *AddOnSecretPropagationBuilder) ID(value string) *AddOnSecretPropagationBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// DestinationSecret sets the value of the 'destination_secret' attribute to the given value. +func (b *AddOnSecretPropagationBuilder) DestinationSecret(value string) *AddOnSecretPropagationBuilder { + b.destinationSecret = value + b.bitmap_ |= 2 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AddOnSecretPropagationBuilder) Enabled(value bool) *AddOnSecretPropagationBuilder { + b.enabled = value + b.bitmap_ |= 4 + return b +} + +// SourceSecret sets the value of the 'source_secret' attribute to the given value. +func (b *AddOnSecretPropagationBuilder) SourceSecret(value string) *AddOnSecretPropagationBuilder { + b.sourceSecret = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnSecretPropagationBuilder) Copy(object *AddOnSecretPropagation) *AddOnSecretPropagationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.destinationSecret = object.destinationSecret + b.enabled = object.enabled + b.sourceSecret = object.sourceSecret + return b +} + +// Build creates a 'add_on_secret_propagation' object using the configuration stored in the builder. +func (b *AddOnSecretPropagationBuilder) Build() (object *AddOnSecretPropagation, err error) { + object = new(AddOnSecretPropagation) + object.bitmap_ = b.bitmap_ + object.id = b.id + object.destinationSecret = b.destinationSecret + object.enabled = b.enabled + object.sourceSecret = b.sourceSecret + return +} diff --git a/clustersmgmt/v2alpha1/add_on_secret_propagation_list_builder.go b/clustersmgmt/v2alpha1/add_on_secret_propagation_list_builder.go new file mode 100644 index 00000000..8887ddd3 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_secret_propagation_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnSecretPropagationListBuilder contains the data and logic needed to build +// 'add_on_secret_propagation' objects. +type AddOnSecretPropagationListBuilder struct { + items []*AddOnSecretPropagationBuilder +} + +// NewAddOnSecretPropagationList creates a new builder of 'add_on_secret_propagation' objects. +func NewAddOnSecretPropagationList() *AddOnSecretPropagationListBuilder { + return new(AddOnSecretPropagationListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnSecretPropagationListBuilder) Items(values ...*AddOnSecretPropagationBuilder) *AddOnSecretPropagationListBuilder { + b.items = make([]*AddOnSecretPropagationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnSecretPropagationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnSecretPropagationListBuilder) Copy(list *AddOnSecretPropagationList) *AddOnSecretPropagationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnSecretPropagationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnSecretPropagation().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_secret_propagation' objects using the +// configuration stored in the builder. +func (b *AddOnSecretPropagationListBuilder) Build() (list *AddOnSecretPropagationList, err error) { + items := make([]*AddOnSecretPropagation, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnSecretPropagationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_secret_propagation_list_type_json.go b/clustersmgmt/v2alpha1/add_on_secret_propagation_list_type_json.go new file mode 100644 index 00000000..c6a4ae4c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_secret_propagation_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnSecretPropagationList writes a list of values of the 'add_on_secret_propagation' type to +// the given writer. +func MarshalAddOnSecretPropagationList(list []*AddOnSecretPropagation, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnSecretPropagationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnSecretPropagationList writes a list of value of the 'add_on_secret_propagation' type to +// the given stream. +func writeAddOnSecretPropagationList(list []*AddOnSecretPropagation, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnSecretPropagation(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnSecretPropagationList reads a list of values of the 'add_on_secret_propagation' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnSecretPropagationList(source interface{}) (items []*AddOnSecretPropagation, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnSecretPropagationList(iterator) + err = iterator.Error + return +} + +// readAddOnSecretPropagationList reads list of values of the ”add_on_secret_propagation' type from +// the given iterator. +func readAddOnSecretPropagationList(iterator *jsoniter.Iterator) []*AddOnSecretPropagation { + list := []*AddOnSecretPropagation{} + for iterator.ReadArray() { + item := readAddOnSecretPropagation(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_secret_propagation_type.go b/clustersmgmt/v2alpha1/add_on_secret_propagation_type.go new file mode 100644 index 00000000..d6a68a01 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_secret_propagation_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnSecretPropagation represents the values of the 'add_on_secret_propagation' type. +// +// Representation of an addon secret propagation +type AddOnSecretPropagation struct { + bitmap_ uint32 + id string + destinationSecret string + sourceSecret string + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnSecretPropagation) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID of the secret propagation +func (o *AddOnSecretPropagation) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID of the secret propagation +func (o *AddOnSecretPropagation) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// DestinationSecret returns the value of the 'destination_secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// DestinationSecret is location of the secret to be added +func (o *AddOnSecretPropagation) DestinationSecret() string { + if o != nil && o.bitmap_&2 != 0 { + return o.destinationSecret + } + return "" +} + +// GetDestinationSecret returns the value of the 'destination_secret' attribute and +// a flag indicating if the attribute has a value. +// +// DestinationSecret is location of the secret to be added +func (o *AddOnSecretPropagation) GetDestinationSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.destinationSecret + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates is this secret propagation is enabled for the addon +func (o *AddOnSecretPropagation) Enabled() bool { + if o != nil && o.bitmap_&4 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates is this secret propagation is enabled for the addon +func (o *AddOnSecretPropagation) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.enabled + } + return +} + +// SourceSecret returns the value of the 'source_secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// SourceSecret is location of the source secret +func (o *AddOnSecretPropagation) SourceSecret() string { + if o != nil && o.bitmap_&8 != 0 { + return o.sourceSecret + } + return "" +} + +// GetSourceSecret returns the value of the 'source_secret' attribute and +// a flag indicating if the attribute has a value. +// +// SourceSecret is location of the source secret +func (o *AddOnSecretPropagation) GetSourceSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.sourceSecret + } + return +} + +// AddOnSecretPropagationListKind is the name of the type used to represent list of objects of +// type 'add_on_secret_propagation'. +const AddOnSecretPropagationListKind = "AddOnSecretPropagationList" + +// AddOnSecretPropagationListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_secret_propagation'. +const AddOnSecretPropagationListLinkKind = "AddOnSecretPropagationListLink" + +// AddOnSecretPropagationNilKind is the name of the type used to nil lists of objects of +// type 'add_on_secret_propagation'. +const AddOnSecretPropagationListNilKind = "AddOnSecretPropagationListNil" + +// AddOnSecretPropagationList is a list of values of the 'add_on_secret_propagation' type. +type AddOnSecretPropagationList struct { + href string + link bool + items []*AddOnSecretPropagation +} + +// Len returns the length of the list. +func (l *AddOnSecretPropagationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnSecretPropagationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnSecretPropagationList) Get(i int) *AddOnSecretPropagation { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnSecretPropagationList) Slice() []*AddOnSecretPropagation { + var slice []*AddOnSecretPropagation + if l == nil { + slice = make([]*AddOnSecretPropagation, 0) + } else { + slice = make([]*AddOnSecretPropagation, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnSecretPropagationList) Each(f func(item *AddOnSecretPropagation) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnSecretPropagationList) Range(f func(index int, item *AddOnSecretPropagation) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_secret_propagation_type_json.go b/clustersmgmt/v2alpha1/add_on_secret_propagation_type_json.go new file mode 100644 index 00000000..322836da --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_secret_propagation_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnSecretPropagation writes a value of the 'add_on_secret_propagation' type to the given writer. +func MarshalAddOnSecretPropagation(object *AddOnSecretPropagation, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnSecretPropagation(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnSecretPropagation writes a value of the 'add_on_secret_propagation' type to the given stream. +func writeAddOnSecretPropagation(object *AddOnSecretPropagation, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("destination_secret") + stream.WriteString(object.destinationSecret) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("source_secret") + stream.WriteString(object.sourceSecret) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnSecretPropagation reads a value of the 'add_on_secret_propagation' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnSecretPropagation(source interface{}) (object *AddOnSecretPropagation, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnSecretPropagation(iterator) + err = iterator.Error + return +} + +// readAddOnSecretPropagation reads a value of the 'add_on_secret_propagation' type from the given iterator. +func readAddOnSecretPropagation(iterator *jsoniter.Iterator) *AddOnSecretPropagation { + object := &AddOnSecretPropagation{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "destination_secret": + value := iterator.ReadString() + object.destinationSecret = value + object.bitmap_ |= 2 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 4 + case "source_secret": + value := iterator.ReadString() + object.sourceSecret = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_sub_operator_builder.go b/clustersmgmt/v2alpha1/add_on_sub_operator_builder.go new file mode 100644 index 00000000..b67ef7de --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_sub_operator_builder.go @@ -0,0 +1,84 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnSubOperatorBuilder contains the data and logic needed to build 'add_on_sub_operator' objects. +// +// Representation of an add-on sub operator. A sub operator is an operator +// who's life cycle is controlled by the add-on umbrella operator. +type AddOnSubOperatorBuilder struct { + bitmap_ uint32 + operatorName string + operatorNamespace string + enabled bool +} + +// NewAddOnSubOperator creates a new builder of 'add_on_sub_operator' objects. +func NewAddOnSubOperator() *AddOnSubOperatorBuilder { + return &AddOnSubOperatorBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnSubOperatorBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AddOnSubOperatorBuilder) Enabled(value bool) *AddOnSubOperatorBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// OperatorName sets the value of the 'operator_name' attribute to the given value. +func (b *AddOnSubOperatorBuilder) OperatorName(value string) *AddOnSubOperatorBuilder { + b.operatorName = value + b.bitmap_ |= 2 + return b +} + +// OperatorNamespace sets the value of the 'operator_namespace' attribute to the given value. +func (b *AddOnSubOperatorBuilder) OperatorNamespace(value string) *AddOnSubOperatorBuilder { + b.operatorNamespace = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnSubOperatorBuilder) Copy(object *AddOnSubOperator) *AddOnSubOperatorBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + b.operatorName = object.operatorName + b.operatorNamespace = object.operatorNamespace + return b +} + +// Build creates a 'add_on_sub_operator' object using the configuration stored in the builder. +func (b *AddOnSubOperatorBuilder) Build() (object *AddOnSubOperator, err error) { + object = new(AddOnSubOperator) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + object.operatorName = b.operatorName + object.operatorNamespace = b.operatorNamespace + return +} diff --git a/clustersmgmt/v2alpha1/add_on_sub_operator_list_builder.go b/clustersmgmt/v2alpha1/add_on_sub_operator_list_builder.go new file mode 100644 index 00000000..d8d7f7a3 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_sub_operator_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnSubOperatorListBuilder contains the data and logic needed to build +// 'add_on_sub_operator' objects. +type AddOnSubOperatorListBuilder struct { + items []*AddOnSubOperatorBuilder +} + +// NewAddOnSubOperatorList creates a new builder of 'add_on_sub_operator' objects. +func NewAddOnSubOperatorList() *AddOnSubOperatorListBuilder { + return new(AddOnSubOperatorListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnSubOperatorListBuilder) Items(values ...*AddOnSubOperatorBuilder) *AddOnSubOperatorListBuilder { + b.items = make([]*AddOnSubOperatorBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnSubOperatorListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnSubOperatorListBuilder) Copy(list *AddOnSubOperatorList) *AddOnSubOperatorListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnSubOperatorBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnSubOperator().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_sub_operator' objects using the +// configuration stored in the builder. +func (b *AddOnSubOperatorListBuilder) Build() (list *AddOnSubOperatorList, err error) { + items := make([]*AddOnSubOperator, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnSubOperatorList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_sub_operator_list_type_json.go b/clustersmgmt/v2alpha1/add_on_sub_operator_list_type_json.go new file mode 100644 index 00000000..93f37d1d --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_sub_operator_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnSubOperatorList writes a list of values of the 'add_on_sub_operator' type to +// the given writer. +func MarshalAddOnSubOperatorList(list []*AddOnSubOperator, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnSubOperatorList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnSubOperatorList writes a list of value of the 'add_on_sub_operator' type to +// the given stream. +func writeAddOnSubOperatorList(list []*AddOnSubOperator, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnSubOperator(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnSubOperatorList reads a list of values of the 'add_on_sub_operator' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnSubOperatorList(source interface{}) (items []*AddOnSubOperator, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnSubOperatorList(iterator) + err = iterator.Error + return +} + +// readAddOnSubOperatorList reads list of values of the ”add_on_sub_operator' type from +// the given iterator. +func readAddOnSubOperatorList(iterator *jsoniter.Iterator) []*AddOnSubOperator { + list := []*AddOnSubOperator{} + for iterator.ReadArray() { + item := readAddOnSubOperator(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_sub_operator_type.go b/clustersmgmt/v2alpha1/add_on_sub_operator_type.go new file mode 100644 index 00000000..0b3cf52d --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_sub_operator_type.go @@ -0,0 +1,191 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnSubOperator represents the values of the 'add_on_sub_operator' type. +// +// Representation of an add-on sub operator. A sub operator is an operator +// who's life cycle is controlled by the add-on umbrella operator. +type AddOnSubOperator struct { + bitmap_ uint32 + operatorName string + operatorNamespace string + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnSubOperator) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if the sub operator is enabled for the add-on +func (o *AddOnSubOperator) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if the sub operator is enabled for the add-on +func (o *AddOnSubOperator) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// OperatorName returns the value of the 'operator_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the add-on sub operator +func (o *AddOnSubOperator) OperatorName() string { + if o != nil && o.bitmap_&2 != 0 { + return o.operatorName + } + return "" +} + +// GetOperatorName returns the value of the 'operator_name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the add-on sub operator +func (o *AddOnSubOperator) GetOperatorName() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.operatorName + } + return +} + +// OperatorNamespace returns the value of the 'operator_namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Namespace of the add-on sub operator +func (o *AddOnSubOperator) OperatorNamespace() string { + if o != nil && o.bitmap_&4 != 0 { + return o.operatorNamespace + } + return "" +} + +// GetOperatorNamespace returns the value of the 'operator_namespace' attribute and +// a flag indicating if the attribute has a value. +// +// Namespace of the add-on sub operator +func (o *AddOnSubOperator) GetOperatorNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.operatorNamespace + } + return +} + +// AddOnSubOperatorListKind is the name of the type used to represent list of objects of +// type 'add_on_sub_operator'. +const AddOnSubOperatorListKind = "AddOnSubOperatorList" + +// AddOnSubOperatorListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_sub_operator'. +const AddOnSubOperatorListLinkKind = "AddOnSubOperatorListLink" + +// AddOnSubOperatorNilKind is the name of the type used to nil lists of objects of +// type 'add_on_sub_operator'. +const AddOnSubOperatorListNilKind = "AddOnSubOperatorListNil" + +// AddOnSubOperatorList is a list of values of the 'add_on_sub_operator' type. +type AddOnSubOperatorList struct { + href string + link bool + items []*AddOnSubOperator +} + +// Len returns the length of the list. +func (l *AddOnSubOperatorList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnSubOperatorList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnSubOperatorList) Get(i int) *AddOnSubOperator { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnSubOperatorList) Slice() []*AddOnSubOperator { + var slice []*AddOnSubOperator + if l == nil { + slice = make([]*AddOnSubOperator, 0) + } else { + slice = make([]*AddOnSubOperator, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnSubOperatorList) Each(f func(item *AddOnSubOperator) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnSubOperatorList) Range(f func(index int, item *AddOnSubOperator) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_sub_operator_type_json.go b/clustersmgmt/v2alpha1/add_on_sub_operator_type_json.go new file mode 100644 index 00000000..41f877c9 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_sub_operator_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnSubOperator writes a value of the 'add_on_sub_operator' type to the given writer. +func MarshalAddOnSubOperator(object *AddOnSubOperator, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnSubOperator(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnSubOperator writes a value of the 'add_on_sub_operator' type to the given stream. +func writeAddOnSubOperator(object *AddOnSubOperator, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator_name") + stream.WriteString(object.operatorName) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator_namespace") + stream.WriteString(object.operatorNamespace) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnSubOperator reads a value of the 'add_on_sub_operator' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnSubOperator(source interface{}) (object *AddOnSubOperator, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnSubOperator(iterator) + err = iterator.Error + return +} + +// readAddOnSubOperator reads a value of the 'add_on_sub_operator' type from the given iterator. +func readAddOnSubOperator(iterator *jsoniter.Iterator) *AddOnSubOperator { + object := &AddOnSubOperator{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + case "operator_name": + value := iterator.ReadString() + object.operatorName = value + object.bitmap_ |= 2 + case "operator_namespace": + value := iterator.ReadString() + object.operatorNamespace = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_type.go b/clustersmgmt/v2alpha1/add_on_type.go new file mode 100644 index 00000000..815600e4 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_type.go @@ -0,0 +1,770 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnKind is the name of the type used to represent objects +// of type 'add_on'. +const AddOnKind = "AddOn" + +// AddOnLinkKind is the name of the type used to represent links +// to objects of type 'add_on'. +const AddOnLinkKind = "AddOnLink" + +// AddOnNilKind is the name of the type used to nil references +// to objects of type 'add_on'. +const AddOnNilKind = "AddOnNil" + +// AddOn represents the values of the 'add_on' type. +// +// Representation of an add-on that can be installed in a cluster. +type AddOn struct { + bitmap_ uint32 + id string + href string + commonAnnotations map[string]string + commonLabels map[string]string + config *AddOnConfig + credentialsRequests []*CredentialRequest + description string + docsLink string + icon string + installMode AddOnInstallMode + label string + name string + namespaces []*AddOnNamespace + operatorName string + parameters *AddOnParameterList + requirements []*AddOnRequirement + resourceCost float64 + resourceName string + subOperators []*AddOnSubOperator + targetNamespace string + version *AddOnVersion + enabled bool + hasExternalResources bool + hidden bool + managedService bool +} + +// Kind returns the name of the type of the object. +func (o *AddOn) Kind() string { + if o == nil { + return AddOnNilKind + } + if o.bitmap_&1 != 0 { + return AddOnLinkKind + } + return AddOnKind +} + +// Link returns true iif this is a link. +func (o *AddOn) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOn) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOn) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOn) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOn) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOn) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// CommonAnnotations returns the value of the 'common_annotations' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Common annotations to be applied to all resources created by this addon. +func (o *AddOn) CommonAnnotations() map[string]string { + if o != nil && o.bitmap_&8 != 0 { + return o.commonAnnotations + } + return nil +} + +// GetCommonAnnotations returns the value of the 'common_annotations' attribute and +// a flag indicating if the attribute has a value. +// +// Common annotations to be applied to all resources created by this addon. +func (o *AddOn) GetCommonAnnotations() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.commonAnnotations + } + return +} + +// CommonLabels returns the value of the 'common_labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Common labels to be applied to all resources created by this addon. +func (o *AddOn) CommonLabels() map[string]string { + if o != nil && o.bitmap_&16 != 0 { + return o.commonLabels + } + return nil +} + +// GetCommonLabels returns the value of the 'common_labels' attribute and +// a flag indicating if the attribute has a value. +// +// Common labels to be applied to all resources created by this addon. +func (o *AddOn) GetCommonLabels() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.commonLabels + } + return +} + +// Config returns the value of the 'config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional configs to be used by the addon once its installed in the cluster. +func (o *AddOn) Config() *AddOnConfig { + if o != nil && o.bitmap_&32 != 0 { + return o.config + } + return nil +} + +// GetConfig returns the value of the 'config' attribute and +// a flag indicating if the attribute has a value. +// +// Additional configs to be used by the addon once its installed in the cluster. +func (o *AddOn) GetConfig() (value *AddOnConfig, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.config + } + return +} + +// CredentialsRequests returns the value of the 'credentials_requests' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of credentials requests to authenticate operators to access cloud resources. +func (o *AddOn) CredentialsRequests() []*CredentialRequest { + if o != nil && o.bitmap_&64 != 0 { + return o.credentialsRequests + } + return nil +} + +// GetCredentialsRequests returns the value of the 'credentials_requests' attribute and +// a flag indicating if the attribute has a value. +// +// List of credentials requests to authenticate operators to access cloud resources. +func (o *AddOn) GetCredentialsRequests() (value []*CredentialRequest, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.credentialsRequests + } + return +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the add-on. +func (o *AddOn) Description() string { + if o != nil && o.bitmap_&128 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the add-on. +func (o *AddOn) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.description + } + return +} + +// DocsLink returns the value of the 'docs_link' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to documentation about the add-on. +func (o *AddOn) DocsLink() string { + if o != nil && o.bitmap_&256 != 0 { + return o.docsLink + } + return "" +} + +// GetDocsLink returns the value of the 'docs_link' attribute and +// a flag indicating if the attribute has a value. +// +// Link to documentation about the add-on. +func (o *AddOn) GetDocsLink() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.docsLink + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this add-on can be added to clusters. +func (o *AddOn) Enabled() bool { + if o != nil && o.bitmap_&512 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this add-on can be added to clusters. +func (o *AddOn) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.enabled + } + return +} + +// HasExternalResources returns the value of the 'has_external_resources' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this add-on has external resources associated with it +func (o *AddOn) HasExternalResources() bool { + if o != nil && o.bitmap_&1024 != 0 { + return o.hasExternalResources + } + return false +} + +// GetHasExternalResources returns the value of the 'has_external_resources' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this add-on has external resources associated with it +func (o *AddOn) GetHasExternalResources() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.hasExternalResources + } + return +} + +// Hidden returns the value of the 'hidden' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this add-on is hidden. +func (o *AddOn) Hidden() bool { + if o != nil && o.bitmap_&2048 != 0 { + return o.hidden + } + return false +} + +// GetHidden returns the value of the 'hidden' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this add-on is hidden. +func (o *AddOn) GetHidden() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.hidden + } + return +} + +// Icon returns the value of the 'icon' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Base64-encoded icon representing an add-on. The icon should be in PNG format. +func (o *AddOn) Icon() string { + if o != nil && o.bitmap_&4096 != 0 { + return o.icon + } + return "" +} + +// GetIcon returns the value of the 'icon' attribute and +// a flag indicating if the attribute has a value. +// +// Base64-encoded icon representing an add-on. The icon should be in PNG format. +func (o *AddOn) GetIcon() (value string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.icon + } + return +} + +// InstallMode returns the value of the 'install_mode' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The mode in which the addon is deployed. +func (o *AddOn) InstallMode() AddOnInstallMode { + if o != nil && o.bitmap_&8192 != 0 { + return o.installMode + } + return AddOnInstallMode("") +} + +// GetInstallMode returns the value of the 'install_mode' attribute and +// a flag indicating if the attribute has a value. +// +// The mode in which the addon is deployed. +func (o *AddOn) GetInstallMode() (value AddOnInstallMode, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.installMode + } + return +} + +// Label returns the value of the 'label' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Label used to attach to a cluster deployment when add-on is installed. +func (o *AddOn) Label() string { + if o != nil && o.bitmap_&16384 != 0 { + return o.label + } + return "" +} + +// GetLabel returns the value of the 'label' attribute and +// a flag indicating if the attribute has a value. +// +// Label used to attach to a cluster deployment when add-on is installed. +func (o *AddOn) GetLabel() (value string, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.label + } + return +} + +// ManagedService returns the value of the 'managed_service' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if add-on is part of a managed service +func (o *AddOn) ManagedService() bool { + if o != nil && o.bitmap_&32768 != 0 { + return o.managedService + } + return false +} + +// GetManagedService returns the value of the 'managed_service' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if add-on is part of a managed service +func (o *AddOn) GetManagedService() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32768 != 0 + if ok { + value = o.managedService + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the add-on. +func (o *AddOn) Name() string { + if o != nil && o.bitmap_&65536 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the add-on. +func (o *AddOn) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&65536 != 0 + if ok { + value = o.name + } + return +} + +// Namespaces returns the value of the 'namespaces' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Namespaces which are required by this addon. +func (o *AddOn) Namespaces() []*AddOnNamespace { + if o != nil && o.bitmap_&131072 != 0 { + return o.namespaces + } + return nil +} + +// GetNamespaces returns the value of the 'namespaces' attribute and +// a flag indicating if the attribute has a value. +// +// Namespaces which are required by this addon. +func (o *AddOn) GetNamespaces() (value []*AddOnNamespace, ok bool) { + ok = o != nil && o.bitmap_&131072 != 0 + if ok { + value = o.namespaces + } + return +} + +// OperatorName returns the value of the 'operator_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The name of the operator installed by this add-on. +func (o *AddOn) OperatorName() string { + if o != nil && o.bitmap_&262144 != 0 { + return o.operatorName + } + return "" +} + +// GetOperatorName returns the value of the 'operator_name' attribute and +// a flag indicating if the attribute has a value. +// +// The name of the operator installed by this add-on. +func (o *AddOn) GetOperatorName() (value string, ok bool) { + ok = o != nil && o.bitmap_&262144 != 0 + if ok { + value = o.operatorName + } + return +} + +// Parameters returns the value of the 'parameters' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of parameters for this add-on. +func (o *AddOn) Parameters() *AddOnParameterList { + if o != nil && o.bitmap_&524288 != 0 { + return o.parameters + } + return nil +} + +// GetParameters returns the value of the 'parameters' attribute and +// a flag indicating if the attribute has a value. +// +// List of parameters for this add-on. +func (o *AddOn) GetParameters() (value *AddOnParameterList, ok bool) { + ok = o != nil && o.bitmap_&524288 != 0 + if ok { + value = o.parameters + } + return +} + +// Requirements returns the value of the 'requirements' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of requirements for this add-on. +func (o *AddOn) Requirements() []*AddOnRequirement { + if o != nil && o.bitmap_&1048576 != 0 { + return o.requirements + } + return nil +} + +// GetRequirements returns the value of the 'requirements' attribute and +// a flag indicating if the attribute has a value. +// +// List of requirements for this add-on. +func (o *AddOn) GetRequirements() (value []*AddOnRequirement, ok bool) { + ok = o != nil && o.bitmap_&1048576 != 0 + if ok { + value = o.requirements + } + return +} + +// ResourceCost returns the value of the 'resource_cost' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Used to determine how many units of quota an add-on consumes per resource name. +func (o *AddOn) ResourceCost() float64 { + if o != nil && o.bitmap_&2097152 != 0 { + return o.resourceCost + } + return 0.0 +} + +// GetResourceCost returns the value of the 'resource_cost' attribute and +// a flag indicating if the attribute has a value. +// +// Used to determine how many units of quota an add-on consumes per resource name. +func (o *AddOn) GetResourceCost() (value float64, ok bool) { + ok = o != nil && o.bitmap_&2097152 != 0 + if ok { + value = o.resourceCost + } + return +} + +// ResourceName returns the value of the 'resource_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Used to determine from where to reserve quota for this add-on. +func (o *AddOn) ResourceName() string { + if o != nil && o.bitmap_&4194304 != 0 { + return o.resourceName + } + return "" +} + +// GetResourceName returns the value of the 'resource_name' attribute and +// a flag indicating if the attribute has a value. +// +// Used to determine from where to reserve quota for this add-on. +func (o *AddOn) GetResourceName() (value string, ok bool) { + ok = o != nil && o.bitmap_&4194304 != 0 + if ok { + value = o.resourceName + } + return +} + +// SubOperators returns the value of the 'sub_operators' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of sub operators for this add-on. +func (o *AddOn) SubOperators() []*AddOnSubOperator { + if o != nil && o.bitmap_&8388608 != 0 { + return o.subOperators + } + return nil +} + +// GetSubOperators returns the value of the 'sub_operators' attribute and +// a flag indicating if the attribute has a value. +// +// List of sub operators for this add-on. +func (o *AddOn) GetSubOperators() (value []*AddOnSubOperator, ok bool) { + ok = o != nil && o.bitmap_&8388608 != 0 + if ok { + value = o.subOperators + } + return +} + +// TargetNamespace returns the value of the 'target_namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The namespace in which the addon CRD exists. +func (o *AddOn) TargetNamespace() string { + if o != nil && o.bitmap_&16777216 != 0 { + return o.targetNamespace + } + return "" +} + +// GetTargetNamespace returns the value of the 'target_namespace' attribute and +// a flag indicating if the attribute has a value. +// +// The namespace in which the addon CRD exists. +func (o *AddOn) GetTargetNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&16777216 != 0 + if ok { + value = o.targetNamespace + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the current default version of this add-on. +func (o *AddOn) Version() *AddOnVersion { + if o != nil && o.bitmap_&33554432 != 0 { + return o.version + } + return nil +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the current default version of this add-on. +func (o *AddOn) GetVersion() (value *AddOnVersion, ok bool) { + ok = o != nil && o.bitmap_&33554432 != 0 + if ok { + value = o.version + } + return +} + +// AddOnListKind is the name of the type used to represent list of objects of +// type 'add_on'. +const AddOnListKind = "AddOnList" + +// AddOnListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on'. +const AddOnListLinkKind = "AddOnListLink" + +// AddOnNilKind is the name of the type used to nil lists of objects of +// type 'add_on'. +const AddOnListNilKind = "AddOnListNil" + +// AddOnList is a list of values of the 'add_on' type. +type AddOnList struct { + href string + link bool + items []*AddOn +} + +// Kind returns the name of the type of the object. +func (l *AddOnList) Kind() string { + if l == nil { + return AddOnListNilKind + } + if l.link { + return AddOnListLinkKind + } + return AddOnListKind +} + +// Link returns true iif this is a link. +func (l *AddOnList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnList) Get(i int) *AddOn { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnList) Slice() []*AddOn { + var slice []*AddOn + if l == nil { + slice = make([]*AddOn, 0) + } else { + slice = make([]*AddOn, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnList) Each(f func(item *AddOn) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnList) Range(f func(index int, item *AddOn) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_type_json.go b/clustersmgmt/v2alpha1/add_on_type_json.go new file mode 100644 index 00000000..e236a378 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_type_json.go @@ -0,0 +1,484 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOn writes a value of the 'add_on' type to the given writer. +func MarshalAddOn(object *AddOn, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOn(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOn writes a value of the 'add_on' type to the given stream. +func writeAddOn(object *AddOn, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnLinkKind) + } else { + stream.WriteString(AddOnKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.commonAnnotations != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("common_annotations") + if object.commonAnnotations != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.commonAnnotations)) + i := 0 + for key := range object.commonAnnotations { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.commonAnnotations[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&16 != 0 && object.commonLabels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("common_labels") + if object.commonLabels != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.commonLabels)) + i := 0 + for key := range object.commonLabels { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.commonLabels[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&32 != 0 && object.config != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("config") + writeAddOnConfig(object.config, stream) + count++ + } + present_ = object.bitmap_&64 != 0 && object.credentialsRequests != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("credentials_requests") + writeCredentialRequestList(object.credentialsRequests, stream) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("docs_link") + stream.WriteString(object.docsLink) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("has_external_resources") + stream.WriteBool(object.hasExternalResources) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hidden") + stream.WriteBool(object.hidden) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("icon") + stream.WriteString(object.icon) + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("install_mode") + stream.WriteString(string(object.installMode)) + count++ + } + present_ = object.bitmap_&16384 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("label") + stream.WriteString(object.label) + count++ + } + present_ = object.bitmap_&32768 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managed_service") + stream.WriteBool(object.managedService) + count++ + } + present_ = object.bitmap_&65536 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&131072 != 0 && object.namespaces != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("namespaces") + writeAddOnNamespaceList(object.namespaces, stream) + count++ + } + present_ = object.bitmap_&262144 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator_name") + stream.WriteString(object.operatorName) + count++ + } + present_ = object.bitmap_&524288 != 0 && object.parameters != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("parameters") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeAddOnParameterList(object.parameters.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&1048576 != 0 && object.requirements != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("requirements") + writeAddOnRequirementList(object.requirements, stream) + count++ + } + present_ = object.bitmap_&2097152 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource_cost") + stream.WriteFloat64(object.resourceCost) + count++ + } + present_ = object.bitmap_&4194304 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource_name") + stream.WriteString(object.resourceName) + count++ + } + present_ = object.bitmap_&8388608 != 0 && object.subOperators != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("sub_operators") + writeAddOnSubOperatorList(object.subOperators, stream) + count++ + } + present_ = object.bitmap_&16777216 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("target_namespace") + stream.WriteString(object.targetNamespace) + count++ + } + present_ = object.bitmap_&33554432 != 0 && object.version != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + writeAddOnVersion(object.version, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOn reads a value of the 'add_on' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOn(source interface{}) (object *AddOn, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOn(iterator) + err = iterator.Error + return +} + +// readAddOn reads a value of the 'add_on' type from the given iterator. +func readAddOn(iterator *jsoniter.Iterator) *AddOn { + object := &AddOn{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "common_annotations": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.commonAnnotations = value + object.bitmap_ |= 8 + case "common_labels": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.commonLabels = value + object.bitmap_ |= 16 + case "config": + value := readAddOnConfig(iterator) + object.config = value + object.bitmap_ |= 32 + case "credentials_requests": + value := readCredentialRequestList(iterator) + object.credentialsRequests = value + object.bitmap_ |= 64 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 128 + case "docs_link": + value := iterator.ReadString() + object.docsLink = value + object.bitmap_ |= 256 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 512 + case "has_external_resources": + value := iterator.ReadBool() + object.hasExternalResources = value + object.bitmap_ |= 1024 + case "hidden": + value := iterator.ReadBool() + object.hidden = value + object.bitmap_ |= 2048 + case "icon": + value := iterator.ReadString() + object.icon = value + object.bitmap_ |= 4096 + case "install_mode": + text := iterator.ReadString() + value := AddOnInstallMode(text) + object.installMode = value + object.bitmap_ |= 8192 + case "label": + value := iterator.ReadString() + object.label = value + object.bitmap_ |= 16384 + case "managed_service": + value := iterator.ReadBool() + object.managedService = value + object.bitmap_ |= 32768 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 65536 + case "namespaces": + value := readAddOnNamespaceList(iterator) + object.namespaces = value + object.bitmap_ |= 131072 + case "operator_name": + value := iterator.ReadString() + object.operatorName = value + object.bitmap_ |= 262144 + case "parameters": + value := &AddOnParameterList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == AddOnParameterListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readAddOnParameterList(iterator) + default: + iterator.ReadAny() + } + } + object.parameters = value + object.bitmap_ |= 524288 + case "requirements": + value := readAddOnRequirementList(iterator) + object.requirements = value + object.bitmap_ |= 1048576 + case "resource_cost": + value := iterator.ReadFloat64() + object.resourceCost = value + object.bitmap_ |= 2097152 + case "resource_name": + value := iterator.ReadString() + object.resourceName = value + object.bitmap_ |= 4194304 + case "sub_operators": + value := readAddOnSubOperatorList(iterator) + object.subOperators = value + object.bitmap_ |= 8388608 + case "target_namespace": + value := iterator.ReadString() + object.targetNamespace = value + object.bitmap_ |= 16777216 + case "version": + value := readAddOnVersion(iterator) + object.version = value + object.bitmap_ |= 33554432 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_version_builder.go b/clustersmgmt/v2alpha1/add_on_version_builder.go new file mode 100644 index 00000000..17c94e8c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_builder.go @@ -0,0 +1,271 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnVersionBuilder contains the data and logic needed to build 'add_on_version' objects. +// +// Representation of an add-on version. +type AddOnVersionBuilder struct { + bitmap_ uint32 + id string + href string + additionalCatalogSources []*AdditionalCatalogSourceBuilder + availableUpgrades []string + channel string + config *AddOnConfigBuilder + packageImage string + parameters *AddOnParameterListBuilder + pullSecretName string + requirements []*AddOnRequirementBuilder + sourceImage string + subOperators []*AddOnSubOperatorBuilder + enabled bool +} + +// NewAddOnVersion creates a new builder of 'add_on_version' objects. +func NewAddOnVersion() *AddOnVersionBuilder { + return &AddOnVersionBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddOnVersionBuilder) Link(value bool) *AddOnVersionBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddOnVersionBuilder) ID(value string) *AddOnVersionBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddOnVersionBuilder) HREF(value string) *AddOnVersionBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddOnVersionBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AdditionalCatalogSources sets the value of the 'additional_catalog_sources' attribute to the given values. +func (b *AddOnVersionBuilder) AdditionalCatalogSources(values ...*AdditionalCatalogSourceBuilder) *AddOnVersionBuilder { + b.additionalCatalogSources = make([]*AdditionalCatalogSourceBuilder, len(values)) + copy(b.additionalCatalogSources, values) + b.bitmap_ |= 8 + return b +} + +// AvailableUpgrades sets the value of the 'available_upgrades' attribute to the given values. +func (b *AddOnVersionBuilder) AvailableUpgrades(values ...string) *AddOnVersionBuilder { + b.availableUpgrades = make([]string, len(values)) + copy(b.availableUpgrades, values) + b.bitmap_ |= 16 + return b +} + +// Channel sets the value of the 'channel' attribute to the given value. +func (b *AddOnVersionBuilder) Channel(value string) *AddOnVersionBuilder { + b.channel = value + b.bitmap_ |= 32 + return b +} + +// Config sets the value of the 'config' attribute to the given value. +// +// Representation of an add-on config. +// The attributes under it are to be used by the addon once its installed in the cluster. +func (b *AddOnVersionBuilder) Config(value *AddOnConfigBuilder) *AddOnVersionBuilder { + b.config = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AddOnVersionBuilder) Enabled(value bool) *AddOnVersionBuilder { + b.enabled = value + b.bitmap_ |= 128 + return b +} + +// PackageImage sets the value of the 'package_image' attribute to the given value. +func (b *AddOnVersionBuilder) PackageImage(value string) *AddOnVersionBuilder { + b.packageImage = value + b.bitmap_ |= 256 + return b +} + +// Parameters sets the value of the 'parameters' attribute to the given values. +func (b *AddOnVersionBuilder) Parameters(value *AddOnParameterListBuilder) *AddOnVersionBuilder { + b.parameters = value + b.bitmap_ |= 512 + return b +} + +// PullSecretName sets the value of the 'pull_secret_name' attribute to the given value. +func (b *AddOnVersionBuilder) PullSecretName(value string) *AddOnVersionBuilder { + b.pullSecretName = value + b.bitmap_ |= 1024 + return b +} + +// Requirements sets the value of the 'requirements' attribute to the given values. +func (b *AddOnVersionBuilder) Requirements(values ...*AddOnRequirementBuilder) *AddOnVersionBuilder { + b.requirements = make([]*AddOnRequirementBuilder, len(values)) + copy(b.requirements, values) + b.bitmap_ |= 2048 + return b +} + +// SourceImage sets the value of the 'source_image' attribute to the given value. +func (b *AddOnVersionBuilder) SourceImage(value string) *AddOnVersionBuilder { + b.sourceImage = value + b.bitmap_ |= 4096 + return b +} + +// SubOperators sets the value of the 'sub_operators' attribute to the given values. +func (b *AddOnVersionBuilder) SubOperators(values ...*AddOnSubOperatorBuilder) *AddOnVersionBuilder { + b.subOperators = make([]*AddOnSubOperatorBuilder, len(values)) + copy(b.subOperators, values) + b.bitmap_ |= 8192 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddOnVersionBuilder) Copy(object *AddOnVersion) *AddOnVersionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.additionalCatalogSources != nil { + b.additionalCatalogSources = make([]*AdditionalCatalogSourceBuilder, len(object.additionalCatalogSources)) + for i, v := range object.additionalCatalogSources { + b.additionalCatalogSources[i] = NewAdditionalCatalogSource().Copy(v) + } + } else { + b.additionalCatalogSources = nil + } + if object.availableUpgrades != nil { + b.availableUpgrades = make([]string, len(object.availableUpgrades)) + copy(b.availableUpgrades, object.availableUpgrades) + } else { + b.availableUpgrades = nil + } + b.channel = object.channel + if object.config != nil { + b.config = NewAddOnConfig().Copy(object.config) + } else { + b.config = nil + } + b.enabled = object.enabled + b.packageImage = object.packageImage + if object.parameters != nil { + b.parameters = NewAddOnParameterList().Copy(object.parameters) + } else { + b.parameters = nil + } + b.pullSecretName = object.pullSecretName + if object.requirements != nil { + b.requirements = make([]*AddOnRequirementBuilder, len(object.requirements)) + for i, v := range object.requirements { + b.requirements[i] = NewAddOnRequirement().Copy(v) + } + } else { + b.requirements = nil + } + b.sourceImage = object.sourceImage + if object.subOperators != nil { + b.subOperators = make([]*AddOnSubOperatorBuilder, len(object.subOperators)) + for i, v := range object.subOperators { + b.subOperators[i] = NewAddOnSubOperator().Copy(v) + } + } else { + b.subOperators = nil + } + return b +} + +// Build creates a 'add_on_version' object using the configuration stored in the builder. +func (b *AddOnVersionBuilder) Build() (object *AddOnVersion, err error) { + object = new(AddOnVersion) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.additionalCatalogSources != nil { + object.additionalCatalogSources = make([]*AdditionalCatalogSource, len(b.additionalCatalogSources)) + for i, v := range b.additionalCatalogSources { + object.additionalCatalogSources[i], err = v.Build() + if err != nil { + return + } + } + } + if b.availableUpgrades != nil { + object.availableUpgrades = make([]string, len(b.availableUpgrades)) + copy(object.availableUpgrades, b.availableUpgrades) + } + object.channel = b.channel + if b.config != nil { + object.config, err = b.config.Build() + if err != nil { + return + } + } + object.enabled = b.enabled + object.packageImage = b.packageImage + if b.parameters != nil { + object.parameters, err = b.parameters.Build() + if err != nil { + return + } + } + object.pullSecretName = b.pullSecretName + if b.requirements != nil { + object.requirements = make([]*AddOnRequirement, len(b.requirements)) + for i, v := range b.requirements { + object.requirements[i], err = v.Build() + if err != nil { + return + } + } + } + object.sourceImage = b.sourceImage + if b.subOperators != nil { + object.subOperators = make([]*AddOnSubOperator, len(b.subOperators)) + for i, v := range b.subOperators { + object.subOperators[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_version_client.go b/clustersmgmt/v2alpha1/add_on_version_client.go new file mode 100644 index 00000000..6ab5eebe --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddOnVersionClient is the client of the 'add_on_version' resource. +// +// Manages a specific add-on version. +type AddOnVersionClient struct { + transport http.RoundTripper + path string +} + +// NewAddOnVersionClient creates a new client for the 'add_on_version' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddOnVersionClient(transport http.RoundTripper, path string) *AddOnVersionClient { + return &AddOnVersionClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the add-on version. +func (c *AddOnVersionClient) Delete() *AddOnVersionDeleteRequest { + return &AddOnVersionDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the add-on version. +func (c *AddOnVersionClient) Get() *AddOnVersionGetRequest { + return &AddOnVersionGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the add-on version. +func (c *AddOnVersionClient) Update() *AddOnVersionUpdateRequest { + return &AddOnVersionUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// AddOnVersionPollRequest is the request for the Poll method. +type AddOnVersionPollRequest struct { + request *AddOnVersionGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AddOnVersionPollRequest) Parameter(name string, value interface{}) *AddOnVersionPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AddOnVersionPollRequest) Header(name string, value interface{}) *AddOnVersionPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AddOnVersionPollRequest) Interval(value time.Duration) *AddOnVersionPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AddOnVersionPollRequest) Status(value int) *AddOnVersionPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AddOnVersionPollRequest) Predicate(value func(*AddOnVersionGetResponse) bool) *AddOnVersionPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AddOnVersionGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AddOnVersionPollRequest) StartContext(ctx context.Context) (response *AddOnVersionPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AddOnVersionPollResponse{ + response: result.(*AddOnVersionGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AddOnVersionPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AddOnVersionPollResponse is the response for the Poll method. +type AddOnVersionPollResponse struct { + response *AddOnVersionGetResponse +} + +// Status returns the response status code. +func (r *AddOnVersionPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AddOnVersionPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AddOnVersionPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnVersionPollResponse) Body() *AddOnVersion { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnVersionPollResponse) GetBody() (value *AddOnVersion, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AddOnVersionClient) Poll() *AddOnVersionPollRequest { + return &AddOnVersionPollRequest{ + request: c.Get(), + } +} + +// AddOnVersionDeleteRequest is the request for the 'delete' method. +type AddOnVersionDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddOnVersionDeleteRequest) Parameter(name string, value interface{}) *AddOnVersionDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnVersionDeleteRequest) Header(name string, value interface{}) *AddOnVersionDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnVersionDeleteRequest) Impersonate(user string) *AddOnVersionDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnVersionDeleteRequest) Send() (result *AddOnVersionDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnVersionDeleteRequest) SendContext(ctx context.Context) (result *AddOnVersionDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnVersionDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// AddOnVersionDeleteResponse is the response for the 'delete' method. +type AddOnVersionDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *AddOnVersionDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnVersionDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnVersionDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AddOnVersionGetRequest is the request for the 'get' method. +type AddOnVersionGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddOnVersionGetRequest) Parameter(name string, value interface{}) *AddOnVersionGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnVersionGetRequest) Header(name string, value interface{}) *AddOnVersionGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnVersionGetRequest) Impersonate(user string) *AddOnVersionGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnVersionGetRequest) Send() (result *AddOnVersionGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnVersionGetRequest) SendContext(ctx context.Context) (result *AddOnVersionGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnVersionGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnVersionGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnVersionGetResponse is the response for the 'get' method. +type AddOnVersionGetResponse struct { + status int + header http.Header + err *errors.Error + body *AddOnVersion +} + +// Status returns the response status code. +func (r *AddOnVersionGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnVersionGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnVersionGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnVersionGetResponse) Body() *AddOnVersion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnVersionGetResponse) GetBody() (value *AddOnVersion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddOnVersionUpdateRequest is the request for the 'update' method. +type AddOnVersionUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddOnVersion +} + +// Parameter adds a query parameter. +func (r *AddOnVersionUpdateRequest) Parameter(name string, value interface{}) *AddOnVersionUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnVersionUpdateRequest) Header(name string, value interface{}) *AddOnVersionUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnVersionUpdateRequest) Impersonate(user string) *AddOnVersionUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *AddOnVersionUpdateRequest) Body(value *AddOnVersion) *AddOnVersionUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnVersionUpdateRequest) Send() (result *AddOnVersionUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnVersionUpdateRequest) SendContext(ctx context.Context) (result *AddOnVersionUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddOnVersionUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnVersionUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnVersionUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnVersionUpdateResponse is the response for the 'update' method. +type AddOnVersionUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *AddOnVersion +} + +// Status returns the response status code. +func (r *AddOnVersionUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnVersionUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnVersionUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddOnVersionUpdateResponse) Body() *AddOnVersion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddOnVersionUpdateResponse) GetBody() (value *AddOnVersion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_version_list_builder.go b/clustersmgmt/v2alpha1/add_on_version_list_builder.go new file mode 100644 index 00000000..88ce1b4c --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnVersionListBuilder contains the data and logic needed to build +// 'add_on_version' objects. +type AddOnVersionListBuilder struct { + items []*AddOnVersionBuilder +} + +// NewAddOnVersionList creates a new builder of 'add_on_version' objects. +func NewAddOnVersionList() *AddOnVersionListBuilder { + return new(AddOnVersionListBuilder) +} + +// Items sets the items of the list. +func (b *AddOnVersionListBuilder) Items(values ...*AddOnVersionBuilder) *AddOnVersionListBuilder { + b.items = make([]*AddOnVersionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddOnVersionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddOnVersionListBuilder) Copy(list *AddOnVersionList) *AddOnVersionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddOnVersionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddOnVersion().Copy(v) + } + } + return b +} + +// Build creates a list of 'add_on_version' objects using the +// configuration stored in the builder. +func (b *AddOnVersionListBuilder) Build() (list *AddOnVersionList, err error) { + items := make([]*AddOnVersion, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddOnVersionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/add_on_version_list_type_json.go b/clustersmgmt/v2alpha1/add_on_version_list_type_json.go new file mode 100644 index 00000000..a319e247 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnVersionList writes a list of values of the 'add_on_version' type to +// the given writer. +func MarshalAddOnVersionList(list []*AddOnVersion, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnVersionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnVersionList writes a list of value of the 'add_on_version' type to +// the given stream. +func writeAddOnVersionList(list []*AddOnVersion, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddOnVersion(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddOnVersionList reads a list of values of the 'add_on_version' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddOnVersionList(source interface{}) (items []*AddOnVersion, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddOnVersionList(iterator) + err = iterator.Error + return +} + +// readAddOnVersionList reads list of values of the ”add_on_version' type from +// the given iterator. +func readAddOnVersionList(iterator *jsoniter.Iterator) []*AddOnVersion { + list := []*AddOnVersion{} + for iterator.ReadArray() { + item := readAddOnVersion(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/add_on_version_resource_json.go b/clustersmgmt/v2alpha1/add_on_version_resource_json.go new file mode 100644 index 00000000..f50f9be6 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAddOnVersionDeleteRequest(request *AddOnVersionDeleteRequest, writer io.Writer) error { + return nil +} +func readAddOnVersionDeleteResponse(response *AddOnVersionDeleteResponse, reader io.Reader) error { + return nil +} +func writeAddOnVersionGetRequest(request *AddOnVersionGetRequest, writer io.Writer) error { + return nil +} +func readAddOnVersionGetResponse(response *AddOnVersionGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOnVersion(reader) + return err +} +func writeAddOnVersionUpdateRequest(request *AddOnVersionUpdateRequest, writer io.Writer) error { + return MarshalAddOnVersion(request.body, writer) +} +func readAddOnVersionUpdateResponse(response *AddOnVersionUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOnVersion(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/add_on_version_type.go b/clustersmgmt/v2alpha1/add_on_version_type.go new file mode 100644 index 00000000..df96683e --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_type.go @@ -0,0 +1,482 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddOnVersionKind is the name of the type used to represent objects +// of type 'add_on_version'. +const AddOnVersionKind = "AddOnVersion" + +// AddOnVersionLinkKind is the name of the type used to represent links +// to objects of type 'add_on_version'. +const AddOnVersionLinkKind = "AddOnVersionLink" + +// AddOnVersionNilKind is the name of the type used to nil references +// to objects of type 'add_on_version'. +const AddOnVersionNilKind = "AddOnVersionNil" + +// AddOnVersion represents the values of the 'add_on_version' type. +// +// Representation of an add-on version. +type AddOnVersion struct { + bitmap_ uint32 + id string + href string + additionalCatalogSources []*AdditionalCatalogSource + availableUpgrades []string + channel string + config *AddOnConfig + packageImage string + parameters *AddOnParameterList + pullSecretName string + requirements []*AddOnRequirement + sourceImage string + subOperators []*AddOnSubOperator + enabled bool +} + +// Kind returns the name of the type of the object. +func (o *AddOnVersion) Kind() string { + if o == nil { + return AddOnVersionNilKind + } + if o.bitmap_&1 != 0 { + return AddOnVersionLinkKind + } + return AddOnVersionKind +} + +// Link returns true iif this is a link. +func (o *AddOnVersion) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddOnVersion) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddOnVersion) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddOnVersion) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddOnVersion) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddOnVersion) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AdditionalCatalogSources returns the value of the 'additional_catalog_sources' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional catalog sources associated with this addon version +func (o *AddOnVersion) AdditionalCatalogSources() []*AdditionalCatalogSource { + if o != nil && o.bitmap_&8 != 0 { + return o.additionalCatalogSources + } + return nil +} + +// GetAdditionalCatalogSources returns the value of the 'additional_catalog_sources' attribute and +// a flag indicating if the attribute has a value. +// +// Additional catalog sources associated with this addon version +func (o *AddOnVersion) GetAdditionalCatalogSources() (value []*AdditionalCatalogSource, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.additionalCatalogSources + } + return +} + +// AvailableUpgrades returns the value of the 'available_upgrades' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AvailableUpgrades is the list of versions this version can be upgraded to. +func (o *AddOnVersion) AvailableUpgrades() []string { + if o != nil && o.bitmap_&16 != 0 { + return o.availableUpgrades + } + return nil +} + +// GetAvailableUpgrades returns the value of the 'available_upgrades' attribute and +// a flag indicating if the attribute has a value. +// +// AvailableUpgrades is the list of versions this version can be upgraded to. +func (o *AddOnVersion) GetAvailableUpgrades() (value []string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.availableUpgrades + } + return +} + +// Channel returns the value of the 'channel' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The specific addon catalog source channel of packages +func (o *AddOnVersion) Channel() string { + if o != nil && o.bitmap_&32 != 0 { + return o.channel + } + return "" +} + +// GetChannel returns the value of the 'channel' attribute and +// a flag indicating if the attribute has a value. +// +// The specific addon catalog source channel of packages +func (o *AddOnVersion) GetChannel() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.channel + } + return +} + +// Config returns the value of the 'config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional configs to be used by the addon once its installed in the cluster. +func (o *AddOnVersion) Config() *AddOnConfig { + if o != nil && o.bitmap_&64 != 0 { + return o.config + } + return nil +} + +// GetConfig returns the value of the 'config' attribute and +// a flag indicating if the attribute has a value. +// +// Additional configs to be used by the addon once its installed in the cluster. +func (o *AddOnVersion) GetConfig() (value *AddOnConfig, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.config + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this add-on version can be added to clusters. +func (o *AddOnVersion) Enabled() bool { + if o != nil && o.bitmap_&128 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this add-on version can be added to clusters. +func (o *AddOnVersion) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.enabled + } + return +} + +// PackageImage returns the value of the 'package_image' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The package image for this addon version +func (o *AddOnVersion) PackageImage() string { + if o != nil && o.bitmap_&256 != 0 { + return o.packageImage + } + return "" +} + +// GetPackageImage returns the value of the 'package_image' attribute and +// a flag indicating if the attribute has a value. +// +// The package image for this addon version +func (o *AddOnVersion) GetPackageImage() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.packageImage + } + return +} + +// Parameters returns the value of the 'parameters' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of parameters for this add-on version. +func (o *AddOnVersion) Parameters() *AddOnParameterList { + if o != nil && o.bitmap_&512 != 0 { + return o.parameters + } + return nil +} + +// GetParameters returns the value of the 'parameters' attribute and +// a flag indicating if the attribute has a value. +// +// List of parameters for this add-on version. +func (o *AddOnVersion) GetParameters() (value *AddOnParameterList, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.parameters + } + return +} + +// PullSecretName returns the value of the 'pull_secret_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The pull secret name used for this addon version. +func (o *AddOnVersion) PullSecretName() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.pullSecretName + } + return "" +} + +// GetPullSecretName returns the value of the 'pull_secret_name' attribute and +// a flag indicating if the attribute has a value. +// +// The pull secret name used for this addon version. +func (o *AddOnVersion) GetPullSecretName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.pullSecretName + } + return +} + +// Requirements returns the value of the 'requirements' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of requirements for this add-on version. +func (o *AddOnVersion) Requirements() []*AddOnRequirement { + if o != nil && o.bitmap_&2048 != 0 { + return o.requirements + } + return nil +} + +// GetRequirements returns the value of the 'requirements' attribute and +// a flag indicating if the attribute has a value. +// +// List of requirements for this add-on version. +func (o *AddOnVersion) GetRequirements() (value []*AddOnRequirement, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.requirements + } + return +} + +// SourceImage returns the value of the 'source_image' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The catalog source image for this add-on version. +func (o *AddOnVersion) SourceImage() string { + if o != nil && o.bitmap_&4096 != 0 { + return o.sourceImage + } + return "" +} + +// GetSourceImage returns the value of the 'source_image' attribute and +// a flag indicating if the attribute has a value. +// +// The catalog source image for this add-on version. +func (o *AddOnVersion) GetSourceImage() (value string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.sourceImage + } + return +} + +// SubOperators returns the value of the 'sub_operators' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of sub operators for this add-on version. +func (o *AddOnVersion) SubOperators() []*AddOnSubOperator { + if o != nil && o.bitmap_&8192 != 0 { + return o.subOperators + } + return nil +} + +// GetSubOperators returns the value of the 'sub_operators' attribute and +// a flag indicating if the attribute has a value. +// +// List of sub operators for this add-on version. +func (o *AddOnVersion) GetSubOperators() (value []*AddOnSubOperator, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.subOperators + } + return +} + +// AddOnVersionListKind is the name of the type used to represent list of objects of +// type 'add_on_version'. +const AddOnVersionListKind = "AddOnVersionList" + +// AddOnVersionListLinkKind is the name of the type used to represent links to list +// of objects of type 'add_on_version'. +const AddOnVersionListLinkKind = "AddOnVersionListLink" + +// AddOnVersionNilKind is the name of the type used to nil lists of objects of +// type 'add_on_version'. +const AddOnVersionListNilKind = "AddOnVersionListNil" + +// AddOnVersionList is a list of values of the 'add_on_version' type. +type AddOnVersionList struct { + href string + link bool + items []*AddOnVersion +} + +// Kind returns the name of the type of the object. +func (l *AddOnVersionList) Kind() string { + if l == nil { + return AddOnVersionListNilKind + } + if l.link { + return AddOnVersionListLinkKind + } + return AddOnVersionListKind +} + +// Link returns true iif this is a link. +func (l *AddOnVersionList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddOnVersionList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddOnVersionList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddOnVersionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddOnVersionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddOnVersionList) Get(i int) *AddOnVersion { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddOnVersionList) Slice() []*AddOnVersion { + var slice []*AddOnVersion + if l == nil { + slice = make([]*AddOnVersion, 0) + } else { + slice = make([]*AddOnVersion, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddOnVersionList) Each(f func(item *AddOnVersion) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddOnVersionList) Range(f func(index int, item *AddOnVersion) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/add_on_version_type_json.go b/clustersmgmt/v2alpha1/add_on_version_type_json.go new file mode 100644 index 00000000..da6e76a8 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_version_type_json.go @@ -0,0 +1,270 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddOnVersion writes a value of the 'add_on_version' type to the given writer. +func MarshalAddOnVersion(object *AddOnVersion, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddOnVersion(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddOnVersion writes a value of the 'add_on_version' type to the given stream. +func writeAddOnVersion(object *AddOnVersion, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddOnVersionLinkKind) + } else { + stream.WriteString(AddOnVersionKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.additionalCatalogSources != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_catalog_sources") + writeAdditionalCatalogSourceList(object.additionalCatalogSources, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.availableUpgrades != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("available_upgrades") + writeStringList(object.availableUpgrades, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("channel") + stream.WriteString(object.channel) + count++ + } + present_ = object.bitmap_&64 != 0 && object.config != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("config") + writeAddOnConfig(object.config, stream) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("package_image") + stream.WriteString(object.packageImage) + count++ + } + present_ = object.bitmap_&512 != 0 && object.parameters != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("parameters") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeAddOnParameterList(object.parameters.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("pull_secret_name") + stream.WriteString(object.pullSecretName) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.requirements != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("requirements") + writeAddOnRequirementList(object.requirements, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("source_image") + stream.WriteString(object.sourceImage) + count++ + } + present_ = object.bitmap_&8192 != 0 && object.subOperators != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("sub_operators") + writeAddOnSubOperatorList(object.subOperators, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddOnVersion reads a value of the 'add_on_version' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddOnVersion(source interface{}) (object *AddOnVersion, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddOnVersion(iterator) + err = iterator.Error + return +} + +// readAddOnVersion reads a value of the 'add_on_version' type from the given iterator. +func readAddOnVersion(iterator *jsoniter.Iterator) *AddOnVersion { + object := &AddOnVersion{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddOnVersionLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "additional_catalog_sources": + value := readAdditionalCatalogSourceList(iterator) + object.additionalCatalogSources = value + object.bitmap_ |= 8 + case "available_upgrades": + value := readStringList(iterator) + object.availableUpgrades = value + object.bitmap_ |= 16 + case "channel": + value := iterator.ReadString() + object.channel = value + object.bitmap_ |= 32 + case "config": + value := readAddOnConfig(iterator) + object.config = value + object.bitmap_ |= 64 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 128 + case "package_image": + value := iterator.ReadString() + object.packageImage = value + object.bitmap_ |= 256 + case "parameters": + value := &AddOnParameterList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == AddOnParameterListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readAddOnParameterList(iterator) + default: + iterator.ReadAny() + } + } + object.parameters = value + object.bitmap_ |= 512 + case "pull_secret_name": + value := iterator.ReadString() + object.pullSecretName = value + object.bitmap_ |= 1024 + case "requirements": + value := readAddOnRequirementList(iterator) + object.requirements = value + object.bitmap_ |= 2048 + case "source_image": + value := iterator.ReadString() + object.sourceImage = value + object.bitmap_ |= 4096 + case "sub_operators": + value := readAddOnSubOperatorList(iterator) + object.subOperators = value + object.bitmap_ |= 8192 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/add_on_versions_client.go b/clustersmgmt/v2alpha1/add_on_versions_client.go new file mode 100644 index 00000000..fa6da362 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_versions_client.go @@ -0,0 +1,507 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddOnVersionsClient is the client of the 'add_on_versions' resource. +// +// Manages the collection of add-on versions. +type AddOnVersionsClient struct { + transport http.RoundTripper + path string +} + +// NewAddOnVersionsClient creates a new client for the 'add_on_versions' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddOnVersionsClient(transport http.RoundTripper, path string) *AddOnVersionsClient { + return &AddOnVersionsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Create a new add-on version and add it to the collection of add-ons. +func (c *AddOnVersionsClient) Add() *AddOnVersionsAddRequest { + return &AddOnVersionsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of add-on versions. +func (c *AddOnVersionsClient) List() *AddOnVersionsListRequest { + return &AddOnVersionsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Version returns the target 'add_on_version' resource for the given identifier. +// +// Returns a reference to the service that manages a specific add-on version. +func (c *AddOnVersionsClient) Version(id string) *AddOnVersionClient { + return NewAddOnVersionClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AddOnVersionsAddRequest is the request for the 'add' method. +type AddOnVersionsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddOnVersion +} + +// Parameter adds a query parameter. +func (r *AddOnVersionsAddRequest) Parameter(name string, value interface{}) *AddOnVersionsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnVersionsAddRequest) Header(name string, value interface{}) *AddOnVersionsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnVersionsAddRequest) Impersonate(user string) *AddOnVersionsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the add-on version. +func (r *AddOnVersionsAddRequest) Body(value *AddOnVersion) *AddOnVersionsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnVersionsAddRequest) Send() (result *AddOnVersionsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnVersionsAddRequest) SendContext(ctx context.Context) (result *AddOnVersionsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddOnVersionsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnVersionsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnVersionsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnVersionsAddResponse is the response for the 'add' method. +type AddOnVersionsAddResponse struct { + status int + header http.Header + err *errors.Error + body *AddOnVersion +} + +// Status returns the response status code. +func (r *AddOnVersionsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnVersionsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnVersionsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the add-on version. +func (r *AddOnVersionsAddResponse) Body() *AddOnVersion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the add-on version. +func (r *AddOnVersionsAddResponse) GetBody() (value *AddOnVersion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddOnVersionsListRequest is the request for the 'list' method. +type AddOnVersionsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AddOnVersionsListRequest) Parameter(name string, value interface{}) *AddOnVersionsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnVersionsListRequest) Header(name string, value interface{}) *AddOnVersionsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnVersionsListRequest) Impersonate(user string) *AddOnVersionsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the add-on instead of +// the names of the columns of a table. For example, in order to sort the add-on +// versions descending by id the value should be: +// +// ```sql +// id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AddOnVersionsListRequest) Order(value string) *AddOnVersionsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnVersionsListRequest) Page(value int) *AddOnVersionsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the add-on version instead +// of the names of the columns of a table. For example, in order to retrieve all the +// add-on versions with an id starting with `0.1` the value should be: +// +// ```sql +// id like '0.1.%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the add-on +// versions that the user has permission to see will be returned. +func (r *AddOnVersionsListRequest) Search(value string) *AddOnVersionsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnVersionsListRequest) Size(value int) *AddOnVersionsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnVersionsListRequest) Send() (result *AddOnVersionsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnVersionsListRequest) SendContext(ctx context.Context) (result *AddOnVersionsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnVersionsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnVersionsListResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnVersionsListResponse is the response for the 'list' method. +type AddOnVersionsListResponse struct { + status int + header http.Header + err *errors.Error + items *AddOnVersionList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AddOnVersionsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnVersionsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnVersionsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of add-on versions. +func (r *AddOnVersionsListResponse) Items() *AddOnVersionList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of add-on versions. +func (r *AddOnVersionsListResponse) GetItems() (value *AddOnVersionList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnVersionsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnVersionsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnVersionsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnVersionsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddOnVersionsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddOnVersionsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/add_on_versions_resource_json.go b/clustersmgmt/v2alpha1/add_on_versions_resource_json.go new file mode 100644 index 00000000..ad12ebce --- /dev/null +++ b/clustersmgmt/v2alpha1/add_on_versions_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAddOnVersionsAddRequest(request *AddOnVersionsAddRequest, writer io.Writer) error { + return MarshalAddOnVersion(request.body, writer) +} +func readAddOnVersionsAddResponse(response *AddOnVersionsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOnVersion(reader) + return err +} +func writeAddOnVersionsListRequest(request *AddOnVersionsListRequest, writer io.Writer) error { + return nil +} +func readAddOnVersionsListResponse(response *AddOnVersionsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAddOnVersionList(iterator) + response.items = &AddOnVersionList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/add_ons_client.go b/clustersmgmt/v2alpha1/add_ons_client.go new file mode 100644 index 00000000..839bb143 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_ons_client.go @@ -0,0 +1,507 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddOnsClient is the client of the 'add_ons' resource. +// +// Manages the collection of add-ons. +type AddOnsClient struct { + transport http.RoundTripper + path string +} + +// NewAddOnsClient creates a new client for the 'add_ons' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddOnsClient(transport http.RoundTripper, path string) *AddOnsClient { + return &AddOnsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Create a new add-on and add it to the collection of add-ons. +func (c *AddOnsClient) Add() *AddOnsAddRequest { + return &AddOnsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of add-ons. +func (c *AddOnsClient) List() *AddOnsListRequest { + return &AddOnsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Addon returns the target 'add_on' resource for the given identifier. +// +// Returns a reference to the service that manages a specific add-on. +func (c *AddOnsClient) Addon(id string) *AddOnClient { + return NewAddOnClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AddOnsAddRequest is the request for the 'add' method. +type AddOnsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddOn +} + +// Parameter adds a query parameter. +func (r *AddOnsAddRequest) Parameter(name string, value interface{}) *AddOnsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnsAddRequest) Header(name string, value interface{}) *AddOnsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnsAddRequest) Impersonate(user string) *AddOnsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the add-on. +func (r *AddOnsAddRequest) Body(value *AddOn) *AddOnsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnsAddRequest) Send() (result *AddOnsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnsAddRequest) SendContext(ctx context.Context) (result *AddOnsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddOnsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnsAddResponse is the response for the 'add' method. +type AddOnsAddResponse struct { + status int + header http.Header + err *errors.Error + body *AddOn +} + +// Status returns the response status code. +func (r *AddOnsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the add-on. +func (r *AddOnsAddResponse) Body() *AddOn { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the add-on. +func (r *AddOnsAddResponse) GetBody() (value *AddOn, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddOnsListRequest is the request for the 'list' method. +type AddOnsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AddOnsListRequest) Parameter(name string, value interface{}) *AddOnsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddOnsListRequest) Header(name string, value interface{}) *AddOnsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddOnsListRequest) Impersonate(user string) *AddOnsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the add-on instead of +// the names of the columns of a table. For example, in order to sort the add-ons +// descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AddOnsListRequest) Order(value string) *AddOnsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnsListRequest) Page(value int) *AddOnsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the add-on instead of +// the names of the columns of a table. For example, in order to retrieve all the +// add-ons with a name starting with `my` the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the add-ons +// that the user has permission to see will be returned. +func (r *AddOnsListRequest) Search(value string) *AddOnsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnsListRequest) Size(value int) *AddOnsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddOnsListRequest) Send() (result *AddOnsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddOnsListRequest) SendContext(ctx context.Context) (result *AddOnsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddOnsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddOnsListResponse(result, reader) + if err != nil { + return + } + return +} + +// AddOnsListResponse is the response for the 'list' method. +type AddOnsListResponse struct { + status int + header http.Header + err *errors.Error + items *AddOnList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AddOnsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddOnsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddOnsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of add-ons. +func (r *AddOnsListResponse) Items() *AddOnList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of add-ons. +func (r *AddOnsListResponse) GetItems() (value *AddOnList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddOnsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddOnsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddOnsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddOnsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/add_ons_resource_json.go b/clustersmgmt/v2alpha1/add_ons_resource_json.go new file mode 100644 index 00000000..76ce21a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/add_ons_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAddOnsAddRequest(request *AddOnsAddRequest, writer io.Writer) error { + return MarshalAddOn(request.body, writer) +} +func readAddOnsAddResponse(response *AddOnsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOn(reader) + return err +} +func writeAddOnsListRequest(request *AddOnsListRequest, writer io.Writer) error { + return nil +} +func readAddOnsListResponse(response *AddOnsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAddOnList(iterator) + response.items = &AddOnList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/additional_catalog_source_builder.go b/clustersmgmt/v2alpha1/additional_catalog_source_builder.go new file mode 100644 index 00000000..66fba854 --- /dev/null +++ b/clustersmgmt/v2alpha1/additional_catalog_source_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AdditionalCatalogSourceBuilder contains the data and logic needed to build 'additional_catalog_source' objects. +// +// Representation of an addon catalog source object used by addon versions. +type AdditionalCatalogSourceBuilder struct { + bitmap_ uint32 + id string + image string + name string + enabled bool +} + +// NewAdditionalCatalogSource creates a new builder of 'additional_catalog_source' objects. +func NewAdditionalCatalogSource() *AdditionalCatalogSourceBuilder { + return &AdditionalCatalogSourceBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AdditionalCatalogSourceBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *AdditionalCatalogSourceBuilder) ID(value string) *AdditionalCatalogSourceBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AdditionalCatalogSourceBuilder) Enabled(value bool) *AdditionalCatalogSourceBuilder { + b.enabled = value + b.bitmap_ |= 2 + return b +} + +// Image sets the value of the 'image' attribute to the given value. +func (b *AdditionalCatalogSourceBuilder) Image(value string) *AdditionalCatalogSourceBuilder { + b.image = value + b.bitmap_ |= 4 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AdditionalCatalogSourceBuilder) Name(value string) *AdditionalCatalogSourceBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AdditionalCatalogSourceBuilder) Copy(object *AdditionalCatalogSource) *AdditionalCatalogSourceBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.enabled = object.enabled + b.image = object.image + b.name = object.name + return b +} + +// Build creates a 'additional_catalog_source' object using the configuration stored in the builder. +func (b *AdditionalCatalogSourceBuilder) Build() (object *AdditionalCatalogSource, err error) { + object = new(AdditionalCatalogSource) + object.bitmap_ = b.bitmap_ + object.id = b.id + object.enabled = b.enabled + object.image = b.image + object.name = b.name + return +} diff --git a/clustersmgmt/v2alpha1/additional_catalog_source_list_builder.go b/clustersmgmt/v2alpha1/additional_catalog_source_list_builder.go new file mode 100644 index 00000000..dacc10da --- /dev/null +++ b/clustersmgmt/v2alpha1/additional_catalog_source_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AdditionalCatalogSourceListBuilder contains the data and logic needed to build +// 'additional_catalog_source' objects. +type AdditionalCatalogSourceListBuilder struct { + items []*AdditionalCatalogSourceBuilder +} + +// NewAdditionalCatalogSourceList creates a new builder of 'additional_catalog_source' objects. +func NewAdditionalCatalogSourceList() *AdditionalCatalogSourceListBuilder { + return new(AdditionalCatalogSourceListBuilder) +} + +// Items sets the items of the list. +func (b *AdditionalCatalogSourceListBuilder) Items(values ...*AdditionalCatalogSourceBuilder) *AdditionalCatalogSourceListBuilder { + b.items = make([]*AdditionalCatalogSourceBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AdditionalCatalogSourceListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AdditionalCatalogSourceListBuilder) Copy(list *AdditionalCatalogSourceList) *AdditionalCatalogSourceListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AdditionalCatalogSourceBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAdditionalCatalogSource().Copy(v) + } + } + return b +} + +// Build creates a list of 'additional_catalog_source' objects using the +// configuration stored in the builder. +func (b *AdditionalCatalogSourceListBuilder) Build() (list *AdditionalCatalogSourceList, err error) { + items := make([]*AdditionalCatalogSource, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AdditionalCatalogSourceList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/additional_catalog_source_list_type_json.go b/clustersmgmt/v2alpha1/additional_catalog_source_list_type_json.go new file mode 100644 index 00000000..7b92c7be --- /dev/null +++ b/clustersmgmt/v2alpha1/additional_catalog_source_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAdditionalCatalogSourceList writes a list of values of the 'additional_catalog_source' type to +// the given writer. +func MarshalAdditionalCatalogSourceList(list []*AdditionalCatalogSource, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAdditionalCatalogSourceList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAdditionalCatalogSourceList writes a list of value of the 'additional_catalog_source' type to +// the given stream. +func writeAdditionalCatalogSourceList(list []*AdditionalCatalogSource, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAdditionalCatalogSource(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAdditionalCatalogSourceList reads a list of values of the 'additional_catalog_source' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAdditionalCatalogSourceList(source interface{}) (items []*AdditionalCatalogSource, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAdditionalCatalogSourceList(iterator) + err = iterator.Error + return +} + +// readAdditionalCatalogSourceList reads list of values of the ”additional_catalog_source' type from +// the given iterator. +func readAdditionalCatalogSourceList(iterator *jsoniter.Iterator) []*AdditionalCatalogSource { + list := []*AdditionalCatalogSource{} + for iterator.ReadArray() { + item := readAdditionalCatalogSource(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/additional_catalog_source_type.go b/clustersmgmt/v2alpha1/additional_catalog_source_type.go new file mode 100644 index 00000000..22a6e189 --- /dev/null +++ b/clustersmgmt/v2alpha1/additional_catalog_source_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AdditionalCatalogSource represents the values of the 'additional_catalog_source' type. +// +// Representation of an addon catalog source object used by addon versions. +type AdditionalCatalogSource struct { + bitmap_ uint32 + id string + image string + name string + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AdditionalCatalogSource) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID of the additional catalog source +func (o *AdditionalCatalogSource) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID of the additional catalog source +func (o *AdditionalCatalogSource) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates is this additional catalog source is enabled for the addon +func (o *AdditionalCatalogSource) Enabled() bool { + if o != nil && o.bitmap_&2 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates is this additional catalog source is enabled for the addon +func (o *AdditionalCatalogSource) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.enabled + } + return +} + +// Image returns the value of the 'image' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Image of the additional catalog source. +func (o *AdditionalCatalogSource) Image() string { + if o != nil && o.bitmap_&4 != 0 { + return o.image + } + return "" +} + +// GetImage returns the value of the 'image' attribute and +// a flag indicating if the attribute has a value. +// +// Image of the additional catalog source. +func (o *AdditionalCatalogSource) GetImage() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.image + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the additional catalog source. +func (o *AdditionalCatalogSource) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the additional catalog source. +func (o *AdditionalCatalogSource) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// AdditionalCatalogSourceListKind is the name of the type used to represent list of objects of +// type 'additional_catalog_source'. +const AdditionalCatalogSourceListKind = "AdditionalCatalogSourceList" + +// AdditionalCatalogSourceListLinkKind is the name of the type used to represent links to list +// of objects of type 'additional_catalog_source'. +const AdditionalCatalogSourceListLinkKind = "AdditionalCatalogSourceListLink" + +// AdditionalCatalogSourceNilKind is the name of the type used to nil lists of objects of +// type 'additional_catalog_source'. +const AdditionalCatalogSourceListNilKind = "AdditionalCatalogSourceListNil" + +// AdditionalCatalogSourceList is a list of values of the 'additional_catalog_source' type. +type AdditionalCatalogSourceList struct { + href string + link bool + items []*AdditionalCatalogSource +} + +// Len returns the length of the list. +func (l *AdditionalCatalogSourceList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AdditionalCatalogSourceList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AdditionalCatalogSourceList) Get(i int) *AdditionalCatalogSource { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AdditionalCatalogSourceList) Slice() []*AdditionalCatalogSource { + var slice []*AdditionalCatalogSource + if l == nil { + slice = make([]*AdditionalCatalogSource, 0) + } else { + slice = make([]*AdditionalCatalogSource, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AdditionalCatalogSourceList) Each(f func(item *AdditionalCatalogSource) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AdditionalCatalogSourceList) Range(f func(index int, item *AdditionalCatalogSource) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/additional_catalog_source_type_json.go b/clustersmgmt/v2alpha1/additional_catalog_source_type_json.go new file mode 100644 index 00000000..a32ce1f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/additional_catalog_source_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAdditionalCatalogSource writes a value of the 'additional_catalog_source' type to the given writer. +func MarshalAdditionalCatalogSource(object *AdditionalCatalogSource, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAdditionalCatalogSource(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAdditionalCatalogSource writes a value of the 'additional_catalog_source' type to the given stream. +func writeAdditionalCatalogSource(object *AdditionalCatalogSource, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("image") + stream.WriteString(object.image) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + } + stream.WriteObjectEnd() +} + +// UnmarshalAdditionalCatalogSource reads a value of the 'additional_catalog_source' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAdditionalCatalogSource(source interface{}) (object *AdditionalCatalogSource, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAdditionalCatalogSource(iterator) + err = iterator.Error + return +} + +// readAdditionalCatalogSource reads a value of the 'additional_catalog_source' type from the given iterator. +func readAdditionalCatalogSource(iterator *jsoniter.Iterator) *AdditionalCatalogSource { + object := &AdditionalCatalogSource{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 2 + case "image": + value := iterator.ReadString() + object.image = value + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/addon_inquiries_client.go b/clustersmgmt/v2alpha1/addon_inquiries_client.go new file mode 100644 index 00000000..26aeff84 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_inquiries_client.go @@ -0,0 +1,344 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddonInquiriesClient is the client of the 'addon_inquiries' resource. +// +// Manages add-on inquiries, inquiries perform validation of add-on(s) on a per cluster basis +// based on add-on conditions and requirements. +type AddonInquiriesClient struct { + transport http.RoundTripper + path string +} + +// NewAddonInquiriesClient creates a new client for the 'addon_inquiries' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddonInquiriesClient(transport http.RoundTripper, path string) *AddonInquiriesClient { + return &AddonInquiriesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +func (c *AddonInquiriesClient) List() *AddonInquiriesListRequest { + return &AddonInquiriesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// AddonInquiry returns the target 'addon_inquiry' resource for the given identifier. +func (c *AddonInquiriesClient) AddonInquiry(id string) *AddonInquiryClient { + return NewAddonInquiryClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AddonInquiriesListRequest is the request for the 'list' method. +type AddonInquiriesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AddonInquiriesListRequest) Parameter(name string, value interface{}) *AddonInquiriesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonInquiriesListRequest) Header(name string, value interface{}) *AddonInquiriesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonInquiriesListRequest) Impersonate(user string) *AddonInquiriesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the add-on instead of +// the names of the columns of a table. For example, in order to sort the add-ons +// descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AddonInquiriesListRequest) Order(value string) *AddonInquiriesListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddonInquiriesListRequest) Page(value int) *AddonInquiriesListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the add-on instead of +// the names of the columns of a table. For example, in order to retrieve all the +// add-ons with a name starting with `my` the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the add-ons +// that the user has permission to see will be returned. +func (r *AddonInquiriesListRequest) Search(value string) *AddonInquiriesListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddonInquiriesListRequest) Size(value int) *AddonInquiriesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonInquiriesListRequest) Send() (result *AddonInquiriesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonInquiriesListRequest) SendContext(ctx context.Context) (result *AddonInquiriesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonInquiriesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonInquiriesListResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonInquiriesListResponse is the response for the 'list' method. +type AddonInquiriesListResponse struct { + status int + header http.Header + err *errors.Error + items *AddOnList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AddonInquiriesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonInquiriesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonInquiriesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of add-ons. +func (r *AddonInquiriesListResponse) Items() *AddOnList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of add-ons. +func (r *AddonInquiriesListResponse) GetItems() (value *AddOnList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddonInquiriesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddonInquiriesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddonInquiriesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AddonInquiriesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddonInquiriesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AddonInquiriesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/addon_inquiries_resource_json.go b/clustersmgmt/v2alpha1/addon_inquiries_resource_json.go new file mode 100644 index 00000000..ad95fbb7 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_inquiries_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAddonInquiriesListRequest(request *AddonInquiriesListRequest, writer io.Writer) error { + return nil +} +func readAddonInquiriesListResponse(response *AddonInquiriesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAddOnList(iterator) + response.items = &AddOnList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/addon_inquiry_client.go b/clustersmgmt/v2alpha1/addon_inquiry_client.go new file mode 100644 index 00000000..28ffe309 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_inquiry_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddonInquiryClient is the client of the 'addon_inquiry' resource. +// +// Manages a specific add-on inquiry +type AddonInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewAddonInquiryClient creates a new client for the 'addon_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddonInquiryClient(transport http.RoundTripper, path string) *AddonInquiryClient { + return &AddonInquiryClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *AddonInquiryClient) Get() *AddonInquiryGetRequest { + return &AddonInquiryGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// AddonInquiryPollRequest is the request for the Poll method. +type AddonInquiryPollRequest struct { + request *AddonInquiryGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AddonInquiryPollRequest) Parameter(name string, value interface{}) *AddonInquiryPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AddonInquiryPollRequest) Header(name string, value interface{}) *AddonInquiryPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AddonInquiryPollRequest) Interval(value time.Duration) *AddonInquiryPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AddonInquiryPollRequest) Status(value int) *AddonInquiryPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AddonInquiryPollRequest) Predicate(value func(*AddonInquiryGetResponse) bool) *AddonInquiryPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AddonInquiryGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AddonInquiryPollRequest) StartContext(ctx context.Context) (response *AddonInquiryPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AddonInquiryPollResponse{ + response: result.(*AddonInquiryGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AddonInquiryPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AddonInquiryPollResponse is the response for the Poll method. +type AddonInquiryPollResponse struct { + response *AddonInquiryGetResponse +} + +// Status returns the response status code. +func (r *AddonInquiryPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AddonInquiryPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AddonInquiryPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AddonInquiryPollResponse) Body() *AddOn { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonInquiryPollResponse) GetBody() (value *AddOn, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AddonInquiryClient) Poll() *AddonInquiryPollRequest { + return &AddonInquiryPollRequest{ + request: c.Get(), + } +} + +// AddonInquiryGetRequest is the request for the 'get' method. +type AddonInquiryGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddonInquiryGetRequest) Parameter(name string, value interface{}) *AddonInquiryGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonInquiryGetRequest) Header(name string, value interface{}) *AddonInquiryGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonInquiryGetRequest) Impersonate(user string) *AddonInquiryGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonInquiryGetRequest) Send() (result *AddonInquiryGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonInquiryGetRequest) SendContext(ctx context.Context) (result *AddonInquiryGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonInquiryGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonInquiryGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonInquiryGetResponse is the response for the 'get' method. +type AddonInquiryGetResponse struct { + status int + header http.Header + err *errors.Error + body *AddOn +} + +// Status returns the response status code. +func (r *AddonInquiryGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonInquiryGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonInquiryGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddonInquiryGetResponse) Body() *AddOn { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonInquiryGetResponse) GetBody() (value *AddOn, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/addon_inquiry_resource_json.go b/clustersmgmt/v2alpha1/addon_inquiry_resource_json.go new file mode 100644 index 00000000..76e28e08 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_inquiry_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAddonInquiryGetRequest(request *AddonInquiryGetRequest, writer io.Writer) error { + return nil +} +func readAddonInquiryGetResponse(response *AddonInquiryGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddOn(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policies_client.go b/clustersmgmt/v2alpha1/addon_upgrade_policies_client.go new file mode 100644 index 00000000..57bb3fe8 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policies_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddonUpgradePoliciesClient is the client of the 'addon_upgrade_policies' resource. +// +// Manages the collection of addon upgrade policies of a cluster. +type AddonUpgradePoliciesClient struct { + transport http.RoundTripper + path string +} + +// NewAddonUpgradePoliciesClient creates a new client for the 'addon_upgrade_policies' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddonUpgradePoliciesClient(transport http.RoundTripper, path string) *AddonUpgradePoliciesClient { + return &AddonUpgradePoliciesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new addon upgrade policy to the cluster. +func (c *AddonUpgradePoliciesClient) Add() *AddonUpgradePoliciesAddRequest { + return &AddonUpgradePoliciesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of addon upgrade policies. +func (c *AddonUpgradePoliciesClient) List() *AddonUpgradePoliciesListRequest { + return &AddonUpgradePoliciesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// AddonUpgradePolicy returns the target 'addon_upgrade_policy' resource for the given identifier. +// +// Reference to the service that manages an specific addon upgrade policy. +func (c *AddonUpgradePoliciesClient) AddonUpgradePolicy(id string) *AddonUpgradePolicyClient { + return NewAddonUpgradePolicyClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AddonUpgradePoliciesAddRequest is the request for the 'add' method. +type AddonUpgradePoliciesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddonUpgradePolicy +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePoliciesAddRequest) Parameter(name string, value interface{}) *AddonUpgradePoliciesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePoliciesAddRequest) Header(name string, value interface{}) *AddonUpgradePoliciesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePoliciesAddRequest) Impersonate(user string) *AddonUpgradePoliciesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *AddonUpgradePoliciesAddRequest) Body(value *AddonUpgradePolicy) *AddonUpgradePoliciesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePoliciesAddRequest) Send() (result *AddonUpgradePoliciesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePoliciesAddRequest) SendContext(ctx context.Context) (result *AddonUpgradePoliciesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddonUpgradePoliciesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePoliciesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonUpgradePoliciesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonUpgradePoliciesAddResponse is the response for the 'add' method. +type AddonUpgradePoliciesAddResponse struct { + status int + header http.Header + err *errors.Error + body *AddonUpgradePolicy +} + +// Status returns the response status code. +func (r *AddonUpgradePoliciesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePoliciesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePoliciesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *AddonUpgradePoliciesAddResponse) Body() *AddonUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the upgrade policy. +func (r *AddonUpgradePoliciesAddResponse) GetBody() (value *AddonUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddonUpgradePoliciesListRequest is the request for the 'list' method. +type AddonUpgradePoliciesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePoliciesListRequest) Parameter(name string, value interface{}) *AddonUpgradePoliciesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePoliciesListRequest) Header(name string, value interface{}) *AddonUpgradePoliciesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePoliciesListRequest) Impersonate(user string) *AddonUpgradePoliciesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddonUpgradePoliciesListRequest) Page(value int) *AddonUpgradePoliciesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *AddonUpgradePoliciesListRequest) Size(value int) *AddonUpgradePoliciesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePoliciesListRequest) Send() (result *AddonUpgradePoliciesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePoliciesListRequest) SendContext(ctx context.Context) (result *AddonUpgradePoliciesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePoliciesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonUpgradePoliciesListResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonUpgradePoliciesListResponse is the response for the 'list' method. +type AddonUpgradePoliciesListResponse struct { + status int + header http.Header + err *errors.Error + items *AddonUpgradePolicyList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AddonUpgradePoliciesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePoliciesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePoliciesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of addon upgrade policy. +func (r *AddonUpgradePoliciesListResponse) Items() *AddonUpgradePolicyList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of addon upgrade policy. +func (r *AddonUpgradePoliciesListResponse) GetItems() (value *AddonUpgradePolicyList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddonUpgradePoliciesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AddonUpgradePoliciesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *AddonUpgradePoliciesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *AddonUpgradePoliciesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *AddonUpgradePoliciesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *AddonUpgradePoliciesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policies_resource_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policies_resource_json.go new file mode 100644 index 00000000..2ee18660 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policies_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAddonUpgradePoliciesAddRequest(request *AddonUpgradePoliciesAddRequest, writer io.Writer) error { + return MarshalAddonUpgradePolicy(request.body, writer) +} +func readAddonUpgradePoliciesAddResponse(response *AddonUpgradePoliciesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddonUpgradePolicy(reader) + return err +} +func writeAddonUpgradePoliciesListRequest(request *AddonUpgradePoliciesListRequest, writer io.Writer) error { + return nil +} +func readAddonUpgradePoliciesListResponse(response *AddonUpgradePoliciesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAddonUpgradePolicyList(iterator) + response.items = &AddonUpgradePolicyList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_builder.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_builder.go new file mode 100644 index 00000000..cc0ca92f --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_builder.go @@ -0,0 +1,153 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// AddonUpgradePolicyBuilder contains the data and logic needed to build 'addon_upgrade_policy' objects. +// +// Representation of an upgrade policy that can be set for a cluster. +type AddonUpgradePolicyBuilder struct { + bitmap_ uint32 + id string + href string + addonID string + clusterID string + nextRun time.Time + schedule string + scheduleType string + upgradeType string + version string +} + +// NewAddonUpgradePolicy creates a new builder of 'addon_upgrade_policy' objects. +func NewAddonUpgradePolicy() *AddonUpgradePolicyBuilder { + return &AddonUpgradePolicyBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddonUpgradePolicyBuilder) Link(value bool) *AddonUpgradePolicyBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddonUpgradePolicyBuilder) ID(value string) *AddonUpgradePolicyBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddonUpgradePolicyBuilder) HREF(value string) *AddonUpgradePolicyBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddonUpgradePolicyBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AddonID sets the value of the 'addon_ID' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) AddonID(value string) *AddonUpgradePolicyBuilder { + b.addonID = value + b.bitmap_ |= 8 + return b +} + +// ClusterID sets the value of the 'cluster_ID' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) ClusterID(value string) *AddonUpgradePolicyBuilder { + b.clusterID = value + b.bitmap_ |= 16 + return b +} + +// NextRun sets the value of the 'next_run' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) NextRun(value time.Time) *AddonUpgradePolicyBuilder { + b.nextRun = value + b.bitmap_ |= 32 + return b +} + +// Schedule sets the value of the 'schedule' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) Schedule(value string) *AddonUpgradePolicyBuilder { + b.schedule = value + b.bitmap_ |= 64 + return b +} + +// ScheduleType sets the value of the 'schedule_type' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) ScheduleType(value string) *AddonUpgradePolicyBuilder { + b.scheduleType = value + b.bitmap_ |= 128 + return b +} + +// UpgradeType sets the value of the 'upgrade_type' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) UpgradeType(value string) *AddonUpgradePolicyBuilder { + b.upgradeType = value + b.bitmap_ |= 256 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +func (b *AddonUpgradePolicyBuilder) Version(value string) *AddonUpgradePolicyBuilder { + b.version = value + b.bitmap_ |= 512 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddonUpgradePolicyBuilder) Copy(object *AddonUpgradePolicy) *AddonUpgradePolicyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.addonID = object.addonID + b.clusterID = object.clusterID + b.nextRun = object.nextRun + b.schedule = object.schedule + b.scheduleType = object.scheduleType + b.upgradeType = object.upgradeType + b.version = object.version + return b +} + +// Build creates a 'addon_upgrade_policy' object using the configuration stored in the builder. +func (b *AddonUpgradePolicyBuilder) Build() (object *AddonUpgradePolicy, err error) { + object = new(AddonUpgradePolicy) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.addonID = b.addonID + object.clusterID = b.clusterID + object.nextRun = b.nextRun + object.schedule = b.schedule + object.scheduleType = b.scheduleType + object.upgradeType = b.upgradeType + object.version = b.version + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_client.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_client.go new file mode 100644 index 00000000..027d1acf --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_client.go @@ -0,0 +1,589 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddonUpgradePolicyClient is the client of the 'addon_upgrade_policy' resource. +// +// Manages a specific addon upgrade policy. +type AddonUpgradePolicyClient struct { + transport http.RoundTripper + path string +} + +// NewAddonUpgradePolicyClient creates a new client for the 'addon_upgrade_policy' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddonUpgradePolicyClient(transport http.RoundTripper, path string) *AddonUpgradePolicyClient { + return &AddonUpgradePolicyClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the addon upgrade policy. +func (c *AddonUpgradePolicyClient) Delete() *AddonUpgradePolicyDeleteRequest { + return &AddonUpgradePolicyDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the addon upgrade policy. +func (c *AddonUpgradePolicyClient) Get() *AddonUpgradePolicyGetRequest { + return &AddonUpgradePolicyGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the addon upgrade policy. +func (c *AddonUpgradePolicyClient) Update() *AddonUpgradePolicyUpdateRequest { + return &AddonUpgradePolicyUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// State returns the target 'addon_upgrade_policy_state' resource. +// +// Reference to the state of the addon upgrade policy. +func (c *AddonUpgradePolicyClient) State() *AddonUpgradePolicyStateClient { + return NewAddonUpgradePolicyStateClient( + c.transport, + path.Join(c.path, "state"), + ) +} + +// AddonUpgradePolicyPollRequest is the request for the Poll method. +type AddonUpgradePolicyPollRequest struct { + request *AddonUpgradePolicyGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AddonUpgradePolicyPollRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AddonUpgradePolicyPollRequest) Header(name string, value interface{}) *AddonUpgradePolicyPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AddonUpgradePolicyPollRequest) Interval(value time.Duration) *AddonUpgradePolicyPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AddonUpgradePolicyPollRequest) Status(value int) *AddonUpgradePolicyPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AddonUpgradePolicyPollRequest) Predicate(value func(*AddonUpgradePolicyGetResponse) bool) *AddonUpgradePolicyPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AddonUpgradePolicyGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AddonUpgradePolicyPollRequest) StartContext(ctx context.Context) (response *AddonUpgradePolicyPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AddonUpgradePolicyPollResponse{ + response: result.(*AddonUpgradePolicyGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AddonUpgradePolicyPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AddonUpgradePolicyPollResponse is the response for the Poll method. +type AddonUpgradePolicyPollResponse struct { + response *AddonUpgradePolicyGetResponse +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AddonUpgradePolicyPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AddonUpgradePolicyPollResponse) Body() *AddonUpgradePolicy { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonUpgradePolicyPollResponse) GetBody() (value *AddonUpgradePolicy, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AddonUpgradePolicyClient) Poll() *AddonUpgradePolicyPollRequest { + return &AddonUpgradePolicyPollRequest{ + request: c.Get(), + } +} + +// AddonUpgradePolicyDeleteRequest is the request for the 'delete' method. +type AddonUpgradePolicyDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePolicyDeleteRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePolicyDeleteRequest) Header(name string, value interface{}) *AddonUpgradePolicyDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePolicyDeleteRequest) Impersonate(user string) *AddonUpgradePolicyDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePolicyDeleteRequest) Send() (result *AddonUpgradePolicyDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePolicyDeleteRequest) SendContext(ctx context.Context) (result *AddonUpgradePolicyDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePolicyDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// AddonUpgradePolicyDeleteResponse is the response for the 'delete' method. +type AddonUpgradePolicyDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePolicyDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AddonUpgradePolicyGetRequest is the request for the 'get' method. +type AddonUpgradePolicyGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePolicyGetRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePolicyGetRequest) Header(name string, value interface{}) *AddonUpgradePolicyGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePolicyGetRequest) Impersonate(user string) *AddonUpgradePolicyGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePolicyGetRequest) Send() (result *AddonUpgradePolicyGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePolicyGetRequest) SendContext(ctx context.Context) (result *AddonUpgradePolicyGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePolicyGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonUpgradePolicyGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonUpgradePolicyGetResponse is the response for the 'get' method. +type AddonUpgradePolicyGetResponse struct { + status int + header http.Header + err *errors.Error + body *AddonUpgradePolicy +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePolicyGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddonUpgradePolicyGetResponse) Body() *AddonUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonUpgradePolicyGetResponse) GetBody() (value *AddonUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddonUpgradePolicyUpdateRequest is the request for the 'update' method. +type AddonUpgradePolicyUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddonUpgradePolicy +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePolicyUpdateRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePolicyUpdateRequest) Header(name string, value interface{}) *AddonUpgradePolicyUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePolicyUpdateRequest) Impersonate(user string) *AddonUpgradePolicyUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *AddonUpgradePolicyUpdateRequest) Body(value *AddonUpgradePolicy) *AddonUpgradePolicyUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePolicyUpdateRequest) Send() (result *AddonUpgradePolicyUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePolicyUpdateRequest) SendContext(ctx context.Context) (result *AddonUpgradePolicyUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddonUpgradePolicyUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePolicyUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonUpgradePolicyUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonUpgradePolicyUpdateResponse is the response for the 'update' method. +type AddonUpgradePolicyUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *AddonUpgradePolicy +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePolicyUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddonUpgradePolicyUpdateResponse) Body() *AddonUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonUpgradePolicyUpdateResponse) GetBody() (value *AddonUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_list_builder.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_list_builder.go new file mode 100644 index 00000000..36e073db --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddonUpgradePolicyListBuilder contains the data and logic needed to build +// 'addon_upgrade_policy' objects. +type AddonUpgradePolicyListBuilder struct { + items []*AddonUpgradePolicyBuilder +} + +// NewAddonUpgradePolicyList creates a new builder of 'addon_upgrade_policy' objects. +func NewAddonUpgradePolicyList() *AddonUpgradePolicyListBuilder { + return new(AddonUpgradePolicyListBuilder) +} + +// Items sets the items of the list. +func (b *AddonUpgradePolicyListBuilder) Items(values ...*AddonUpgradePolicyBuilder) *AddonUpgradePolicyListBuilder { + b.items = make([]*AddonUpgradePolicyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddonUpgradePolicyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddonUpgradePolicyListBuilder) Copy(list *AddonUpgradePolicyList) *AddonUpgradePolicyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddonUpgradePolicyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddonUpgradePolicy().Copy(v) + } + } + return b +} + +// Build creates a list of 'addon_upgrade_policy' objects using the +// configuration stored in the builder. +func (b *AddonUpgradePolicyListBuilder) Build() (list *AddonUpgradePolicyList, err error) { + items := make([]*AddonUpgradePolicy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddonUpgradePolicyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_list_type_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_list_type_json.go new file mode 100644 index 00000000..8a248041 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddonUpgradePolicyList writes a list of values of the 'addon_upgrade_policy' type to +// the given writer. +func MarshalAddonUpgradePolicyList(list []*AddonUpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddonUpgradePolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddonUpgradePolicyList writes a list of value of the 'addon_upgrade_policy' type to +// the given stream. +func writeAddonUpgradePolicyList(list []*AddonUpgradePolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddonUpgradePolicy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddonUpgradePolicyList reads a list of values of the 'addon_upgrade_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddonUpgradePolicyList(source interface{}) (items []*AddonUpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddonUpgradePolicyList(iterator) + err = iterator.Error + return +} + +// readAddonUpgradePolicyList reads list of values of the ”addon_upgrade_policy' type from +// the given iterator. +func readAddonUpgradePolicyList(iterator *jsoniter.Iterator) []*AddonUpgradePolicy { + list := []*AddonUpgradePolicy{} + for iterator.ReadArray() { + item := readAddonUpgradePolicy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_resource_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_resource_json.go new file mode 100644 index 00000000..f7072871 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAddonUpgradePolicyDeleteRequest(request *AddonUpgradePolicyDeleteRequest, writer io.Writer) error { + return nil +} +func readAddonUpgradePolicyDeleteResponse(response *AddonUpgradePolicyDeleteResponse, reader io.Reader) error { + return nil +} +func writeAddonUpgradePolicyGetRequest(request *AddonUpgradePolicyGetRequest, writer io.Writer) error { + return nil +} +func readAddonUpgradePolicyGetResponse(response *AddonUpgradePolicyGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddonUpgradePolicy(reader) + return err +} +func writeAddonUpgradePolicyUpdateRequest(request *AddonUpgradePolicyUpdateRequest, writer io.Writer) error { + return MarshalAddonUpgradePolicy(request.body, writer) +} +func readAddonUpgradePolicyUpdateResponse(response *AddonUpgradePolicyUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddonUpgradePolicy(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_builder.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_builder.go new file mode 100644 index 00000000..6894e315 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_builder.go @@ -0,0 +1,101 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddonUpgradePolicyStateBuilder contains the data and logic needed to build 'addon_upgrade_policy_state' objects. +// +// Representation of an addon upgrade policy state that that is set for a cluster. +type AddonUpgradePolicyStateBuilder struct { + bitmap_ uint32 + id string + href string + description string + value UpgradePolicyStateValue +} + +// NewAddonUpgradePolicyState creates a new builder of 'addon_upgrade_policy_state' objects. +func NewAddonUpgradePolicyState() *AddonUpgradePolicyStateBuilder { + return &AddonUpgradePolicyStateBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AddonUpgradePolicyStateBuilder) Link(value bool) *AddonUpgradePolicyStateBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AddonUpgradePolicyStateBuilder) ID(value string) *AddonUpgradePolicyStateBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AddonUpgradePolicyStateBuilder) HREF(value string) *AddonUpgradePolicyStateBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AddonUpgradePolicyStateBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *AddonUpgradePolicyStateBuilder) Description(value string) *AddonUpgradePolicyStateBuilder { + b.description = value + b.bitmap_ |= 8 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +// +// Overall state of a cluster upgrade policy. +func (b *AddonUpgradePolicyStateBuilder) Value(value UpgradePolicyStateValue) *AddonUpgradePolicyStateBuilder { + b.value = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AddonUpgradePolicyStateBuilder) Copy(object *AddonUpgradePolicyState) *AddonUpgradePolicyStateBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.description = object.description + b.value = object.value + return b +} + +// Build creates a 'addon_upgrade_policy_state' object using the configuration stored in the builder. +func (b *AddonUpgradePolicyStateBuilder) Build() (object *AddonUpgradePolicyState, err error) { + object = new(AddonUpgradePolicyState) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.description = b.description + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_client.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_client.go new file mode 100644 index 00000000..1f105ebc --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_client.go @@ -0,0 +1,461 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AddonUpgradePolicyStateClient is the client of the 'addon_upgrade_policy_state' resource. +// +// Manages a specific upgrade policy state. +type AddonUpgradePolicyStateClient struct { + transport http.RoundTripper + path string +} + +// NewAddonUpgradePolicyStateClient creates a new client for the 'addon_upgrade_policy_state' +// resource using the given transport to send the requests and receive the +// responses. +func NewAddonUpgradePolicyStateClient(transport http.RoundTripper, path string) *AddonUpgradePolicyStateClient { + return &AddonUpgradePolicyStateClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the upgrade policy state. +func (c *AddonUpgradePolicyStateClient) Get() *AddonUpgradePolicyStateGetRequest { + return &AddonUpgradePolicyStateGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the upgrade policy state. +func (c *AddonUpgradePolicyStateClient) Update() *AddonUpgradePolicyStateUpdateRequest { + return &AddonUpgradePolicyStateUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// AddonUpgradePolicyStatePollRequest is the request for the Poll method. +type AddonUpgradePolicyStatePollRequest struct { + request *AddonUpgradePolicyStateGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AddonUpgradePolicyStatePollRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyStatePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AddonUpgradePolicyStatePollRequest) Header(name string, value interface{}) *AddonUpgradePolicyStatePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AddonUpgradePolicyStatePollRequest) Interval(value time.Duration) *AddonUpgradePolicyStatePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AddonUpgradePolicyStatePollRequest) Status(value int) *AddonUpgradePolicyStatePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AddonUpgradePolicyStatePollRequest) Predicate(value func(*AddonUpgradePolicyStateGetResponse) bool) *AddonUpgradePolicyStatePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AddonUpgradePolicyStateGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AddonUpgradePolicyStatePollRequest) StartContext(ctx context.Context) (response *AddonUpgradePolicyStatePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AddonUpgradePolicyStatePollResponse{ + response: result.(*AddonUpgradePolicyStateGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AddonUpgradePolicyStatePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AddonUpgradePolicyStatePollResponse is the response for the Poll method. +type AddonUpgradePolicyStatePollResponse struct { + response *AddonUpgradePolicyStateGetResponse +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyStatePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyStatePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AddonUpgradePolicyStatePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AddonUpgradePolicyStatePollResponse) Body() *AddonUpgradePolicyState { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonUpgradePolicyStatePollResponse) GetBody() (value *AddonUpgradePolicyState, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AddonUpgradePolicyStateClient) Poll() *AddonUpgradePolicyStatePollRequest { + return &AddonUpgradePolicyStatePollRequest{ + request: c.Get(), + } +} + +// AddonUpgradePolicyStateGetRequest is the request for the 'get' method. +type AddonUpgradePolicyStateGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePolicyStateGetRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyStateGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePolicyStateGetRequest) Header(name string, value interface{}) *AddonUpgradePolicyStateGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePolicyStateGetRequest) Impersonate(user string) *AddonUpgradePolicyStateGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePolicyStateGetRequest) Send() (result *AddonUpgradePolicyStateGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePolicyStateGetRequest) SendContext(ctx context.Context) (result *AddonUpgradePolicyStateGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePolicyStateGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonUpgradePolicyStateGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonUpgradePolicyStateGetResponse is the response for the 'get' method. +type AddonUpgradePolicyStateGetResponse struct { + status int + header http.Header + err *errors.Error + body *AddonUpgradePolicyState +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyStateGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyStateGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePolicyStateGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddonUpgradePolicyStateGetResponse) Body() *AddonUpgradePolicyState { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonUpgradePolicyStateGetResponse) GetBody() (value *AddonUpgradePolicyState, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AddonUpgradePolicyStateUpdateRequest is the request for the 'update' method. +type AddonUpgradePolicyStateUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AddonUpgradePolicyState +} + +// Parameter adds a query parameter. +func (r *AddonUpgradePolicyStateUpdateRequest) Parameter(name string, value interface{}) *AddonUpgradePolicyStateUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AddonUpgradePolicyStateUpdateRequest) Header(name string, value interface{}) *AddonUpgradePolicyStateUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AddonUpgradePolicyStateUpdateRequest) Impersonate(user string) *AddonUpgradePolicyStateUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *AddonUpgradePolicyStateUpdateRequest) Body(value *AddonUpgradePolicyState) *AddonUpgradePolicyStateUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AddonUpgradePolicyStateUpdateRequest) Send() (result *AddonUpgradePolicyStateUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AddonUpgradePolicyStateUpdateRequest) SendContext(ctx context.Context) (result *AddonUpgradePolicyStateUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAddonUpgradePolicyStateUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AddonUpgradePolicyStateUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAddonUpgradePolicyStateUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// AddonUpgradePolicyStateUpdateResponse is the response for the 'update' method. +type AddonUpgradePolicyStateUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *AddonUpgradePolicyState +} + +// Status returns the response status code. +func (r *AddonUpgradePolicyStateUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AddonUpgradePolicyStateUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AddonUpgradePolicyStateUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AddonUpgradePolicyStateUpdateResponse) Body() *AddonUpgradePolicyState { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AddonUpgradePolicyStateUpdateResponse) GetBody() (value *AddonUpgradePolicyState, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_list_builder.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_list_builder.go new file mode 100644 index 00000000..8b42b7e6 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddonUpgradePolicyStateListBuilder contains the data and logic needed to build +// 'addon_upgrade_policy_state' objects. +type AddonUpgradePolicyStateListBuilder struct { + items []*AddonUpgradePolicyStateBuilder +} + +// NewAddonUpgradePolicyStateList creates a new builder of 'addon_upgrade_policy_state' objects. +func NewAddonUpgradePolicyStateList() *AddonUpgradePolicyStateListBuilder { + return new(AddonUpgradePolicyStateListBuilder) +} + +// Items sets the items of the list. +func (b *AddonUpgradePolicyStateListBuilder) Items(values ...*AddonUpgradePolicyStateBuilder) *AddonUpgradePolicyStateListBuilder { + b.items = make([]*AddonUpgradePolicyStateBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AddonUpgradePolicyStateListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AddonUpgradePolicyStateListBuilder) Copy(list *AddonUpgradePolicyStateList) *AddonUpgradePolicyStateListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AddonUpgradePolicyStateBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAddonUpgradePolicyState().Copy(v) + } + } + return b +} + +// Build creates a list of 'addon_upgrade_policy_state' objects using the +// configuration stored in the builder. +func (b *AddonUpgradePolicyStateListBuilder) Build() (list *AddonUpgradePolicyStateList, err error) { + items := make([]*AddonUpgradePolicyState, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AddonUpgradePolicyStateList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_list_type_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_list_type_json.go new file mode 100644 index 00000000..a7bf1e36 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddonUpgradePolicyStateList writes a list of values of the 'addon_upgrade_policy_state' type to +// the given writer. +func MarshalAddonUpgradePolicyStateList(list []*AddonUpgradePolicyState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddonUpgradePolicyStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddonUpgradePolicyStateList writes a list of value of the 'addon_upgrade_policy_state' type to +// the given stream. +func writeAddonUpgradePolicyStateList(list []*AddonUpgradePolicyState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAddonUpgradePolicyState(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAddonUpgradePolicyStateList reads a list of values of the 'addon_upgrade_policy_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAddonUpgradePolicyStateList(source interface{}) (items []*AddonUpgradePolicyState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAddonUpgradePolicyStateList(iterator) + err = iterator.Error + return +} + +// readAddonUpgradePolicyStateList reads list of values of the ”addon_upgrade_policy_state' type from +// the given iterator. +func readAddonUpgradePolicyStateList(iterator *jsoniter.Iterator) []*AddonUpgradePolicyState { + list := []*AddonUpgradePolicyState{} + for iterator.ReadArray() { + item := readAddonUpgradePolicyState(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_resource_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_resource_json.go new file mode 100644 index 00000000..ad619752 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAddonUpgradePolicyStateGetRequest(request *AddonUpgradePolicyStateGetRequest, writer io.Writer) error { + return nil +} +func readAddonUpgradePolicyStateGetResponse(response *AddonUpgradePolicyStateGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddonUpgradePolicyState(reader) + return err +} +func writeAddonUpgradePolicyStateUpdateRequest(request *AddonUpgradePolicyStateUpdateRequest, writer io.Writer) error { + return MarshalAddonUpgradePolicyState(request.body, writer) +} +func readAddonUpgradePolicyStateUpdateResponse(response *AddonUpgradePolicyStateUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAddonUpgradePolicyState(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_type.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_type.go new file mode 100644 index 00000000..d50a69b5 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_type.go @@ -0,0 +1,268 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AddonUpgradePolicyStateKind is the name of the type used to represent objects +// of type 'addon_upgrade_policy_state'. +const AddonUpgradePolicyStateKind = "AddonUpgradePolicyState" + +// AddonUpgradePolicyStateLinkKind is the name of the type used to represent links +// to objects of type 'addon_upgrade_policy_state'. +const AddonUpgradePolicyStateLinkKind = "AddonUpgradePolicyStateLink" + +// AddonUpgradePolicyStateNilKind is the name of the type used to nil references +// to objects of type 'addon_upgrade_policy_state'. +const AddonUpgradePolicyStateNilKind = "AddonUpgradePolicyStateNil" + +// AddonUpgradePolicyState represents the values of the 'addon_upgrade_policy_state' type. +// +// Representation of an addon upgrade policy state that that is set for a cluster. +type AddonUpgradePolicyState struct { + bitmap_ uint32 + id string + href string + description string + value UpgradePolicyStateValue +} + +// Kind returns the name of the type of the object. +func (o *AddonUpgradePolicyState) Kind() string { + if o == nil { + return AddonUpgradePolicyStateNilKind + } + if o.bitmap_&1 != 0 { + return AddonUpgradePolicyStateLinkKind + } + return AddonUpgradePolicyStateKind +} + +// Link returns true iif this is a link. +func (o *AddonUpgradePolicyState) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddonUpgradePolicyState) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddonUpgradePolicyState) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddonUpgradePolicyState) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddonUpgradePolicyState) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddonUpgradePolicyState) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the state. +func (o *AddonUpgradePolicyState) Description() string { + if o != nil && o.bitmap_&8 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the state. +func (o *AddonUpgradePolicyState) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.description + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State value can be 'pending', 'scheduled', 'cancelled', 'started', 'delayed', +// 'failed' or 'completed'. +func (o *AddonUpgradePolicyState) Value() UpgradePolicyStateValue { + if o != nil && o.bitmap_&16 != 0 { + return o.value + } + return UpgradePolicyStateValue("") +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// State value can be 'pending', 'scheduled', 'cancelled', 'started', 'delayed', +// 'failed' or 'completed'. +func (o *AddonUpgradePolicyState) GetValue() (value UpgradePolicyStateValue, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.value + } + return +} + +// AddonUpgradePolicyStateListKind is the name of the type used to represent list of objects of +// type 'addon_upgrade_policy_state'. +const AddonUpgradePolicyStateListKind = "AddonUpgradePolicyStateList" + +// AddonUpgradePolicyStateListLinkKind is the name of the type used to represent links to list +// of objects of type 'addon_upgrade_policy_state'. +const AddonUpgradePolicyStateListLinkKind = "AddonUpgradePolicyStateListLink" + +// AddonUpgradePolicyStateNilKind is the name of the type used to nil lists of objects of +// type 'addon_upgrade_policy_state'. +const AddonUpgradePolicyStateListNilKind = "AddonUpgradePolicyStateListNil" + +// AddonUpgradePolicyStateList is a list of values of the 'addon_upgrade_policy_state' type. +type AddonUpgradePolicyStateList struct { + href string + link bool + items []*AddonUpgradePolicyState +} + +// Kind returns the name of the type of the object. +func (l *AddonUpgradePolicyStateList) Kind() string { + if l == nil { + return AddonUpgradePolicyStateListNilKind + } + if l.link { + return AddonUpgradePolicyStateListLinkKind + } + return AddonUpgradePolicyStateListKind +} + +// Link returns true iif this is a link. +func (l *AddonUpgradePolicyStateList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddonUpgradePolicyStateList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddonUpgradePolicyStateList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddonUpgradePolicyStateList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddonUpgradePolicyStateList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddonUpgradePolicyStateList) Get(i int) *AddonUpgradePolicyState { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddonUpgradePolicyStateList) Slice() []*AddonUpgradePolicyState { + var slice []*AddonUpgradePolicyState + if l == nil { + slice = make([]*AddonUpgradePolicyState, 0) + } else { + slice = make([]*AddonUpgradePolicyState, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddonUpgradePolicyStateList) Each(f func(item *AddonUpgradePolicyState) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddonUpgradePolicyStateList) Range(f func(index int, item *AddonUpgradePolicyState) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_state_type_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_type_json.go new file mode 100644 index 00000000..47039c86 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_state_type_json.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddonUpgradePolicyState writes a value of the 'addon_upgrade_policy_state' type to the given writer. +func MarshalAddonUpgradePolicyState(object *AddonUpgradePolicyState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddonUpgradePolicyState(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddonUpgradePolicyState writes a value of the 'addon_upgrade_policy_state' type to the given stream. +func writeAddonUpgradePolicyState(object *AddonUpgradePolicyState, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddonUpgradePolicyStateLinkKind) + } else { + stream.WriteString(AddonUpgradePolicyStateKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(string(object.value)) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddonUpgradePolicyState reads a value of the 'addon_upgrade_policy_state' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddonUpgradePolicyState(source interface{}) (object *AddonUpgradePolicyState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddonUpgradePolicyState(iterator) + err = iterator.Error + return +} + +// readAddonUpgradePolicyState reads a value of the 'addon_upgrade_policy_state' type from the given iterator. +func readAddonUpgradePolicyState(iterator *jsoniter.Iterator) *AddonUpgradePolicyState { + object := &AddonUpgradePolicyState{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddonUpgradePolicyStateLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 8 + case "value": + text := iterator.ReadString() + value := UpgradePolicyStateValue(text) + object.value = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_type.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_type.go new file mode 100644 index 00000000..859e00b2 --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_type.go @@ -0,0 +1,390 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// AddonUpgradePolicyKind is the name of the type used to represent objects +// of type 'addon_upgrade_policy'. +const AddonUpgradePolicyKind = "AddonUpgradePolicy" + +// AddonUpgradePolicyLinkKind is the name of the type used to represent links +// to objects of type 'addon_upgrade_policy'. +const AddonUpgradePolicyLinkKind = "AddonUpgradePolicyLink" + +// AddonUpgradePolicyNilKind is the name of the type used to nil references +// to objects of type 'addon_upgrade_policy'. +const AddonUpgradePolicyNilKind = "AddonUpgradePolicyNil" + +// AddonUpgradePolicy represents the values of the 'addon_upgrade_policy' type. +// +// Representation of an upgrade policy that can be set for a cluster. +type AddonUpgradePolicy struct { + bitmap_ uint32 + id string + href string + addonID string + clusterID string + nextRun time.Time + schedule string + scheduleType string + upgradeType string + version string +} + +// Kind returns the name of the type of the object. +func (o *AddonUpgradePolicy) Kind() string { + if o == nil { + return AddonUpgradePolicyNilKind + } + if o.bitmap_&1 != 0 { + return AddonUpgradePolicyLinkKind + } + return AddonUpgradePolicyKind +} + +// Link returns true iif this is a link. +func (o *AddonUpgradePolicy) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AddonUpgradePolicy) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AddonUpgradePolicy) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AddonUpgradePolicy) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AddonUpgradePolicy) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AddonUpgradePolicy) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AddonID returns the value of the 'addon_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Addon ID this upgrade policy is defined for +func (o *AddonUpgradePolicy) AddonID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.addonID + } + return "" +} + +// GetAddonID returns the value of the 'addon_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Addon ID this upgrade policy is defined for +func (o *AddonUpgradePolicy) GetAddonID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.addonID + } + return +} + +// ClusterID returns the value of the 'cluster_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster ID this upgrade policy is defined for. +func (o *AddonUpgradePolicy) ClusterID() string { + if o != nil && o.bitmap_&16 != 0 { + return o.clusterID + } + return "" +} + +// GetClusterID returns the value of the 'cluster_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster ID this upgrade policy is defined for. +func (o *AddonUpgradePolicy) GetClusterID() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.clusterID + } + return +} + +// NextRun returns the value of the 'next_run' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Next time the upgrade should run. +func (o *AddonUpgradePolicy) NextRun() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.nextRun + } + return time.Time{} +} + +// GetNextRun returns the value of the 'next_run' attribute and +// a flag indicating if the attribute has a value. +// +// Next time the upgrade should run. +func (o *AddonUpgradePolicy) GetNextRun() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.nextRun + } + return +} + +// Schedule returns the value of the 'schedule' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *AddonUpgradePolicy) Schedule() string { + if o != nil && o.bitmap_&64 != 0 { + return o.schedule + } + return "" +} + +// GetSchedule returns the value of the 'schedule' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *AddonUpgradePolicy) GetSchedule() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.schedule + } + return +} + +// ScheduleType returns the value of the 'schedule_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule type can be either "manual" (single execution) or "automatic" (re-occurring). +func (o *AddonUpgradePolicy) ScheduleType() string { + if o != nil && o.bitmap_&128 != 0 { + return o.scheduleType + } + return "" +} + +// GetScheduleType returns the value of the 'schedule_type' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule type can be either "manual" (single execution) or "automatic" (re-occurring). +func (o *AddonUpgradePolicy) GetScheduleType() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.scheduleType + } + return +} + +// UpgradeType returns the value of the 'upgrade_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Upgrade type specify the type of the upgrade. Must be "ADDON". +func (o *AddonUpgradePolicy) UpgradeType() string { + if o != nil && o.bitmap_&256 != 0 { + return o.upgradeType + } + return "" +} + +// GetUpgradeType returns the value of the 'upgrade_type' attribute and +// a flag indicating if the attribute has a value. +// +// Upgrade type specify the type of the upgrade. Must be "ADDON". +func (o *AddonUpgradePolicy) GetUpgradeType() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.upgradeType + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version is the desired upgrade version. +func (o *AddonUpgradePolicy) Version() string { + if o != nil && o.bitmap_&512 != 0 { + return o.version + } + return "" +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Version is the desired upgrade version. +func (o *AddonUpgradePolicy) GetVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.version + } + return +} + +// AddonUpgradePolicyListKind is the name of the type used to represent list of objects of +// type 'addon_upgrade_policy'. +const AddonUpgradePolicyListKind = "AddonUpgradePolicyList" + +// AddonUpgradePolicyListLinkKind is the name of the type used to represent links to list +// of objects of type 'addon_upgrade_policy'. +const AddonUpgradePolicyListLinkKind = "AddonUpgradePolicyListLink" + +// AddonUpgradePolicyNilKind is the name of the type used to nil lists of objects of +// type 'addon_upgrade_policy'. +const AddonUpgradePolicyListNilKind = "AddonUpgradePolicyListNil" + +// AddonUpgradePolicyList is a list of values of the 'addon_upgrade_policy' type. +type AddonUpgradePolicyList struct { + href string + link bool + items []*AddonUpgradePolicy +} + +// Kind returns the name of the type of the object. +func (l *AddonUpgradePolicyList) Kind() string { + if l == nil { + return AddonUpgradePolicyListNilKind + } + if l.link { + return AddonUpgradePolicyListLinkKind + } + return AddonUpgradePolicyListKind +} + +// Link returns true iif this is a link. +func (l *AddonUpgradePolicyList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AddonUpgradePolicyList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AddonUpgradePolicyList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AddonUpgradePolicyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AddonUpgradePolicyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AddonUpgradePolicyList) Get(i int) *AddonUpgradePolicy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AddonUpgradePolicyList) Slice() []*AddonUpgradePolicy { + var slice []*AddonUpgradePolicy + if l == nil { + slice = make([]*AddonUpgradePolicy, 0) + } else { + slice = make([]*AddonUpgradePolicy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AddonUpgradePolicyList) Each(f func(item *AddonUpgradePolicy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AddonUpgradePolicyList) Range(f func(index int, item *AddonUpgradePolicy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/addon_upgrade_policy_type_json.go b/clustersmgmt/v2alpha1/addon_upgrade_policy_type_json.go new file mode 100644 index 00000000..e65c0e3e --- /dev/null +++ b/clustersmgmt/v2alpha1/addon_upgrade_policy_type_json.go @@ -0,0 +1,203 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAddonUpgradePolicy writes a value of the 'addon_upgrade_policy' type to the given writer. +func MarshalAddonUpgradePolicy(object *AddonUpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAddonUpgradePolicy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAddonUpgradePolicy writes a value of the 'addon_upgrade_policy' type to the given stream. +func writeAddonUpgradePolicy(object *AddonUpgradePolicy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AddonUpgradePolicyLinkKind) + } else { + stream.WriteString(AddonUpgradePolicyKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("addon_id") + stream.WriteString(object.addonID) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_id") + stream.WriteString(object.clusterID) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("next_run") + stream.WriteString((object.nextRun).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule") + stream.WriteString(object.schedule) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule_type") + stream.WriteString(object.scheduleType) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("upgrade_type") + stream.WriteString(object.upgradeType) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + stream.WriteString(object.version) + } + stream.WriteObjectEnd() +} + +// UnmarshalAddonUpgradePolicy reads a value of the 'addon_upgrade_policy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAddonUpgradePolicy(source interface{}) (object *AddonUpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAddonUpgradePolicy(iterator) + err = iterator.Error + return +} + +// readAddonUpgradePolicy reads a value of the 'addon_upgrade_policy' type from the given iterator. +func readAddonUpgradePolicy(iterator *jsoniter.Iterator) *AddonUpgradePolicy { + object := &AddonUpgradePolicy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AddonUpgradePolicyLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "addon_id": + value := iterator.ReadString() + object.addonID = value + object.bitmap_ |= 8 + case "cluster_id": + value := iterator.ReadString() + object.clusterID = value + object.bitmap_ |= 16 + case "next_run": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.nextRun = value + object.bitmap_ |= 32 + case "schedule": + value := iterator.ReadString() + object.schedule = value + object.bitmap_ |= 64 + case "schedule_type": + value := iterator.ReadString() + object.scheduleType = value + object.bitmap_ |= 128 + case "upgrade_type": + value := iterator.ReadString() + object.upgradeType = value + object.bitmap_ |= 256 + case "version": + value := iterator.ReadString() + object.version = value + object.bitmap_ |= 512 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/admin_credentials_builder.go b/clustersmgmt/v2alpha1/admin_credentials_builder.go new file mode 100644 index 00000000..0d0eb546 --- /dev/null +++ b/clustersmgmt/v2alpha1/admin_credentials_builder.go @@ -0,0 +1,74 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AdminCredentialsBuilder contains the data and logic needed to build 'admin_credentials' objects. +// +// Temporary administrator credentials generated during the installation of the +// cluster. +type AdminCredentialsBuilder struct { + bitmap_ uint32 + password string + user string +} + +// NewAdminCredentials creates a new builder of 'admin_credentials' objects. +func NewAdminCredentials() *AdminCredentialsBuilder { + return &AdminCredentialsBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AdminCredentialsBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Password sets the value of the 'password' attribute to the given value. +func (b *AdminCredentialsBuilder) Password(value string) *AdminCredentialsBuilder { + b.password = value + b.bitmap_ |= 1 + return b +} + +// User sets the value of the 'user' attribute to the given value. +func (b *AdminCredentialsBuilder) User(value string) *AdminCredentialsBuilder { + b.user = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AdminCredentialsBuilder) Copy(object *AdminCredentials) *AdminCredentialsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.password = object.password + b.user = object.user + return b +} + +// Build creates a 'admin_credentials' object using the configuration stored in the builder. +func (b *AdminCredentialsBuilder) Build() (object *AdminCredentials, err error) { + object = new(AdminCredentials) + object.bitmap_ = b.bitmap_ + object.password = b.password + object.user = b.user + return +} diff --git a/clustersmgmt/v2alpha1/admin_credentials_list_builder.go b/clustersmgmt/v2alpha1/admin_credentials_list_builder.go new file mode 100644 index 00000000..060eb806 --- /dev/null +++ b/clustersmgmt/v2alpha1/admin_credentials_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AdminCredentialsListBuilder contains the data and logic needed to build +// 'admin_credentials' objects. +type AdminCredentialsListBuilder struct { + items []*AdminCredentialsBuilder +} + +// NewAdminCredentialsList creates a new builder of 'admin_credentials' objects. +func NewAdminCredentialsList() *AdminCredentialsListBuilder { + return new(AdminCredentialsListBuilder) +} + +// Items sets the items of the list. +func (b *AdminCredentialsListBuilder) Items(values ...*AdminCredentialsBuilder) *AdminCredentialsListBuilder { + b.items = make([]*AdminCredentialsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AdminCredentialsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AdminCredentialsListBuilder) Copy(list *AdminCredentialsList) *AdminCredentialsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AdminCredentialsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAdminCredentials().Copy(v) + } + } + return b +} + +// Build creates a list of 'admin_credentials' objects using the +// configuration stored in the builder. +func (b *AdminCredentialsListBuilder) Build() (list *AdminCredentialsList, err error) { + items := make([]*AdminCredentials, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AdminCredentialsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/admin_credentials_list_type_json.go b/clustersmgmt/v2alpha1/admin_credentials_list_type_json.go new file mode 100644 index 00000000..cf5236d6 --- /dev/null +++ b/clustersmgmt/v2alpha1/admin_credentials_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAdminCredentialsList writes a list of values of the 'admin_credentials' type to +// the given writer. +func MarshalAdminCredentialsList(list []*AdminCredentials, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAdminCredentialsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAdminCredentialsList writes a list of value of the 'admin_credentials' type to +// the given stream. +func writeAdminCredentialsList(list []*AdminCredentials, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAdminCredentials(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAdminCredentialsList reads a list of values of the 'admin_credentials' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAdminCredentialsList(source interface{}) (items []*AdminCredentials, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAdminCredentialsList(iterator) + err = iterator.Error + return +} + +// readAdminCredentialsList reads list of values of the ”admin_credentials' type from +// the given iterator. +func readAdminCredentialsList(iterator *jsoniter.Iterator) []*AdminCredentials { + list := []*AdminCredentials{} + for iterator.ReadArray() { + item := readAdminCredentials(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/admin_credentials_type.go b/clustersmgmt/v2alpha1/admin_credentials_type.go new file mode 100644 index 00000000..9c299b9b --- /dev/null +++ b/clustersmgmt/v2alpha1/admin_credentials_type.go @@ -0,0 +1,167 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AdminCredentials represents the values of the 'admin_credentials' type. +// +// Temporary administrator credentials generated during the installation of the +// cluster. +type AdminCredentials struct { + bitmap_ uint32 + password string + user string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AdminCredentials) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Password returns the value of the 'password' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster administrator password. +func (o *AdminCredentials) Password() string { + if o != nil && o.bitmap_&1 != 0 { + return o.password + } + return "" +} + +// GetPassword returns the value of the 'password' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster administrator password. +func (o *AdminCredentials) GetPassword() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.password + } + return +} + +// User returns the value of the 'user' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster administrator user name. +func (o *AdminCredentials) User() string { + if o != nil && o.bitmap_&2 != 0 { + return o.user + } + return "" +} + +// GetUser returns the value of the 'user' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster administrator user name. +func (o *AdminCredentials) GetUser() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.user + } + return +} + +// AdminCredentialsListKind is the name of the type used to represent list of objects of +// type 'admin_credentials'. +const AdminCredentialsListKind = "AdminCredentialsList" + +// AdminCredentialsListLinkKind is the name of the type used to represent links to list +// of objects of type 'admin_credentials'. +const AdminCredentialsListLinkKind = "AdminCredentialsListLink" + +// AdminCredentialsNilKind is the name of the type used to nil lists of objects of +// type 'admin_credentials'. +const AdminCredentialsListNilKind = "AdminCredentialsListNil" + +// AdminCredentialsList is a list of values of the 'admin_credentials' type. +type AdminCredentialsList struct { + href string + link bool + items []*AdminCredentials +} + +// Len returns the length of the list. +func (l *AdminCredentialsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AdminCredentialsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AdminCredentialsList) Get(i int) *AdminCredentials { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AdminCredentialsList) Slice() []*AdminCredentials { + var slice []*AdminCredentials + if l == nil { + slice = make([]*AdminCredentials, 0) + } else { + slice = make([]*AdminCredentials, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AdminCredentialsList) Each(f func(item *AdminCredentials) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AdminCredentialsList) Range(f func(index int, item *AdminCredentials) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/admin_credentials_type_json.go b/clustersmgmt/v2alpha1/admin_credentials_type_json.go new file mode 100644 index 00000000..27a5dcfb --- /dev/null +++ b/clustersmgmt/v2alpha1/admin_credentials_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAdminCredentials writes a value of the 'admin_credentials' type to the given writer. +func MarshalAdminCredentials(object *AdminCredentials, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAdminCredentials(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAdminCredentials writes a value of the 'admin_credentials' type to the given stream. +func writeAdminCredentials(object *AdminCredentials, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("password") + stream.WriteString(object.password) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("user") + stream.WriteString(object.user) + } + stream.WriteObjectEnd() +} + +// UnmarshalAdminCredentials reads a value of the 'admin_credentials' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAdminCredentials(source interface{}) (object *AdminCredentials, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAdminCredentials(iterator) + err = iterator.Error + return +} + +// readAdminCredentials reads a value of the 'admin_credentials' type from the given iterator. +func readAdminCredentials(iterator *jsoniter.Iterator) *AdminCredentials { + object := &AdminCredentials{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "password": + value := iterator.ReadString() + object.password = value + object.bitmap_ |= 1 + case "user": + value := iterator.ReadString() + object.user = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/alert_info_builder.go b/clustersmgmt/v2alpha1/alert_info_builder.go new file mode 100644 index 00000000..deeb8e2d --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_info_builder.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertInfoBuilder contains the data and logic needed to build 'alert_info' objects. +// +// Provides information about a single alert firing on the cluster. +type AlertInfoBuilder struct { + bitmap_ uint32 + name string + severity AlertSeverity +} + +// NewAlertInfo creates a new builder of 'alert_info' objects. +func NewAlertInfo() *AlertInfoBuilder { + return &AlertInfoBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AlertInfoBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *AlertInfoBuilder) Name(value string) *AlertInfoBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Severity sets the value of the 'severity' attribute to the given value. +// +// Severity of a cluster alert received via telemetry. +func (b *AlertInfoBuilder) Severity(value AlertSeverity) *AlertInfoBuilder { + b.severity = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AlertInfoBuilder) Copy(object *AlertInfo) *AlertInfoBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + b.severity = object.severity + return b +} + +// Build creates a 'alert_info' object using the configuration stored in the builder. +func (b *AlertInfoBuilder) Build() (object *AlertInfo, err error) { + object = new(AlertInfo) + object.bitmap_ = b.bitmap_ + object.name = b.name + object.severity = b.severity + return +} diff --git a/clustersmgmt/v2alpha1/alert_info_list_builder.go b/clustersmgmt/v2alpha1/alert_info_list_builder.go new file mode 100644 index 00000000..7a3477d2 --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_info_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertInfoListBuilder contains the data and logic needed to build +// 'alert_info' objects. +type AlertInfoListBuilder struct { + items []*AlertInfoBuilder +} + +// NewAlertInfoList creates a new builder of 'alert_info' objects. +func NewAlertInfoList() *AlertInfoListBuilder { + return new(AlertInfoListBuilder) +} + +// Items sets the items of the list. +func (b *AlertInfoListBuilder) Items(values ...*AlertInfoBuilder) *AlertInfoListBuilder { + b.items = make([]*AlertInfoBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AlertInfoListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AlertInfoListBuilder) Copy(list *AlertInfoList) *AlertInfoListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AlertInfoBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAlertInfo().Copy(v) + } + } + return b +} + +// Build creates a list of 'alert_info' objects using the +// configuration stored in the builder. +func (b *AlertInfoListBuilder) Build() (list *AlertInfoList, err error) { + items := make([]*AlertInfo, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AlertInfoList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/alert_info_list_type_json.go b/clustersmgmt/v2alpha1/alert_info_list_type_json.go new file mode 100644 index 00000000..94e72f16 --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_info_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAlertInfoList writes a list of values of the 'alert_info' type to +// the given writer. +func MarshalAlertInfoList(list []*AlertInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAlertInfoList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAlertInfoList writes a list of value of the 'alert_info' type to +// the given stream. +func writeAlertInfoList(list []*AlertInfo, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAlertInfo(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAlertInfoList reads a list of values of the 'alert_info' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAlertInfoList(source interface{}) (items []*AlertInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAlertInfoList(iterator) + err = iterator.Error + return +} + +// readAlertInfoList reads list of values of the ”alert_info' type from +// the given iterator. +func readAlertInfoList(iterator *jsoniter.Iterator) []*AlertInfo { + list := []*AlertInfo{} + for iterator.ReadArray() { + item := readAlertInfo(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/alert_info_type.go b/clustersmgmt/v2alpha1/alert_info_type.go new file mode 100644 index 00000000..49818d75 --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_info_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertInfo represents the values of the 'alert_info' type. +// +// Provides information about a single alert firing on the cluster. +type AlertInfo struct { + bitmap_ uint32 + name string + severity AlertSeverity +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AlertInfo) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The alert name. Multiple alerts with same name are possible. +func (o *AlertInfo) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// The alert name. Multiple alerts with same name are possible. +func (o *AlertInfo) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Severity returns the value of the 'severity' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The alert severity. +func (o *AlertInfo) Severity() AlertSeverity { + if o != nil && o.bitmap_&2 != 0 { + return o.severity + } + return AlertSeverity("") +} + +// GetSeverity returns the value of the 'severity' attribute and +// a flag indicating if the attribute has a value. +// +// The alert severity. +func (o *AlertInfo) GetSeverity() (value AlertSeverity, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.severity + } + return +} + +// AlertInfoListKind is the name of the type used to represent list of objects of +// type 'alert_info'. +const AlertInfoListKind = "AlertInfoList" + +// AlertInfoListLinkKind is the name of the type used to represent links to list +// of objects of type 'alert_info'. +const AlertInfoListLinkKind = "AlertInfoListLink" + +// AlertInfoNilKind is the name of the type used to nil lists of objects of +// type 'alert_info'. +const AlertInfoListNilKind = "AlertInfoListNil" + +// AlertInfoList is a list of values of the 'alert_info' type. +type AlertInfoList struct { + href string + link bool + items []*AlertInfo +} + +// Len returns the length of the list. +func (l *AlertInfoList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AlertInfoList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AlertInfoList) Get(i int) *AlertInfo { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AlertInfoList) Slice() []*AlertInfo { + var slice []*AlertInfo + if l == nil { + slice = make([]*AlertInfo, 0) + } else { + slice = make([]*AlertInfo, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AlertInfoList) Each(f func(item *AlertInfo) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AlertInfoList) Range(f func(index int, item *AlertInfo) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/alert_info_type_json.go b/clustersmgmt/v2alpha1/alert_info_type_json.go new file mode 100644 index 00000000..b0499073 --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_info_type_json.go @@ -0,0 +1,100 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAlertInfo writes a value of the 'alert_info' type to the given writer. +func MarshalAlertInfo(object *AlertInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAlertInfo(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAlertInfo writes a value of the 'alert_info' type to the given stream. +func writeAlertInfo(object *AlertInfo, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("severity") + stream.WriteString(string(object.severity)) + } + stream.WriteObjectEnd() +} + +// UnmarshalAlertInfo reads a value of the 'alert_info' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAlertInfo(source interface{}) (object *AlertInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAlertInfo(iterator) + err = iterator.Error + return +} + +// readAlertInfo reads a value of the 'alert_info' type from the given iterator. +func readAlertInfo(iterator *jsoniter.Iterator) *AlertInfo { + object := &AlertInfo{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "severity": + text := iterator.ReadString() + value := AlertSeverity(text) + object.severity = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/alert_severity_list_type_json.go b/clustersmgmt/v2alpha1/alert_severity_list_type_json.go new file mode 100644 index 00000000..e9ea0f47 --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_severity_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAlertSeverityList writes a list of values of the 'alert_severity' type to +// the given writer. +func MarshalAlertSeverityList(list []AlertSeverity, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAlertSeverityList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAlertSeverityList writes a list of value of the 'alert_severity' type to +// the given stream. +func writeAlertSeverityList(list []AlertSeverity, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalAlertSeverityList reads a list of values of the 'alert_severity' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAlertSeverityList(source interface{}) (items []AlertSeverity, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAlertSeverityList(iterator) + err = iterator.Error + return +} + +// readAlertSeverityList reads list of values of the ”alert_severity' type from +// the given iterator. +func readAlertSeverityList(iterator *jsoniter.Iterator) []AlertSeverity { + list := []AlertSeverity{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := AlertSeverity(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/alert_severity_type.go b/clustersmgmt/v2alpha1/alert_severity_type.go new file mode 100644 index 00000000..d0497620 --- /dev/null +++ b/clustersmgmt/v2alpha1/alert_severity_type.go @@ -0,0 +1,32 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertSeverity represents the values of the 'alert_severity' enumerated type. +type AlertSeverity string + +const ( + // Critical. + AlertSeverityCritical AlertSeverity = "critical" + // This level is only used for the "Watchdog" alert that is always on. + AlertSeverityNone AlertSeverity = "none" + // Warning. + AlertSeverityWarning AlertSeverity = "warning" +) diff --git a/clustersmgmt/v2alpha1/alerts_info_builder.go b/clustersmgmt/v2alpha1/alerts_info_builder.go new file mode 100644 index 00000000..a3317aa4 --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_info_builder.go @@ -0,0 +1,79 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertsInfoBuilder contains the data and logic needed to build 'alerts_info' objects. +// +// Provides information about the alerts firing on the cluster. +type AlertsInfoBuilder struct { + bitmap_ uint32 + alerts []*AlertInfoBuilder +} + +// NewAlertsInfo creates a new builder of 'alerts_info' objects. +func NewAlertsInfo() *AlertsInfoBuilder { + return &AlertsInfoBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AlertsInfoBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Alerts sets the value of the 'alerts' attribute to the given values. +func (b *AlertsInfoBuilder) Alerts(values ...*AlertInfoBuilder) *AlertsInfoBuilder { + b.alerts = make([]*AlertInfoBuilder, len(values)) + copy(b.alerts, values) + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AlertsInfoBuilder) Copy(object *AlertsInfo) *AlertsInfoBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.alerts != nil { + b.alerts = make([]*AlertInfoBuilder, len(object.alerts)) + for i, v := range object.alerts { + b.alerts[i] = NewAlertInfo().Copy(v) + } + } else { + b.alerts = nil + } + return b +} + +// Build creates a 'alerts_info' object using the configuration stored in the builder. +func (b *AlertsInfoBuilder) Build() (object *AlertsInfo, err error) { + object = new(AlertsInfo) + object.bitmap_ = b.bitmap_ + if b.alerts != nil { + object.alerts = make([]*AlertInfo, len(b.alerts)) + for i, v := range b.alerts { + object.alerts[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/alerts_info_list_builder.go b/clustersmgmt/v2alpha1/alerts_info_list_builder.go new file mode 100644 index 00000000..c1e114b0 --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_info_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertsInfoListBuilder contains the data and logic needed to build +// 'alerts_info' objects. +type AlertsInfoListBuilder struct { + items []*AlertsInfoBuilder +} + +// NewAlertsInfoList creates a new builder of 'alerts_info' objects. +func NewAlertsInfoList() *AlertsInfoListBuilder { + return new(AlertsInfoListBuilder) +} + +// Items sets the items of the list. +func (b *AlertsInfoListBuilder) Items(values ...*AlertsInfoBuilder) *AlertsInfoListBuilder { + b.items = make([]*AlertsInfoBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AlertsInfoListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AlertsInfoListBuilder) Copy(list *AlertsInfoList) *AlertsInfoListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AlertsInfoBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAlertsInfo().Copy(v) + } + } + return b +} + +// Build creates a list of 'alerts_info' objects using the +// configuration stored in the builder. +func (b *AlertsInfoListBuilder) Build() (list *AlertsInfoList, err error) { + items := make([]*AlertsInfo, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AlertsInfoList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/alerts_info_list_type_json.go b/clustersmgmt/v2alpha1/alerts_info_list_type_json.go new file mode 100644 index 00000000..d1171b3d --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_info_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAlertsInfoList writes a list of values of the 'alerts_info' type to +// the given writer. +func MarshalAlertsInfoList(list []*AlertsInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAlertsInfoList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAlertsInfoList writes a list of value of the 'alerts_info' type to +// the given stream. +func writeAlertsInfoList(list []*AlertsInfo, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAlertsInfo(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAlertsInfoList reads a list of values of the 'alerts_info' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAlertsInfoList(source interface{}) (items []*AlertsInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAlertsInfoList(iterator) + err = iterator.Error + return +} + +// readAlertsInfoList reads list of values of the ”alerts_info' type from +// the given iterator. +func readAlertsInfoList(iterator *jsoniter.Iterator) []*AlertsInfo { + list := []*AlertsInfo{} + for iterator.ReadArray() { + item := readAlertsInfo(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/alerts_info_type.go b/clustersmgmt/v2alpha1/alerts_info_type.go new file mode 100644 index 00000000..1558f222 --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_info_type.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AlertsInfo represents the values of the 'alerts_info' type. +// +// Provides information about the alerts firing on the cluster. +type AlertsInfo struct { + bitmap_ uint32 + alerts []*AlertInfo +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AlertsInfo) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Alerts returns the value of the 'alerts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *AlertsInfo) Alerts() []*AlertInfo { + if o != nil && o.bitmap_&1 != 0 { + return o.alerts + } + return nil +} + +// GetAlerts returns the value of the 'alerts' attribute and +// a flag indicating if the attribute has a value. +func (o *AlertsInfo) GetAlerts() (value []*AlertInfo, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.alerts + } + return +} + +// AlertsInfoListKind is the name of the type used to represent list of objects of +// type 'alerts_info'. +const AlertsInfoListKind = "AlertsInfoList" + +// AlertsInfoListLinkKind is the name of the type used to represent links to list +// of objects of type 'alerts_info'. +const AlertsInfoListLinkKind = "AlertsInfoListLink" + +// AlertsInfoNilKind is the name of the type used to nil lists of objects of +// type 'alerts_info'. +const AlertsInfoListNilKind = "AlertsInfoListNil" + +// AlertsInfoList is a list of values of the 'alerts_info' type. +type AlertsInfoList struct { + href string + link bool + items []*AlertsInfo +} + +// Len returns the length of the list. +func (l *AlertsInfoList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AlertsInfoList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AlertsInfoList) Get(i int) *AlertsInfo { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AlertsInfoList) Slice() []*AlertsInfo { + var slice []*AlertsInfo + if l == nil { + slice = make([]*AlertsInfo, 0) + } else { + slice = make([]*AlertsInfo, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AlertsInfoList) Each(f func(item *AlertsInfo) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AlertsInfoList) Range(f func(index int, item *AlertsInfo) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/alerts_info_type_json.go b/clustersmgmt/v2alpha1/alerts_info_type_json.go new file mode 100644 index 00000000..4ff95575 --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_info_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAlertsInfo writes a value of the 'alerts_info' type to the given writer. +func MarshalAlertsInfo(object *AlertsInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAlertsInfo(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAlertsInfo writes a value of the 'alerts_info' type to the given stream. +func writeAlertsInfo(object *AlertsInfo, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.alerts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("alerts") + writeAlertInfoList(object.alerts, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAlertsInfo reads a value of the 'alerts_info' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAlertsInfo(source interface{}) (object *AlertsInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAlertsInfo(iterator) + err = iterator.Error + return +} + +// readAlertsInfo reads a value of the 'alerts_info' type from the given iterator. +func readAlertsInfo(iterator *jsoniter.Iterator) *AlertsInfo { + object := &AlertsInfo{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "alerts": + value := readAlertInfoList(iterator) + object.alerts = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/alerts_metric_query_client.go b/clustersmgmt/v2alpha1/alerts_metric_query_client.go new file mode 100644 index 00000000..ee9d9488 --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_metric_query_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AlertsMetricQueryClient is the client of the 'alerts_metric_query' resource. +// +// Provides information about the alerts firing on the cluster. +type AlertsMetricQueryClient struct { + transport http.RoundTripper + path string +} + +// NewAlertsMetricQueryClient creates a new client for the 'alerts_metric_query' +// resource using the given transport to send the requests and receive the +// responses. +func NewAlertsMetricQueryClient(transport http.RoundTripper, path string) *AlertsMetricQueryClient { + return &AlertsMetricQueryClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *AlertsMetricQueryClient) Get() *AlertsMetricQueryGetRequest { + return &AlertsMetricQueryGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// AlertsMetricQueryPollRequest is the request for the Poll method. +type AlertsMetricQueryPollRequest struct { + request *AlertsMetricQueryGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AlertsMetricQueryPollRequest) Parameter(name string, value interface{}) *AlertsMetricQueryPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AlertsMetricQueryPollRequest) Header(name string, value interface{}) *AlertsMetricQueryPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AlertsMetricQueryPollRequest) Interval(value time.Duration) *AlertsMetricQueryPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AlertsMetricQueryPollRequest) Status(value int) *AlertsMetricQueryPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AlertsMetricQueryPollRequest) Predicate(value func(*AlertsMetricQueryGetResponse) bool) *AlertsMetricQueryPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AlertsMetricQueryGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AlertsMetricQueryPollRequest) StartContext(ctx context.Context) (response *AlertsMetricQueryPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AlertsMetricQueryPollResponse{ + response: result.(*AlertsMetricQueryGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AlertsMetricQueryPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AlertsMetricQueryPollResponse is the response for the Poll method. +type AlertsMetricQueryPollResponse struct { + response *AlertsMetricQueryGetResponse +} + +// Status returns the response status code. +func (r *AlertsMetricQueryPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AlertsMetricQueryPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AlertsMetricQueryPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AlertsMetricQueryPollResponse) Body() *AlertsInfo { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AlertsMetricQueryPollResponse) GetBody() (value *AlertsInfo, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AlertsMetricQueryClient) Poll() *AlertsMetricQueryPollRequest { + return &AlertsMetricQueryPollRequest{ + request: c.Get(), + } +} + +// AlertsMetricQueryGetRequest is the request for the 'get' method. +type AlertsMetricQueryGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AlertsMetricQueryGetRequest) Parameter(name string, value interface{}) *AlertsMetricQueryGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AlertsMetricQueryGetRequest) Header(name string, value interface{}) *AlertsMetricQueryGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AlertsMetricQueryGetRequest) Impersonate(user string) *AlertsMetricQueryGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AlertsMetricQueryGetRequest) Send() (result *AlertsMetricQueryGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AlertsMetricQueryGetRequest) SendContext(ctx context.Context) (result *AlertsMetricQueryGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AlertsMetricQueryGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAlertsMetricQueryGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AlertsMetricQueryGetResponse is the response for the 'get' method. +type AlertsMetricQueryGetResponse struct { + status int + header http.Header + err *errors.Error + body *AlertsInfo +} + +// Status returns the response status code. +func (r *AlertsMetricQueryGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AlertsMetricQueryGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AlertsMetricQueryGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AlertsMetricQueryGetResponse) Body() *AlertsInfo { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AlertsMetricQueryGetResponse) GetBody() (value *AlertsInfo, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/alerts_metric_query_resource_json.go b/clustersmgmt/v2alpha1/alerts_metric_query_resource_json.go new file mode 100644 index 00000000..ec970de7 --- /dev/null +++ b/clustersmgmt/v2alpha1/alerts_metric_query_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAlertsMetricQueryGetRequest(request *AlertsMetricQueryGetRequest, writer io.Writer) error { + return nil +} +func readAlertsMetricQueryGetResponse(response *AlertsMetricQueryGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAlertsInfo(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/ami_override_builder.go b/clustersmgmt/v2alpha1/ami_override_builder.go new file mode 100644 index 00000000..97dedb8d --- /dev/null +++ b/clustersmgmt/v2alpha1/ami_override_builder.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AMIOverrideBuilder contains the data and logic needed to build 'AMI_override' objects. +// +// AMIOverride specifies what Amazon Machine Image should be used for a particular product and region. +type AMIOverrideBuilder struct { + bitmap_ uint32 + id string + href string + ami string + product *ProductBuilder + region *CloudRegionBuilder +} + +// NewAMIOverride creates a new builder of 'AMI_override' objects. +func NewAMIOverride() *AMIOverrideBuilder { + return &AMIOverrideBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AMIOverrideBuilder) Link(value bool) *AMIOverrideBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AMIOverrideBuilder) ID(value string) *AMIOverrideBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AMIOverrideBuilder) HREF(value string) *AMIOverrideBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AMIOverrideBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AMI sets the value of the 'AMI' attribute to the given value. +func (b *AMIOverrideBuilder) AMI(value string) *AMIOverrideBuilder { + b.ami = value + b.bitmap_ |= 8 + return b +} + +// Product sets the value of the 'product' attribute to the given value. +// +// Representation of an product that can be selected as a cluster type. +func (b *AMIOverrideBuilder) Product(value *ProductBuilder) *AMIOverrideBuilder { + b.product = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Region sets the value of the 'region' attribute to the given value. +// +// Description of a region of a cloud provider. +func (b *AMIOverrideBuilder) Region(value *CloudRegionBuilder) *AMIOverrideBuilder { + b.region = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AMIOverrideBuilder) Copy(object *AMIOverride) *AMIOverrideBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.ami = object.ami + if object.product != nil { + b.product = NewProduct().Copy(object.product) + } else { + b.product = nil + } + if object.region != nil { + b.region = NewCloudRegion().Copy(object.region) + } else { + b.region = nil + } + return b +} + +// Build creates a 'AMI_override' object using the configuration stored in the builder. +func (b *AMIOverrideBuilder) Build() (object *AMIOverride, err error) { + object = new(AMIOverride) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.ami = b.ami + if b.product != nil { + object.product, err = b.product.Build() + if err != nil { + return + } + } + if b.region != nil { + object.region, err = b.region.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/ami_override_list_builder.go b/clustersmgmt/v2alpha1/ami_override_list_builder.go new file mode 100644 index 00000000..60632296 --- /dev/null +++ b/clustersmgmt/v2alpha1/ami_override_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AMIOverrideListBuilder contains the data and logic needed to build +// 'AMI_override' objects. +type AMIOverrideListBuilder struct { + items []*AMIOverrideBuilder +} + +// NewAMIOverrideList creates a new builder of 'AMI_override' objects. +func NewAMIOverrideList() *AMIOverrideListBuilder { + return new(AMIOverrideListBuilder) +} + +// Items sets the items of the list. +func (b *AMIOverrideListBuilder) Items(values ...*AMIOverrideBuilder) *AMIOverrideListBuilder { + b.items = make([]*AMIOverrideBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AMIOverrideListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AMIOverrideListBuilder) Copy(list *AMIOverrideList) *AMIOverrideListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AMIOverrideBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAMIOverride().Copy(v) + } + } + return b +} + +// Build creates a list of 'AMI_override' objects using the +// configuration stored in the builder. +func (b *AMIOverrideListBuilder) Build() (list *AMIOverrideList, err error) { + items := make([]*AMIOverride, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AMIOverrideList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ami_override_list_type_json.go b/clustersmgmt/v2alpha1/ami_override_list_type_json.go new file mode 100644 index 00000000..36824b65 --- /dev/null +++ b/clustersmgmt/v2alpha1/ami_override_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAMIOverrideList writes a list of values of the 'AMI_override' type to +// the given writer. +func MarshalAMIOverrideList(list []*AMIOverride, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAMIOverrideList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAMIOverrideList writes a list of value of the 'AMI_override' type to +// the given stream. +func writeAMIOverrideList(list []*AMIOverride, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAMIOverride(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAMIOverrideList reads a list of values of the 'AMI_override' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAMIOverrideList(source interface{}) (items []*AMIOverride, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAMIOverrideList(iterator) + err = iterator.Error + return +} + +// readAMIOverrideList reads list of values of the ”AMI_override' type from +// the given iterator. +func readAMIOverrideList(iterator *jsoniter.Iterator) []*AMIOverride { + list := []*AMIOverride{} + for iterator.ReadArray() { + item := readAMIOverride(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ami_override_type.go b/clustersmgmt/v2alpha1/ami_override_type.go new file mode 100644 index 00000000..b1101157 --- /dev/null +++ b/clustersmgmt/v2alpha1/ami_override_type.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AMIOverrideKind is the name of the type used to represent objects +// of type 'AMI_override'. +const AMIOverrideKind = "AMIOverride" + +// AMIOverrideLinkKind is the name of the type used to represent links +// to objects of type 'AMI_override'. +const AMIOverrideLinkKind = "AMIOverrideLink" + +// AMIOverrideNilKind is the name of the type used to nil references +// to objects of type 'AMI_override'. +const AMIOverrideNilKind = "AMIOverrideNil" + +// AMIOverride represents the values of the 'AMI_override' type. +// +// AMIOverride specifies what Amazon Machine Image should be used for a particular product and region. +type AMIOverride struct { + bitmap_ uint32 + id string + href string + ami string + product *Product + region *CloudRegion +} + +// Kind returns the name of the type of the object. +func (o *AMIOverride) Kind() string { + if o == nil { + return AMIOverrideNilKind + } + if o.bitmap_&1 != 0 { + return AMIOverrideLinkKind + } + return AMIOverrideKind +} + +// Link returns true iif this is a link. +func (o *AMIOverride) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AMIOverride) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AMIOverride) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AMIOverride) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AMIOverride) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AMIOverride) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AMI returns the value of the 'AMI' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AMI is the id of the Amazon Machine Image. +func (o *AMIOverride) AMI() string { + if o != nil && o.bitmap_&8 != 0 { + return o.ami + } + return "" +} + +// GetAMI returns the value of the 'AMI' attribute and +// a flag indicating if the attribute has a value. +// +// AMI is the id of the Amazon Machine Image. +func (o *AMIOverride) GetAMI() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.ami + } + return +} + +// Product returns the value of the 'product' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the product type. +func (o *AMIOverride) Product() *Product { + if o != nil && o.bitmap_&16 != 0 { + return o.product + } + return nil +} + +// GetProduct returns the value of the 'product' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the product type. +func (o *AMIOverride) GetProduct() (value *Product, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.product + } + return +} + +// Region returns the value of the 'region' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the cloud provider region. +func (o *AMIOverride) Region() *CloudRegion { + if o != nil && o.bitmap_&32 != 0 { + return o.region + } + return nil +} + +// GetRegion returns the value of the 'region' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the cloud provider region. +func (o *AMIOverride) GetRegion() (value *CloudRegion, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.region + } + return +} + +// AMIOverrideListKind is the name of the type used to represent list of objects of +// type 'AMI_override'. +const AMIOverrideListKind = "AMIOverrideList" + +// AMIOverrideListLinkKind is the name of the type used to represent links to list +// of objects of type 'AMI_override'. +const AMIOverrideListLinkKind = "AMIOverrideListLink" + +// AMIOverrideNilKind is the name of the type used to nil lists of objects of +// type 'AMI_override'. +const AMIOverrideListNilKind = "AMIOverrideListNil" + +// AMIOverrideList is a list of values of the 'AMI_override' type. +type AMIOverrideList struct { + href string + link bool + items []*AMIOverride +} + +// Kind returns the name of the type of the object. +func (l *AMIOverrideList) Kind() string { + if l == nil { + return AMIOverrideListNilKind + } + if l.link { + return AMIOverrideListLinkKind + } + return AMIOverrideListKind +} + +// Link returns true iif this is a link. +func (l *AMIOverrideList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AMIOverrideList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AMIOverrideList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AMIOverrideList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AMIOverrideList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AMIOverrideList) Get(i int) *AMIOverride { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AMIOverrideList) Slice() []*AMIOverride { + var slice []*AMIOverride + if l == nil { + slice = make([]*AMIOverride, 0) + } else { + slice = make([]*AMIOverride, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AMIOverrideList) Each(f func(item *AMIOverride) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AMIOverrideList) Range(f func(index int, item *AMIOverride) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ami_override_type_json.go b/clustersmgmt/v2alpha1/ami_override_type_json.go new file mode 100644 index 00000000..75c5885b --- /dev/null +++ b/clustersmgmt/v2alpha1/ami_override_type_json.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAMIOverride writes a value of the 'AMI_override' type to the given writer. +func MarshalAMIOverride(object *AMIOverride, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAMIOverride(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAMIOverride writes a value of the 'AMI_override' type to the given stream. +func writeAMIOverride(object *AMIOverride, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AMIOverrideLinkKind) + } else { + stream.WriteString(AMIOverrideKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ami") + stream.WriteString(object.ami) + count++ + } + present_ = object.bitmap_&16 != 0 && object.product != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("product") + writeProduct(object.product, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.region != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("region") + writeCloudRegion(object.region, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAMIOverride reads a value of the 'AMI_override' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAMIOverride(source interface{}) (object *AMIOverride, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAMIOverride(iterator) + err = iterator.Error + return +} + +// readAMIOverride reads a value of the 'AMI_override' type from the given iterator. +func readAMIOverride(iterator *jsoniter.Iterator) *AMIOverride { + object := &AMIOverride{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AMIOverrideLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "ami": + value := iterator.ReadString() + object.ami = value + object.bitmap_ |= 8 + case "product": + value := readProduct(iterator) + object.product = value + object.bitmap_ |= 16 + case "region": + value := readCloudRegion(iterator) + object.region = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/audit_log_builder.go b/clustersmgmt/v2alpha1/audit_log_builder.go new file mode 100644 index 00000000..a89c1a8c --- /dev/null +++ b/clustersmgmt/v2alpha1/audit_log_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AuditLogBuilder contains the data and logic needed to build 'audit_log' objects. +// +// Contains the necessary attributes to support audit log forwarding +type AuditLogBuilder struct { + bitmap_ uint32 + roleArn string +} + +// NewAuditLog creates a new builder of 'audit_log' objects. +func NewAuditLog() *AuditLogBuilder { + return &AuditLogBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AuditLogBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// RoleArn sets the value of the 'role_arn' attribute to the given value. +func (b *AuditLogBuilder) RoleArn(value string) *AuditLogBuilder { + b.roleArn = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AuditLogBuilder) Copy(object *AuditLog) *AuditLogBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.roleArn = object.roleArn + return b +} + +// Build creates a 'audit_log' object using the configuration stored in the builder. +func (b *AuditLogBuilder) Build() (object *AuditLog, err error) { + object = new(AuditLog) + object.bitmap_ = b.bitmap_ + object.roleArn = b.roleArn + return +} diff --git a/clustersmgmt/v2alpha1/audit_log_list_builder.go b/clustersmgmt/v2alpha1/audit_log_list_builder.go new file mode 100644 index 00000000..d316adc2 --- /dev/null +++ b/clustersmgmt/v2alpha1/audit_log_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AuditLogListBuilder contains the data and logic needed to build +// 'audit_log' objects. +type AuditLogListBuilder struct { + items []*AuditLogBuilder +} + +// NewAuditLogList creates a new builder of 'audit_log' objects. +func NewAuditLogList() *AuditLogListBuilder { + return new(AuditLogListBuilder) +} + +// Items sets the items of the list. +func (b *AuditLogListBuilder) Items(values ...*AuditLogBuilder) *AuditLogListBuilder { + b.items = make([]*AuditLogBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AuditLogListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AuditLogListBuilder) Copy(list *AuditLogList) *AuditLogListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AuditLogBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAuditLog().Copy(v) + } + } + return b +} + +// Build creates a list of 'audit_log' objects using the +// configuration stored in the builder. +func (b *AuditLogListBuilder) Build() (list *AuditLogList, err error) { + items := make([]*AuditLog, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AuditLogList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/audit_log_list_type_json.go b/clustersmgmt/v2alpha1/audit_log_list_type_json.go new file mode 100644 index 00000000..d346d586 --- /dev/null +++ b/clustersmgmt/v2alpha1/audit_log_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAuditLogList writes a list of values of the 'audit_log' type to +// the given writer. +func MarshalAuditLogList(list []*AuditLog, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAuditLogList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAuditLogList writes a list of value of the 'audit_log' type to +// the given stream. +func writeAuditLogList(list []*AuditLog, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAuditLog(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAuditLogList reads a list of values of the 'audit_log' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAuditLogList(source interface{}) (items []*AuditLog, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAuditLogList(iterator) + err = iterator.Error + return +} + +// readAuditLogList reads list of values of the ”audit_log' type from +// the given iterator. +func readAuditLogList(iterator *jsoniter.Iterator) []*AuditLog { + list := []*AuditLog{} + for iterator.ReadArray() { + item := readAuditLog(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/audit_log_type.go b/clustersmgmt/v2alpha1/audit_log_type.go new file mode 100644 index 00000000..64942af5 --- /dev/null +++ b/clustersmgmt/v2alpha1/audit_log_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AuditLog represents the values of the 'audit_log' type. +// +// Contains the necessary attributes to support audit log forwarding +type AuditLog struct { + bitmap_ uint32 + roleArn string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AuditLog) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// RoleArn returns the value of the 'role_arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN of the CloudWatch audit log forwarding role +func (o *AuditLog) RoleArn() string { + if o != nil && o.bitmap_&1 != 0 { + return o.roleArn + } + return "" +} + +// GetRoleArn returns the value of the 'role_arn' attribute and +// a flag indicating if the attribute has a value. +// +// ARN of the CloudWatch audit log forwarding role +func (o *AuditLog) GetRoleArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.roleArn + } + return +} + +// AuditLogListKind is the name of the type used to represent list of objects of +// type 'audit_log'. +const AuditLogListKind = "AuditLogList" + +// AuditLogListLinkKind is the name of the type used to represent links to list +// of objects of type 'audit_log'. +const AuditLogListLinkKind = "AuditLogListLink" + +// AuditLogNilKind is the name of the type used to nil lists of objects of +// type 'audit_log'. +const AuditLogListNilKind = "AuditLogListNil" + +// AuditLogList is a list of values of the 'audit_log' type. +type AuditLogList struct { + href string + link bool + items []*AuditLog +} + +// Len returns the length of the list. +func (l *AuditLogList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AuditLogList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AuditLogList) Get(i int) *AuditLog { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AuditLogList) Slice() []*AuditLog { + var slice []*AuditLog + if l == nil { + slice = make([]*AuditLog, 0) + } else { + slice = make([]*AuditLog, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AuditLogList) Each(f func(item *AuditLog) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AuditLogList) Range(f func(index int, item *AuditLog) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/audit_log_type_json.go b/clustersmgmt/v2alpha1/audit_log_type_json.go new file mode 100644 index 00000000..58de6f14 --- /dev/null +++ b/clustersmgmt/v2alpha1/audit_log_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAuditLog writes a value of the 'audit_log' type to the given writer. +func MarshalAuditLog(object *AuditLog, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAuditLog(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAuditLog writes a value of the 'audit_log' type to the given stream. +func writeAuditLog(object *AuditLog, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("role_arn") + stream.WriteString(object.roleArn) + } + stream.WriteObjectEnd() +} + +// UnmarshalAuditLog reads a value of the 'audit_log' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAuditLog(source interface{}) (object *AuditLog, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAuditLog(iterator) + err = iterator.Error + return +} + +// readAuditLog reads a value of the 'audit_log' type from the given iterator. +func readAuditLog(iterator *jsoniter.Iterator) *AuditLog { + object := &AuditLog{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "role_arn": + value := iterator.ReadString() + object.roleArn = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/autoscaler_client.go b/clustersmgmt/v2alpha1/autoscaler_client.go new file mode 100644 index 00000000..0ffa0ae6 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_client.go @@ -0,0 +1,731 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AutoscalerClient is the client of the 'autoscaler' resource. +// +// Manages global autoscaler configurations for a cluster. +type AutoscalerClient struct { + transport http.RoundTripper + path string +} + +// NewAutoscalerClient creates a new client for the 'autoscaler' +// resource using the given transport to send the requests and receive the +// responses. +func NewAutoscalerClient(transport http.RoundTripper, path string) *AutoscalerClient { + return &AutoscalerClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the cluster autoscaler. +func (c *AutoscalerClient) Delete() *AutoscalerDeleteRequest { + return &AutoscalerDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the autoscaler of a cluster. +func (c *AutoscalerClient) Get() *AutoscalerGetRequest { + return &AutoscalerGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Post creates a request for the 'post' method. +// +// Creates a new cluster autoscaler object. +func (c *AutoscalerClient) Post() *AutoscalerPostRequest { + return &AutoscalerPostRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the cluster autoscaler. +func (c *AutoscalerClient) Update() *AutoscalerUpdateRequest { + return &AutoscalerUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// AutoscalerPollRequest is the request for the Poll method. +type AutoscalerPollRequest struct { + request *AutoscalerGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AutoscalerPollRequest) Parameter(name string, value interface{}) *AutoscalerPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AutoscalerPollRequest) Header(name string, value interface{}) *AutoscalerPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AutoscalerPollRequest) Interval(value time.Duration) *AutoscalerPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AutoscalerPollRequest) Status(value int) *AutoscalerPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AutoscalerPollRequest) Predicate(value func(*AutoscalerGetResponse) bool) *AutoscalerPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AutoscalerGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AutoscalerPollRequest) StartContext(ctx context.Context) (response *AutoscalerPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AutoscalerPollResponse{ + response: result.(*AutoscalerGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AutoscalerPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AutoscalerPollResponse is the response for the Poll method. +type AutoscalerPollResponse struct { + response *AutoscalerGetResponse +} + +// Status returns the response status code. +func (r *AutoscalerPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AutoscalerPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AutoscalerPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AutoscalerPollResponse) Body() *ClusterAutoscaler { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AutoscalerPollResponse) GetBody() (value *ClusterAutoscaler, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AutoscalerClient) Poll() *AutoscalerPollRequest { + return &AutoscalerPollRequest{ + request: c.Get(), + } +} + +// AutoscalerDeleteRequest is the request for the 'delete' method. +type AutoscalerDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AutoscalerDeleteRequest) Parameter(name string, value interface{}) *AutoscalerDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AutoscalerDeleteRequest) Header(name string, value interface{}) *AutoscalerDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AutoscalerDeleteRequest) Impersonate(user string) *AutoscalerDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AutoscalerDeleteRequest) Send() (result *AutoscalerDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AutoscalerDeleteRequest) SendContext(ctx context.Context) (result *AutoscalerDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AutoscalerDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// AutoscalerDeleteResponse is the response for the 'delete' method. +type AutoscalerDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *AutoscalerDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AutoscalerDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AutoscalerDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AutoscalerGetRequest is the request for the 'get' method. +type AutoscalerGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AutoscalerGetRequest) Parameter(name string, value interface{}) *AutoscalerGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AutoscalerGetRequest) Header(name string, value interface{}) *AutoscalerGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AutoscalerGetRequest) Impersonate(user string) *AutoscalerGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AutoscalerGetRequest) Send() (result *AutoscalerGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AutoscalerGetRequest) SendContext(ctx context.Context) (result *AutoscalerGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AutoscalerGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAutoscalerGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AutoscalerGetResponse is the response for the 'get' method. +type AutoscalerGetResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterAutoscaler +} + +// Status returns the response status code. +func (r *AutoscalerGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AutoscalerGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AutoscalerGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AutoscalerGetResponse) Body() *ClusterAutoscaler { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AutoscalerGetResponse) GetBody() (value *ClusterAutoscaler, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AutoscalerPostRequest is the request for the 'post' method. +type AutoscalerPostRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + request *ClusterAutoscaler +} + +// Parameter adds a query parameter. +func (r *AutoscalerPostRequest) Parameter(name string, value interface{}) *AutoscalerPostRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AutoscalerPostRequest) Header(name string, value interface{}) *AutoscalerPostRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AutoscalerPostRequest) Impersonate(user string) *AutoscalerPostRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Request sets the value of the 'request' parameter. +func (r *AutoscalerPostRequest) Request(value *ClusterAutoscaler) *AutoscalerPostRequest { + r.request = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AutoscalerPostRequest) Send() (result *AutoscalerPostResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AutoscalerPostRequest) SendContext(ctx context.Context) (result *AutoscalerPostResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAutoscalerPostRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AutoscalerPostResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAutoscalerPostResponse(result, reader) + if err != nil { + return + } + return +} + +// AutoscalerPostResponse is the response for the 'post' method. +type AutoscalerPostResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterAutoscaler +} + +// Status returns the response status code. +func (r *AutoscalerPostResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AutoscalerPostResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AutoscalerPostResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AutoscalerPostResponse) Body() *ClusterAutoscaler { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AutoscalerPostResponse) GetBody() (value *ClusterAutoscaler, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AutoscalerUpdateRequest is the request for the 'update' method. +type AutoscalerUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ClusterAutoscaler +} + +// Parameter adds a query parameter. +func (r *AutoscalerUpdateRequest) Parameter(name string, value interface{}) *AutoscalerUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AutoscalerUpdateRequest) Header(name string, value interface{}) *AutoscalerUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AutoscalerUpdateRequest) Impersonate(user string) *AutoscalerUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *AutoscalerUpdateRequest) Body(value *ClusterAutoscaler) *AutoscalerUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AutoscalerUpdateRequest) Send() (result *AutoscalerUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AutoscalerUpdateRequest) SendContext(ctx context.Context) (result *AutoscalerUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAutoscalerUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AutoscalerUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAutoscalerUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// AutoscalerUpdateResponse is the response for the 'update' method. +type AutoscalerUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterAutoscaler +} + +// Status returns the response status code. +func (r *AutoscalerUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AutoscalerUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AutoscalerUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AutoscalerUpdateResponse) Body() *ClusterAutoscaler { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AutoscalerUpdateResponse) GetBody() (value *ClusterAutoscaler, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_json.go b/clustersmgmt/v2alpha1/autoscaler_resource_json.go new file mode 100644 index 00000000..84d04116 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_json.go @@ -0,0 +1,53 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAutoscalerDeleteRequest(request *AutoscalerDeleteRequest, writer io.Writer) error { + return nil +} +func readAutoscalerDeleteResponse(response *AutoscalerDeleteResponse, reader io.Reader) error { + return nil +} +func writeAutoscalerGetRequest(request *AutoscalerGetRequest, writer io.Writer) error { + return nil +} +func readAutoscalerGetResponse(response *AutoscalerGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterAutoscaler(reader) + return err +} +func writeAutoscalerPostRequest(request *AutoscalerPostRequest, writer io.Writer) error { + return MarshalClusterAutoscaler(request.request, writer) +} +func readAutoscalerPostResponse(response *AutoscalerPostResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterAutoscaler(reader) + return err +} +func writeAutoscalerUpdateRequest(request *AutoscalerUpdateRequest, writer io.Writer) error { + return MarshalClusterAutoscaler(request.body, writer) +} +func readAutoscalerUpdateResponse(response *AutoscalerUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterAutoscaler(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_builder.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_builder.go new file mode 100644 index 00000000..f6364899 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_builder.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerResourceLimitsBuilder contains the data and logic needed to build 'autoscaler_resource_limits' objects. +type AutoscalerResourceLimitsBuilder struct { + bitmap_ uint32 + gpus []*AutoscalerResourceLimitsGPULimitBuilder + cores *ResourceRangeBuilder + maxNodesTotal int + memory *ResourceRangeBuilder +} + +// NewAutoscalerResourceLimits creates a new builder of 'autoscaler_resource_limits' objects. +func NewAutoscalerResourceLimits() *AutoscalerResourceLimitsBuilder { + return &AutoscalerResourceLimitsBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AutoscalerResourceLimitsBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// GPUS sets the value of the 'GPUS' attribute to the given values. +func (b *AutoscalerResourceLimitsBuilder) GPUS(values ...*AutoscalerResourceLimitsGPULimitBuilder) *AutoscalerResourceLimitsBuilder { + b.gpus = make([]*AutoscalerResourceLimitsGPULimitBuilder, len(values)) + copy(b.gpus, values) + b.bitmap_ |= 1 + return b +} + +// Cores sets the value of the 'cores' attribute to the given value. +func (b *AutoscalerResourceLimitsBuilder) Cores(value *ResourceRangeBuilder) *AutoscalerResourceLimitsBuilder { + b.cores = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// MaxNodesTotal sets the value of the 'max_nodes_total' attribute to the given value. +func (b *AutoscalerResourceLimitsBuilder) MaxNodesTotal(value int) *AutoscalerResourceLimitsBuilder { + b.maxNodesTotal = value + b.bitmap_ |= 4 + return b +} + +// Memory sets the value of the 'memory' attribute to the given value. +func (b *AutoscalerResourceLimitsBuilder) Memory(value *ResourceRangeBuilder) *AutoscalerResourceLimitsBuilder { + b.memory = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AutoscalerResourceLimitsBuilder) Copy(object *AutoscalerResourceLimits) *AutoscalerResourceLimitsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.gpus != nil { + b.gpus = make([]*AutoscalerResourceLimitsGPULimitBuilder, len(object.gpus)) + for i, v := range object.gpus { + b.gpus[i] = NewAutoscalerResourceLimitsGPULimit().Copy(v) + } + } else { + b.gpus = nil + } + if object.cores != nil { + b.cores = NewResourceRange().Copy(object.cores) + } else { + b.cores = nil + } + b.maxNodesTotal = object.maxNodesTotal + if object.memory != nil { + b.memory = NewResourceRange().Copy(object.memory) + } else { + b.memory = nil + } + return b +} + +// Build creates a 'autoscaler_resource_limits' object using the configuration stored in the builder. +func (b *AutoscalerResourceLimitsBuilder) Build() (object *AutoscalerResourceLimits, err error) { + object = new(AutoscalerResourceLimits) + object.bitmap_ = b.bitmap_ + if b.gpus != nil { + object.gpus = make([]*AutoscalerResourceLimitsGPULimit, len(b.gpus)) + for i, v := range b.gpus { + object.gpus[i], err = v.Build() + if err != nil { + return + } + } + } + if b.cores != nil { + object.cores, err = b.cores.Build() + if err != nil { + return + } + } + object.maxNodesTotal = b.maxNodesTotal + if b.memory != nil { + object.memory, err = b.memory.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_builder.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_builder.go new file mode 100644 index 00000000..47edb826 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_builder.go @@ -0,0 +1,84 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerResourceLimitsGPULimitBuilder contains the data and logic needed to build 'autoscaler_resource_limits_GPU_limit' objects. +type AutoscalerResourceLimitsGPULimitBuilder struct { + bitmap_ uint32 + range_ *ResourceRangeBuilder + type_ string +} + +// NewAutoscalerResourceLimitsGPULimit creates a new builder of 'autoscaler_resource_limits_GPU_limit' objects. +func NewAutoscalerResourceLimitsGPULimit() *AutoscalerResourceLimitsGPULimitBuilder { + return &AutoscalerResourceLimitsGPULimitBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AutoscalerResourceLimitsGPULimitBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Range sets the value of the 'range' attribute to the given value. +func (b *AutoscalerResourceLimitsGPULimitBuilder) Range(value *ResourceRangeBuilder) *AutoscalerResourceLimitsGPULimitBuilder { + b.range_ = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *AutoscalerResourceLimitsGPULimitBuilder) Type(value string) *AutoscalerResourceLimitsGPULimitBuilder { + b.type_ = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AutoscalerResourceLimitsGPULimitBuilder) Copy(object *AutoscalerResourceLimitsGPULimit) *AutoscalerResourceLimitsGPULimitBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.range_ != nil { + b.range_ = NewResourceRange().Copy(object.range_) + } else { + b.range_ = nil + } + b.type_ = object.type_ + return b +} + +// Build creates a 'autoscaler_resource_limits_GPU_limit' object using the configuration stored in the builder. +func (b *AutoscalerResourceLimitsGPULimitBuilder) Build() (object *AutoscalerResourceLimitsGPULimit, err error) { + object = new(AutoscalerResourceLimitsGPULimit) + object.bitmap_ = b.bitmap_ + if b.range_ != nil { + object.range_, err = b.range_.Build() + if err != nil { + return + } + } + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_list_builder.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_list_builder.go new file mode 100644 index 00000000..b9def33b --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerResourceLimitsGPULimitListBuilder contains the data and logic needed to build +// 'autoscaler_resource_limits_GPU_limit' objects. +type AutoscalerResourceLimitsGPULimitListBuilder struct { + items []*AutoscalerResourceLimitsGPULimitBuilder +} + +// NewAutoscalerResourceLimitsGPULimitList creates a new builder of 'autoscaler_resource_limits_GPU_limit' objects. +func NewAutoscalerResourceLimitsGPULimitList() *AutoscalerResourceLimitsGPULimitListBuilder { + return new(AutoscalerResourceLimitsGPULimitListBuilder) +} + +// Items sets the items of the list. +func (b *AutoscalerResourceLimitsGPULimitListBuilder) Items(values ...*AutoscalerResourceLimitsGPULimitBuilder) *AutoscalerResourceLimitsGPULimitListBuilder { + b.items = make([]*AutoscalerResourceLimitsGPULimitBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AutoscalerResourceLimitsGPULimitListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AutoscalerResourceLimitsGPULimitListBuilder) Copy(list *AutoscalerResourceLimitsGPULimitList) *AutoscalerResourceLimitsGPULimitListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AutoscalerResourceLimitsGPULimitBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAutoscalerResourceLimitsGPULimit().Copy(v) + } + } + return b +} + +// Build creates a list of 'autoscaler_resource_limits_GPU_limit' objects using the +// configuration stored in the builder. +func (b *AutoscalerResourceLimitsGPULimitListBuilder) Build() (list *AutoscalerResourceLimitsGPULimitList, err error) { + items := make([]*AutoscalerResourceLimitsGPULimit, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AutoscalerResourceLimitsGPULimitList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_list_type_json.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_list_type_json.go new file mode 100644 index 00000000..00c70c38 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAutoscalerResourceLimitsGPULimitList writes a list of values of the 'autoscaler_resource_limits_GPU_limit' type to +// the given writer. +func MarshalAutoscalerResourceLimitsGPULimitList(list []*AutoscalerResourceLimitsGPULimit, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAutoscalerResourceLimitsGPULimitList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAutoscalerResourceLimitsGPULimitList writes a list of value of the 'autoscaler_resource_limits_GPU_limit' type to +// the given stream. +func writeAutoscalerResourceLimitsGPULimitList(list []*AutoscalerResourceLimitsGPULimit, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAutoscalerResourceLimitsGPULimit(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAutoscalerResourceLimitsGPULimitList reads a list of values of the 'autoscaler_resource_limits_GPU_limit' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAutoscalerResourceLimitsGPULimitList(source interface{}) (items []*AutoscalerResourceLimitsGPULimit, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAutoscalerResourceLimitsGPULimitList(iterator) + err = iterator.Error + return +} + +// readAutoscalerResourceLimitsGPULimitList reads list of values of the ”autoscaler_resource_limits_GPU_limit' type from +// the given iterator. +func readAutoscalerResourceLimitsGPULimitList(iterator *jsoniter.Iterator) []*AutoscalerResourceLimitsGPULimit { + list := []*AutoscalerResourceLimitsGPULimit{} + for iterator.ReadArray() { + item := readAutoscalerResourceLimitsGPULimit(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_type.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_type.go new file mode 100644 index 00000000..5c805349 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_type.go @@ -0,0 +1,168 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerResourceLimitsGPULimit represents the values of the 'autoscaler_resource_limits_GPU_limit' type. +type AutoscalerResourceLimitsGPULimit struct { + bitmap_ uint32 + range_ *ResourceRange + type_ string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AutoscalerResourceLimitsGPULimit) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Range returns the value of the 'range' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *AutoscalerResourceLimitsGPULimit) Range() *ResourceRange { + if o != nil && o.bitmap_&1 != 0 { + return o.range_ + } + return nil +} + +// GetRange returns the value of the 'range' attribute and +// a flag indicating if the attribute has a value. +func (o *AutoscalerResourceLimitsGPULimit) GetRange() (value *ResourceRange, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.range_ + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The type of GPU to associate with the minimum and maximum limits. +// This value is used by the Cluster Autoscaler to identify Nodes that will have GPU capacity by searching +// for it as a label value on the Node objects. For example, Nodes that carry the label key +// `cluster-api/accelerator` with the label value being the same as the Type field will be counted towards +// the resource limits by the Cluster Autoscaler. +func (o *AutoscalerResourceLimitsGPULimit) Type() string { + if o != nil && o.bitmap_&2 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// The type of GPU to associate with the minimum and maximum limits. +// This value is used by the Cluster Autoscaler to identify Nodes that will have GPU capacity by searching +// for it as a label value on the Node objects. For example, Nodes that carry the label key +// `cluster-api/accelerator` with the label value being the same as the Type field will be counted towards +// the resource limits by the Cluster Autoscaler. +func (o *AutoscalerResourceLimitsGPULimit) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.type_ + } + return +} + +// AutoscalerResourceLimitsGPULimitListKind is the name of the type used to represent list of objects of +// type 'autoscaler_resource_limits_GPU_limit'. +const AutoscalerResourceLimitsGPULimitListKind = "AutoscalerResourceLimitsGPULimitList" + +// AutoscalerResourceLimitsGPULimitListLinkKind is the name of the type used to represent links to list +// of objects of type 'autoscaler_resource_limits_GPU_limit'. +const AutoscalerResourceLimitsGPULimitListLinkKind = "AutoscalerResourceLimitsGPULimitListLink" + +// AutoscalerResourceLimitsGPULimitNilKind is the name of the type used to nil lists of objects of +// type 'autoscaler_resource_limits_GPU_limit'. +const AutoscalerResourceLimitsGPULimitListNilKind = "AutoscalerResourceLimitsGPULimitListNil" + +// AutoscalerResourceLimitsGPULimitList is a list of values of the 'autoscaler_resource_limits_GPU_limit' type. +type AutoscalerResourceLimitsGPULimitList struct { + href string + link bool + items []*AutoscalerResourceLimitsGPULimit +} + +// Len returns the length of the list. +func (l *AutoscalerResourceLimitsGPULimitList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AutoscalerResourceLimitsGPULimitList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AutoscalerResourceLimitsGPULimitList) Get(i int) *AutoscalerResourceLimitsGPULimit { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AutoscalerResourceLimitsGPULimitList) Slice() []*AutoscalerResourceLimitsGPULimit { + var slice []*AutoscalerResourceLimitsGPULimit + if l == nil { + slice = make([]*AutoscalerResourceLimitsGPULimit, 0) + } else { + slice = make([]*AutoscalerResourceLimitsGPULimit, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AutoscalerResourceLimitsGPULimitList) Each(f func(item *AutoscalerResourceLimitsGPULimit) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AutoscalerResourceLimitsGPULimitList) Range(f func(index int, item *AutoscalerResourceLimitsGPULimit) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_type_json.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_type_json.go new file mode 100644 index 00000000..0f782757 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_gpu_limit_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAutoscalerResourceLimitsGPULimit writes a value of the 'autoscaler_resource_limits_GPU_limit' type to the given writer. +func MarshalAutoscalerResourceLimitsGPULimit(object *AutoscalerResourceLimitsGPULimit, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAutoscalerResourceLimitsGPULimit(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAutoscalerResourceLimitsGPULimit writes a value of the 'autoscaler_resource_limits_GPU_limit' type to the given stream. +func writeAutoscalerResourceLimitsGPULimit(object *AutoscalerResourceLimitsGPULimit, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.range_ != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("range") + writeResourceRange(object.range_, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalAutoscalerResourceLimitsGPULimit reads a value of the 'autoscaler_resource_limits_GPU_limit' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAutoscalerResourceLimitsGPULimit(source interface{}) (object *AutoscalerResourceLimitsGPULimit, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAutoscalerResourceLimitsGPULimit(iterator) + err = iterator.Error + return +} + +// readAutoscalerResourceLimitsGPULimit reads a value of the 'autoscaler_resource_limits_GPU_limit' type from the given iterator. +func readAutoscalerResourceLimitsGPULimit(iterator *jsoniter.Iterator) *AutoscalerResourceLimitsGPULimit { + object := &AutoscalerResourceLimitsGPULimit{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "range": + value := readResourceRange(iterator) + object.range_ = value + object.bitmap_ |= 1 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_list_builder.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_list_builder.go new file mode 100644 index 00000000..11dee197 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerResourceLimitsListBuilder contains the data and logic needed to build +// 'autoscaler_resource_limits' objects. +type AutoscalerResourceLimitsListBuilder struct { + items []*AutoscalerResourceLimitsBuilder +} + +// NewAutoscalerResourceLimitsList creates a new builder of 'autoscaler_resource_limits' objects. +func NewAutoscalerResourceLimitsList() *AutoscalerResourceLimitsListBuilder { + return new(AutoscalerResourceLimitsListBuilder) +} + +// Items sets the items of the list. +func (b *AutoscalerResourceLimitsListBuilder) Items(values ...*AutoscalerResourceLimitsBuilder) *AutoscalerResourceLimitsListBuilder { + b.items = make([]*AutoscalerResourceLimitsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AutoscalerResourceLimitsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AutoscalerResourceLimitsListBuilder) Copy(list *AutoscalerResourceLimitsList) *AutoscalerResourceLimitsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AutoscalerResourceLimitsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAutoscalerResourceLimits().Copy(v) + } + } + return b +} + +// Build creates a list of 'autoscaler_resource_limits' objects using the +// configuration stored in the builder. +func (b *AutoscalerResourceLimitsListBuilder) Build() (list *AutoscalerResourceLimitsList, err error) { + items := make([]*AutoscalerResourceLimits, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AutoscalerResourceLimitsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_list_type_json.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_list_type_json.go new file mode 100644 index 00000000..ee87f111 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAutoscalerResourceLimitsList writes a list of values of the 'autoscaler_resource_limits' type to +// the given writer. +func MarshalAutoscalerResourceLimitsList(list []*AutoscalerResourceLimits, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAutoscalerResourceLimitsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAutoscalerResourceLimitsList writes a list of value of the 'autoscaler_resource_limits' type to +// the given stream. +func writeAutoscalerResourceLimitsList(list []*AutoscalerResourceLimits, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAutoscalerResourceLimits(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAutoscalerResourceLimitsList reads a list of values of the 'autoscaler_resource_limits' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAutoscalerResourceLimitsList(source interface{}) (items []*AutoscalerResourceLimits, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAutoscalerResourceLimitsList(iterator) + err = iterator.Error + return +} + +// readAutoscalerResourceLimitsList reads list of values of the ”autoscaler_resource_limits' type from +// the given iterator. +func readAutoscalerResourceLimitsList(iterator *jsoniter.Iterator) []*AutoscalerResourceLimits { + list := []*AutoscalerResourceLimits{} + for iterator.ReadArray() { + item := readAutoscalerResourceLimits(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_type.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_type.go new file mode 100644 index 00000000..ae3dd695 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_type.go @@ -0,0 +1,220 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerResourceLimits represents the values of the 'autoscaler_resource_limits' type. +type AutoscalerResourceLimits struct { + bitmap_ uint32 + gpus []*AutoscalerResourceLimitsGPULimit + cores *ResourceRange + maxNodesTotal int + memory *ResourceRange +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AutoscalerResourceLimits) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// GPUS returns the value of the 'GPUS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Minimum and maximum number of different GPUs in cluster, in the format ::. +// Cluster autoscaler will not scale the cluster beyond these numbers. Can be passed multiple times. +func (o *AutoscalerResourceLimits) GPUS() []*AutoscalerResourceLimitsGPULimit { + if o != nil && o.bitmap_&1 != 0 { + return o.gpus + } + return nil +} + +// GetGPUS returns the value of the 'GPUS' attribute and +// a flag indicating if the attribute has a value. +// +// Minimum and maximum number of different GPUs in cluster, in the format ::. +// Cluster autoscaler will not scale the cluster beyond these numbers. Can be passed multiple times. +func (o *AutoscalerResourceLimits) GetGPUS() (value []*AutoscalerResourceLimitsGPULimit, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.gpus + } + return +} + +// Cores returns the value of the 'cores' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Minimum and maximum number of cores in cluster, in the format :. +// Cluster autoscaler will not scale the cluster beyond these numbers. +func (o *AutoscalerResourceLimits) Cores() *ResourceRange { + if o != nil && o.bitmap_&2 != 0 { + return o.cores + } + return nil +} + +// GetCores returns the value of the 'cores' attribute and +// a flag indicating if the attribute has a value. +// +// Minimum and maximum number of cores in cluster, in the format :. +// Cluster autoscaler will not scale the cluster beyond these numbers. +func (o *AutoscalerResourceLimits) GetCores() (value *ResourceRange, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.cores + } + return +} + +// MaxNodesTotal returns the value of the 'max_nodes_total' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Maximum number of nodes in all node groups. +// Cluster autoscaler will not grow the cluster beyond this number. +func (o *AutoscalerResourceLimits) MaxNodesTotal() int { + if o != nil && o.bitmap_&4 != 0 { + return o.maxNodesTotal + } + return 0 +} + +// GetMaxNodesTotal returns the value of the 'max_nodes_total' attribute and +// a flag indicating if the attribute has a value. +// +// Maximum number of nodes in all node groups. +// Cluster autoscaler will not grow the cluster beyond this number. +func (o *AutoscalerResourceLimits) GetMaxNodesTotal() (value int, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.maxNodesTotal + } + return +} + +// Memory returns the value of the 'memory' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Minimum and maximum number of gigabytes of memory in cluster, in the format :. +// Cluster autoscaler will not scale the cluster beyond these numbers. +func (o *AutoscalerResourceLimits) Memory() *ResourceRange { + if o != nil && o.bitmap_&8 != 0 { + return o.memory + } + return nil +} + +// GetMemory returns the value of the 'memory' attribute and +// a flag indicating if the attribute has a value. +// +// Minimum and maximum number of gigabytes of memory in cluster, in the format :. +// Cluster autoscaler will not scale the cluster beyond these numbers. +func (o *AutoscalerResourceLimits) GetMemory() (value *ResourceRange, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.memory + } + return +} + +// AutoscalerResourceLimitsListKind is the name of the type used to represent list of objects of +// type 'autoscaler_resource_limits'. +const AutoscalerResourceLimitsListKind = "AutoscalerResourceLimitsList" + +// AutoscalerResourceLimitsListLinkKind is the name of the type used to represent links to list +// of objects of type 'autoscaler_resource_limits'. +const AutoscalerResourceLimitsListLinkKind = "AutoscalerResourceLimitsListLink" + +// AutoscalerResourceLimitsNilKind is the name of the type used to nil lists of objects of +// type 'autoscaler_resource_limits'. +const AutoscalerResourceLimitsListNilKind = "AutoscalerResourceLimitsListNil" + +// AutoscalerResourceLimitsList is a list of values of the 'autoscaler_resource_limits' type. +type AutoscalerResourceLimitsList struct { + href string + link bool + items []*AutoscalerResourceLimits +} + +// Len returns the length of the list. +func (l *AutoscalerResourceLimitsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AutoscalerResourceLimitsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AutoscalerResourceLimitsList) Get(i int) *AutoscalerResourceLimits { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AutoscalerResourceLimitsList) Slice() []*AutoscalerResourceLimits { + var slice []*AutoscalerResourceLimits + if l == nil { + slice = make([]*AutoscalerResourceLimits, 0) + } else { + slice = make([]*AutoscalerResourceLimits, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AutoscalerResourceLimitsList) Each(f func(item *AutoscalerResourceLimits) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AutoscalerResourceLimitsList) Range(f func(index int, item *AutoscalerResourceLimits) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/autoscaler_resource_limits_type_json.go b/clustersmgmt/v2alpha1/autoscaler_resource_limits_type_json.go new file mode 100644 index 00000000..57e8f9be --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_resource_limits_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAutoscalerResourceLimits writes a value of the 'autoscaler_resource_limits' type to the given writer. +func MarshalAutoscalerResourceLimits(object *AutoscalerResourceLimits, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAutoscalerResourceLimits(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAutoscalerResourceLimits writes a value of the 'autoscaler_resource_limits' type to the given stream. +func writeAutoscalerResourceLimits(object *AutoscalerResourceLimits, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.gpus != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gpus") + writeAutoscalerResourceLimitsGPULimitList(object.gpus, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.cores != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cores") + writeResourceRange(object.cores, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_nodes_total") + stream.WriteInt(object.maxNodesTotal) + count++ + } + present_ = object.bitmap_&8 != 0 && object.memory != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("memory") + writeResourceRange(object.memory, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAutoscalerResourceLimits reads a value of the 'autoscaler_resource_limits' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAutoscalerResourceLimits(source interface{}) (object *AutoscalerResourceLimits, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAutoscalerResourceLimits(iterator) + err = iterator.Error + return +} + +// readAutoscalerResourceLimits reads a value of the 'autoscaler_resource_limits' type from the given iterator. +func readAutoscalerResourceLimits(iterator *jsoniter.Iterator) *AutoscalerResourceLimits { + object := &AutoscalerResourceLimits{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "gpus": + value := readAutoscalerResourceLimitsGPULimitList(iterator) + object.gpus = value + object.bitmap_ |= 1 + case "cores": + value := readResourceRange(iterator) + object.cores = value + object.bitmap_ |= 2 + case "max_nodes_total": + value := iterator.ReadInt() + object.maxNodesTotal = value + object.bitmap_ |= 4 + case "memory": + value := readResourceRange(iterator) + object.memory = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/autoscaler_scale_down_config_builder.go b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_builder.go new file mode 100644 index 00000000..5734a052 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_builder.go @@ -0,0 +1,111 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerScaleDownConfigBuilder contains the data and logic needed to build 'autoscaler_scale_down_config' objects. +type AutoscalerScaleDownConfigBuilder struct { + bitmap_ uint32 + delayAfterAdd string + delayAfterDelete string + delayAfterFailure string + unneededTime string + utilizationThreshold string + enabled bool +} + +// NewAutoscalerScaleDownConfig creates a new builder of 'autoscaler_scale_down_config' objects. +func NewAutoscalerScaleDownConfig() *AutoscalerScaleDownConfigBuilder { + return &AutoscalerScaleDownConfigBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AutoscalerScaleDownConfigBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// DelayAfterAdd sets the value of the 'delay_after_add' attribute to the given value. +func (b *AutoscalerScaleDownConfigBuilder) DelayAfterAdd(value string) *AutoscalerScaleDownConfigBuilder { + b.delayAfterAdd = value + b.bitmap_ |= 1 + return b +} + +// DelayAfterDelete sets the value of the 'delay_after_delete' attribute to the given value. +func (b *AutoscalerScaleDownConfigBuilder) DelayAfterDelete(value string) *AutoscalerScaleDownConfigBuilder { + b.delayAfterDelete = value + b.bitmap_ |= 2 + return b +} + +// DelayAfterFailure sets the value of the 'delay_after_failure' attribute to the given value. +func (b *AutoscalerScaleDownConfigBuilder) DelayAfterFailure(value string) *AutoscalerScaleDownConfigBuilder { + b.delayAfterFailure = value + b.bitmap_ |= 4 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *AutoscalerScaleDownConfigBuilder) Enabled(value bool) *AutoscalerScaleDownConfigBuilder { + b.enabled = value + b.bitmap_ |= 8 + return b +} + +// UnneededTime sets the value of the 'unneeded_time' attribute to the given value. +func (b *AutoscalerScaleDownConfigBuilder) UnneededTime(value string) *AutoscalerScaleDownConfigBuilder { + b.unneededTime = value + b.bitmap_ |= 16 + return b +} + +// UtilizationThreshold sets the value of the 'utilization_threshold' attribute to the given value. +func (b *AutoscalerScaleDownConfigBuilder) UtilizationThreshold(value string) *AutoscalerScaleDownConfigBuilder { + b.utilizationThreshold = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AutoscalerScaleDownConfigBuilder) Copy(object *AutoscalerScaleDownConfig) *AutoscalerScaleDownConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.delayAfterAdd = object.delayAfterAdd + b.delayAfterDelete = object.delayAfterDelete + b.delayAfterFailure = object.delayAfterFailure + b.enabled = object.enabled + b.unneededTime = object.unneededTime + b.utilizationThreshold = object.utilizationThreshold + return b +} + +// Build creates a 'autoscaler_scale_down_config' object using the configuration stored in the builder. +func (b *AutoscalerScaleDownConfigBuilder) Build() (object *AutoscalerScaleDownConfig, err error) { + object = new(AutoscalerScaleDownConfig) + object.bitmap_ = b.bitmap_ + object.delayAfterAdd = b.delayAfterAdd + object.delayAfterDelete = b.delayAfterDelete + object.delayAfterFailure = b.delayAfterFailure + object.enabled = b.enabled + object.unneededTime = b.unneededTime + object.utilizationThreshold = b.utilizationThreshold + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_scale_down_config_list_builder.go b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_list_builder.go new file mode 100644 index 00000000..9bf33006 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerScaleDownConfigListBuilder contains the data and logic needed to build +// 'autoscaler_scale_down_config' objects. +type AutoscalerScaleDownConfigListBuilder struct { + items []*AutoscalerScaleDownConfigBuilder +} + +// NewAutoscalerScaleDownConfigList creates a new builder of 'autoscaler_scale_down_config' objects. +func NewAutoscalerScaleDownConfigList() *AutoscalerScaleDownConfigListBuilder { + return new(AutoscalerScaleDownConfigListBuilder) +} + +// Items sets the items of the list. +func (b *AutoscalerScaleDownConfigListBuilder) Items(values ...*AutoscalerScaleDownConfigBuilder) *AutoscalerScaleDownConfigListBuilder { + b.items = make([]*AutoscalerScaleDownConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AutoscalerScaleDownConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AutoscalerScaleDownConfigListBuilder) Copy(list *AutoscalerScaleDownConfigList) *AutoscalerScaleDownConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AutoscalerScaleDownConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAutoscalerScaleDownConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'autoscaler_scale_down_config' objects using the +// configuration stored in the builder. +func (b *AutoscalerScaleDownConfigListBuilder) Build() (list *AutoscalerScaleDownConfigList, err error) { + items := make([]*AutoscalerScaleDownConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AutoscalerScaleDownConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/autoscaler_scale_down_config_list_type_json.go b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_list_type_json.go new file mode 100644 index 00000000..93dcdde9 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAutoscalerScaleDownConfigList writes a list of values of the 'autoscaler_scale_down_config' type to +// the given writer. +func MarshalAutoscalerScaleDownConfigList(list []*AutoscalerScaleDownConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAutoscalerScaleDownConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAutoscalerScaleDownConfigList writes a list of value of the 'autoscaler_scale_down_config' type to +// the given stream. +func writeAutoscalerScaleDownConfigList(list []*AutoscalerScaleDownConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAutoscalerScaleDownConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAutoscalerScaleDownConfigList reads a list of values of the 'autoscaler_scale_down_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAutoscalerScaleDownConfigList(source interface{}) (items []*AutoscalerScaleDownConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAutoscalerScaleDownConfigList(iterator) + err = iterator.Error + return +} + +// readAutoscalerScaleDownConfigList reads list of values of the ”autoscaler_scale_down_config' type from +// the given iterator. +func readAutoscalerScaleDownConfigList(iterator *jsoniter.Iterator) []*AutoscalerScaleDownConfig { + list := []*AutoscalerScaleDownConfig{} + for iterator.ReadArray() { + item := readAutoscalerScaleDownConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/autoscaler_scale_down_config_type.go b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_type.go new file mode 100644 index 00000000..ebc6bf8c --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_type.go @@ -0,0 +1,260 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AutoscalerScaleDownConfig represents the values of the 'autoscaler_scale_down_config' type. +type AutoscalerScaleDownConfig struct { + bitmap_ uint32 + delayAfterAdd string + delayAfterDelete string + delayAfterFailure string + unneededTime string + utilizationThreshold string + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AutoscalerScaleDownConfig) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// DelayAfterAdd returns the value of the 'delay_after_add' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// How long after scale up that scale down evaluation resumes. +func (o *AutoscalerScaleDownConfig) DelayAfterAdd() string { + if o != nil && o.bitmap_&1 != 0 { + return o.delayAfterAdd + } + return "" +} + +// GetDelayAfterAdd returns the value of the 'delay_after_add' attribute and +// a flag indicating if the attribute has a value. +// +// How long after scale up that scale down evaluation resumes. +func (o *AutoscalerScaleDownConfig) GetDelayAfterAdd() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.delayAfterAdd + } + return +} + +// DelayAfterDelete returns the value of the 'delay_after_delete' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// How long after node deletion that scale down evaluation resumes, defaults to scan-interval. +func (o *AutoscalerScaleDownConfig) DelayAfterDelete() string { + if o != nil && o.bitmap_&2 != 0 { + return o.delayAfterDelete + } + return "" +} + +// GetDelayAfterDelete returns the value of the 'delay_after_delete' attribute and +// a flag indicating if the attribute has a value. +// +// How long after node deletion that scale down evaluation resumes, defaults to scan-interval. +func (o *AutoscalerScaleDownConfig) GetDelayAfterDelete() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.delayAfterDelete + } + return +} + +// DelayAfterFailure returns the value of the 'delay_after_failure' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// How long after scale down failure that scale down evaluation resumes. +func (o *AutoscalerScaleDownConfig) DelayAfterFailure() string { + if o != nil && o.bitmap_&4 != 0 { + return o.delayAfterFailure + } + return "" +} + +// GetDelayAfterFailure returns the value of the 'delay_after_failure' attribute and +// a flag indicating if the attribute has a value. +// +// How long after scale down failure that scale down evaluation resumes. +func (o *AutoscalerScaleDownConfig) GetDelayAfterFailure() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.delayAfterFailure + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Should cluster-autoscaler scale down the cluster. +func (o *AutoscalerScaleDownConfig) Enabled() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Should cluster-autoscaler scale down the cluster. +func (o *AutoscalerScaleDownConfig) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.enabled + } + return +} + +// UnneededTime returns the value of the 'unneeded_time' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// How long a node should be unneeded before it is eligible for scale down. +func (o *AutoscalerScaleDownConfig) UnneededTime() string { + if o != nil && o.bitmap_&16 != 0 { + return o.unneededTime + } + return "" +} + +// GetUnneededTime returns the value of the 'unneeded_time' attribute and +// a flag indicating if the attribute has a value. +// +// How long a node should be unneeded before it is eligible for scale down. +func (o *AutoscalerScaleDownConfig) GetUnneededTime() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.unneededTime + } + return +} + +// UtilizationThreshold returns the value of the 'utilization_threshold' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Node utilization level, defined as sum of requested resources divided by capacity, below which a node can be considered for scale down. +func (o *AutoscalerScaleDownConfig) UtilizationThreshold() string { + if o != nil && o.bitmap_&32 != 0 { + return o.utilizationThreshold + } + return "" +} + +// GetUtilizationThreshold returns the value of the 'utilization_threshold' attribute and +// a flag indicating if the attribute has a value. +// +// Node utilization level, defined as sum of requested resources divided by capacity, below which a node can be considered for scale down. +func (o *AutoscalerScaleDownConfig) GetUtilizationThreshold() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.utilizationThreshold + } + return +} + +// AutoscalerScaleDownConfigListKind is the name of the type used to represent list of objects of +// type 'autoscaler_scale_down_config'. +const AutoscalerScaleDownConfigListKind = "AutoscalerScaleDownConfigList" + +// AutoscalerScaleDownConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'autoscaler_scale_down_config'. +const AutoscalerScaleDownConfigListLinkKind = "AutoscalerScaleDownConfigListLink" + +// AutoscalerScaleDownConfigNilKind is the name of the type used to nil lists of objects of +// type 'autoscaler_scale_down_config'. +const AutoscalerScaleDownConfigListNilKind = "AutoscalerScaleDownConfigListNil" + +// AutoscalerScaleDownConfigList is a list of values of the 'autoscaler_scale_down_config' type. +type AutoscalerScaleDownConfigList struct { + href string + link bool + items []*AutoscalerScaleDownConfig +} + +// Len returns the length of the list. +func (l *AutoscalerScaleDownConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AutoscalerScaleDownConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AutoscalerScaleDownConfigList) Get(i int) *AutoscalerScaleDownConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AutoscalerScaleDownConfigList) Slice() []*AutoscalerScaleDownConfig { + var slice []*AutoscalerScaleDownConfig + if l == nil { + slice = make([]*AutoscalerScaleDownConfig, 0) + } else { + slice = make([]*AutoscalerScaleDownConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AutoscalerScaleDownConfigList) Each(f func(item *AutoscalerScaleDownConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AutoscalerScaleDownConfigList) Range(f func(index int, item *AutoscalerScaleDownConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/autoscaler_scale_down_config_type_json.go b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_type_json.go new file mode 100644 index 00000000..362ca3b6 --- /dev/null +++ b/clustersmgmt/v2alpha1/autoscaler_scale_down_config_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAutoscalerScaleDownConfig writes a value of the 'autoscaler_scale_down_config' type to the given writer. +func MarshalAutoscalerScaleDownConfig(object *AutoscalerScaleDownConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAutoscalerScaleDownConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAutoscalerScaleDownConfig writes a value of the 'autoscaler_scale_down_config' type to the given stream. +func writeAutoscalerScaleDownConfig(object *AutoscalerScaleDownConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("delay_after_add") + stream.WriteString(object.delayAfterAdd) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("delay_after_delete") + stream.WriteString(object.delayAfterDelete) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("delay_after_failure") + stream.WriteString(object.delayAfterFailure) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("unneeded_time") + stream.WriteString(object.unneededTime) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("utilization_threshold") + stream.WriteString(object.utilizationThreshold) + } + stream.WriteObjectEnd() +} + +// UnmarshalAutoscalerScaleDownConfig reads a value of the 'autoscaler_scale_down_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAutoscalerScaleDownConfig(source interface{}) (object *AutoscalerScaleDownConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAutoscalerScaleDownConfig(iterator) + err = iterator.Error + return +} + +// readAutoscalerScaleDownConfig reads a value of the 'autoscaler_scale_down_config' type from the given iterator. +func readAutoscalerScaleDownConfig(iterator *jsoniter.Iterator) *AutoscalerScaleDownConfig { + object := &AutoscalerScaleDownConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "delay_after_add": + value := iterator.ReadString() + object.delayAfterAdd = value + object.bitmap_ |= 1 + case "delay_after_delete": + value := iterator.ReadString() + object.delayAfterDelete = value + object.bitmap_ |= 2 + case "delay_after_failure": + value := iterator.ReadString() + object.delayAfterFailure = value + object.bitmap_ |= 4 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 8 + case "unneeded_time": + value := iterator.ReadString() + object.unneededTime = value + object.bitmap_ |= 16 + case "utilization_threshold": + value := iterator.ReadString() + object.utilizationThreshold = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/available_regions_client.go b/clustersmgmt/v2alpha1/available_regions_client.go new file mode 100644 index 00000000..932989ce --- /dev/null +++ b/clustersmgmt/v2alpha1/available_regions_client.go @@ -0,0 +1,319 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AvailableRegionsClient is the client of the 'available_regions' resource. +// +// Manages collection of cloud provider regions available to a particular cloud provider account +type AvailableRegionsClient struct { + transport http.RoundTripper + path string +} + +// NewAvailableRegionsClient creates a new client for the 'available_regions' +// resource using the given transport to send the requests and receive the +// responses. +func NewAvailableRegionsClient(transport http.RoundTripper, path string) *AvailableRegionsClient { + return &AvailableRegionsClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of available regions of the cloud provider. +// +// IMPORTANT: This collection doesn't currently support paging or searching, so the returned +// `page` will always be 1 and `size` and `total` will always be the total number of available regions +// of the provider. +func (c *AvailableRegionsClient) Search() *AvailableRegionsSearchRequest { + return &AvailableRegionsSearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// AvailableRegionsSearchRequest is the request for the 'search' method. +type AvailableRegionsSearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AWS + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *AvailableRegionsSearchRequest) Parameter(name string, value interface{}) *AvailableRegionsSearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AvailableRegionsSearchRequest) Header(name string, value interface{}) *AvailableRegionsSearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AvailableRegionsSearchRequest) Impersonate(user string) *AvailableRegionsSearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// AWS account details +func (r *AvailableRegionsSearchRequest) Body(value *AWS) *AvailableRegionsSearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AvailableRegionsSearchRequest) Page(value int) *AvailableRegionsSearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *AvailableRegionsSearchRequest) Size(value int) *AvailableRegionsSearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AvailableRegionsSearchRequest) Send() (result *AvailableRegionsSearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AvailableRegionsSearchRequest) SendContext(ctx context.Context) (result *AvailableRegionsSearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAvailableRegionsSearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AvailableRegionsSearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAvailableRegionsSearchResponse(result, reader) + if err != nil { + return + } + return +} + +// AvailableRegionsSearchResponse is the response for the 'search' method. +type AvailableRegionsSearchResponse struct { + status int + header http.Header + err *errors.Error + items *CloudRegionList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AvailableRegionsSearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AvailableRegionsSearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AvailableRegionsSearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of cloud regions. +func (r *AvailableRegionsSearchResponse) Items() *CloudRegionList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of cloud regions. +func (r *AvailableRegionsSearchResponse) GetItems() (value *CloudRegionList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AvailableRegionsSearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AvailableRegionsSearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *AvailableRegionsSearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *AvailableRegionsSearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available regions of the provider. +func (r *AvailableRegionsSearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available regions of the provider. +func (r *AvailableRegionsSearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/available_regions_inquiry_client.go b/clustersmgmt/v2alpha1/available_regions_inquiry_client.go new file mode 100644 index 00000000..8aa40f57 --- /dev/null +++ b/clustersmgmt/v2alpha1/available_regions_inquiry_client.go @@ -0,0 +1,318 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AvailableRegionsInquiryClient is the client of the 'available_regions_inquiry' resource. +// +// Manages a specific available regions inquiry. +type AvailableRegionsInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewAvailableRegionsInquiryClient creates a new client for the 'available_regions_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewAvailableRegionsInquiryClient(transport http.RoundTripper, path string) *AvailableRegionsInquiryClient { + return &AvailableRegionsInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of available regions of the cloud provider. +// IMPORTANT: This list doesn't currently support paging or searching, so the returned +// `page` will always be 1 and `size` and `total` will always be the total number of available regions +// of the provider. +func (c *AvailableRegionsInquiryClient) Search() *AvailableRegionsInquirySearchRequest { + return &AvailableRegionsInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// AvailableRegionsInquirySearchRequest is the request for the 'search' method. +type AvailableRegionsInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *AvailableRegionsInquirySearchRequest) Parameter(name string, value interface{}) *AvailableRegionsInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AvailableRegionsInquirySearchRequest) Header(name string, value interface{}) *AvailableRegionsInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AvailableRegionsInquirySearchRequest) Impersonate(user string) *AvailableRegionsInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry +func (r *AvailableRegionsInquirySearchRequest) Body(value *CloudProviderData) *AvailableRegionsInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AvailableRegionsInquirySearchRequest) Page(value int) *AvailableRegionsInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *AvailableRegionsInquirySearchRequest) Size(value int) *AvailableRegionsInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AvailableRegionsInquirySearchRequest) Send() (result *AvailableRegionsInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AvailableRegionsInquirySearchRequest) SendContext(ctx context.Context) (result *AvailableRegionsInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAvailableRegionsInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AvailableRegionsInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAvailableRegionsInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// AvailableRegionsInquirySearchResponse is the response for the 'search' method. +type AvailableRegionsInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + items *CloudRegionList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AvailableRegionsInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AvailableRegionsInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AvailableRegionsInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of regions. +func (r *AvailableRegionsInquirySearchResponse) Items() *CloudRegionList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of regions. +func (r *AvailableRegionsInquirySearchResponse) GetItems() (value *CloudRegionList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AvailableRegionsInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AvailableRegionsInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *AvailableRegionsInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *AvailableRegionsInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available regions of the provider. +func (r *AvailableRegionsInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available regions of the provider. +func (r *AvailableRegionsInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/available_regions_inquiry_resource_json.go b/clustersmgmt/v2alpha1/available_regions_inquiry_resource_json.go new file mode 100644 index 00000000..4451261c --- /dev/null +++ b/clustersmgmt/v2alpha1/available_regions_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAvailableRegionsInquirySearchRequest(request *AvailableRegionsInquirySearchRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readAvailableRegionsInquirySearchResponse(response *AvailableRegionsInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readCloudRegionList(iterator) + response.items = &CloudRegionList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/available_regions_resource_json.go b/clustersmgmt/v2alpha1/available_regions_resource_json.go new file mode 100644 index 00000000..30532bec --- /dev/null +++ b/clustersmgmt/v2alpha1/available_regions_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAvailableRegionsSearchRequest(request *AvailableRegionsSearchRequest, writer io.Writer) error { + return MarshalAWS(request.body, writer) +} +func readAvailableRegionsSearchResponse(response *AvailableRegionsSearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readCloudRegionList(iterator) + response.items = &CloudRegionList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/aws_builder.go b/clustersmgmt/v2alpha1/aws_builder.go new file mode 100644 index 00000000..391cd019 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_builder.go @@ -0,0 +1,366 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSBuilder contains the data and logic needed to build 'AWS' objects. +// +// _Amazon Web Services_ specific settings of a cluster. +type AWSBuilder struct { + bitmap_ uint32 + kmsKeyArn string + sts *STSBuilder + accessKeyID string + accountID string + additionalAllowedPrincipals []string + additionalComputeSecurityGroupIds []string + additionalControlPlaneSecurityGroupIds []string + additionalInfraSecurityGroupIds []string + auditLog *AuditLogBuilder + billingAccountID string + ec2MetadataHttpTokens Ec2MetadataHttpTokens + etcdEncryption *AwsEtcdEncryptionBuilder + privateHostedZoneID string + privateHostedZoneRoleARN string + privateLinkConfiguration *PrivateLinkClusterConfigurationBuilder + secretAccessKey string + subnetIDs []string + tags map[string]string + privateLink bool +} + +// NewAWS creates a new builder of 'AWS' objects. +func NewAWS() *AWSBuilder { + return &AWSBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// KMSKeyArn sets the value of the 'KMS_key_arn' attribute to the given value. +func (b *AWSBuilder) KMSKeyArn(value string) *AWSBuilder { + b.kmsKeyArn = value + b.bitmap_ |= 1 + return b +} + +// STS sets the value of the 'STS' attribute to the given value. +// +// Contains the necessary attributes to support role-based authentication on AWS. +func (b *AWSBuilder) STS(value *STSBuilder) *AWSBuilder { + b.sts = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// AccessKeyID sets the value of the 'access_key_ID' attribute to the given value. +func (b *AWSBuilder) AccessKeyID(value string) *AWSBuilder { + b.accessKeyID = value + b.bitmap_ |= 4 + return b +} + +// AccountID sets the value of the 'account_ID' attribute to the given value. +func (b *AWSBuilder) AccountID(value string) *AWSBuilder { + b.accountID = value + b.bitmap_ |= 8 + return b +} + +// AdditionalAllowedPrincipals sets the value of the 'additional_allowed_principals' attribute to the given values. +func (b *AWSBuilder) AdditionalAllowedPrincipals(values ...string) *AWSBuilder { + b.additionalAllowedPrincipals = make([]string, len(values)) + copy(b.additionalAllowedPrincipals, values) + b.bitmap_ |= 16 + return b +} + +// AdditionalComputeSecurityGroupIds sets the value of the 'additional_compute_security_group_ids' attribute to the given values. +func (b *AWSBuilder) AdditionalComputeSecurityGroupIds(values ...string) *AWSBuilder { + b.additionalComputeSecurityGroupIds = make([]string, len(values)) + copy(b.additionalComputeSecurityGroupIds, values) + b.bitmap_ |= 32 + return b +} + +// AdditionalControlPlaneSecurityGroupIds sets the value of the 'additional_control_plane_security_group_ids' attribute to the given values. +func (b *AWSBuilder) AdditionalControlPlaneSecurityGroupIds(values ...string) *AWSBuilder { + b.additionalControlPlaneSecurityGroupIds = make([]string, len(values)) + copy(b.additionalControlPlaneSecurityGroupIds, values) + b.bitmap_ |= 64 + return b +} + +// AdditionalInfraSecurityGroupIds sets the value of the 'additional_infra_security_group_ids' attribute to the given values. +func (b *AWSBuilder) AdditionalInfraSecurityGroupIds(values ...string) *AWSBuilder { + b.additionalInfraSecurityGroupIds = make([]string, len(values)) + copy(b.additionalInfraSecurityGroupIds, values) + b.bitmap_ |= 128 + return b +} + +// AuditLog sets the value of the 'audit_log' attribute to the given value. +// +// Contains the necessary attributes to support audit log forwarding +func (b *AWSBuilder) AuditLog(value *AuditLogBuilder) *AWSBuilder { + b.auditLog = value + if value != nil { + b.bitmap_ |= 256 + } else { + b.bitmap_ &^= 256 + } + return b +} + +// BillingAccountID sets the value of the 'billing_account_ID' attribute to the given value. +func (b *AWSBuilder) BillingAccountID(value string) *AWSBuilder { + b.billingAccountID = value + b.bitmap_ |= 512 + return b +} + +// Ec2MetadataHttpTokens sets the value of the 'ec_2_metadata_http_tokens' attribute to the given value. +// +// Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances +func (b *AWSBuilder) Ec2MetadataHttpTokens(value Ec2MetadataHttpTokens) *AWSBuilder { + b.ec2MetadataHttpTokens = value + b.bitmap_ |= 1024 + return b +} + +// EtcdEncryption sets the value of the 'etcd_encryption' attribute to the given value. +// +// Contains the necessary attributes to support etcd encryption for AWS based clusters. +func (b *AWSBuilder) EtcdEncryption(value *AwsEtcdEncryptionBuilder) *AWSBuilder { + b.etcdEncryption = value + if value != nil { + b.bitmap_ |= 2048 + } else { + b.bitmap_ &^= 2048 + } + return b +} + +// PrivateHostedZoneID sets the value of the 'private_hosted_zone_ID' attribute to the given value. +func (b *AWSBuilder) PrivateHostedZoneID(value string) *AWSBuilder { + b.privateHostedZoneID = value + b.bitmap_ |= 4096 + return b +} + +// PrivateHostedZoneRoleARN sets the value of the 'private_hosted_zone_role_ARN' attribute to the given value. +func (b *AWSBuilder) PrivateHostedZoneRoleARN(value string) *AWSBuilder { + b.privateHostedZoneRoleARN = value + b.bitmap_ |= 8192 + return b +} + +// PrivateLink sets the value of the 'private_link' attribute to the given value. +func (b *AWSBuilder) PrivateLink(value bool) *AWSBuilder { + b.privateLink = value + b.bitmap_ |= 16384 + return b +} + +// PrivateLinkConfiguration sets the value of the 'private_link_configuration' attribute to the given value. +// +// Manages the configuration for the Private Links. +func (b *AWSBuilder) PrivateLinkConfiguration(value *PrivateLinkClusterConfigurationBuilder) *AWSBuilder { + b.privateLinkConfiguration = value + if value != nil { + b.bitmap_ |= 32768 + } else { + b.bitmap_ &^= 32768 + } + return b +} + +// SecretAccessKey sets the value of the 'secret_access_key' attribute to the given value. +func (b *AWSBuilder) SecretAccessKey(value string) *AWSBuilder { + b.secretAccessKey = value + b.bitmap_ |= 65536 + return b +} + +// SubnetIDs sets the value of the 'subnet_IDs' attribute to the given values. +func (b *AWSBuilder) SubnetIDs(values ...string) *AWSBuilder { + b.subnetIDs = make([]string, len(values)) + copy(b.subnetIDs, values) + b.bitmap_ |= 131072 + return b +} + +// Tags sets the value of the 'tags' attribute to the given value. +func (b *AWSBuilder) Tags(value map[string]string) *AWSBuilder { + b.tags = value + if value != nil { + b.bitmap_ |= 262144 + } else { + b.bitmap_ &^= 262144 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSBuilder) Copy(object *AWS) *AWSBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.kmsKeyArn = object.kmsKeyArn + if object.sts != nil { + b.sts = NewSTS().Copy(object.sts) + } else { + b.sts = nil + } + b.accessKeyID = object.accessKeyID + b.accountID = object.accountID + if object.additionalAllowedPrincipals != nil { + b.additionalAllowedPrincipals = make([]string, len(object.additionalAllowedPrincipals)) + copy(b.additionalAllowedPrincipals, object.additionalAllowedPrincipals) + } else { + b.additionalAllowedPrincipals = nil + } + if object.additionalComputeSecurityGroupIds != nil { + b.additionalComputeSecurityGroupIds = make([]string, len(object.additionalComputeSecurityGroupIds)) + copy(b.additionalComputeSecurityGroupIds, object.additionalComputeSecurityGroupIds) + } else { + b.additionalComputeSecurityGroupIds = nil + } + if object.additionalControlPlaneSecurityGroupIds != nil { + b.additionalControlPlaneSecurityGroupIds = make([]string, len(object.additionalControlPlaneSecurityGroupIds)) + copy(b.additionalControlPlaneSecurityGroupIds, object.additionalControlPlaneSecurityGroupIds) + } else { + b.additionalControlPlaneSecurityGroupIds = nil + } + if object.additionalInfraSecurityGroupIds != nil { + b.additionalInfraSecurityGroupIds = make([]string, len(object.additionalInfraSecurityGroupIds)) + copy(b.additionalInfraSecurityGroupIds, object.additionalInfraSecurityGroupIds) + } else { + b.additionalInfraSecurityGroupIds = nil + } + if object.auditLog != nil { + b.auditLog = NewAuditLog().Copy(object.auditLog) + } else { + b.auditLog = nil + } + b.billingAccountID = object.billingAccountID + b.ec2MetadataHttpTokens = object.ec2MetadataHttpTokens + if object.etcdEncryption != nil { + b.etcdEncryption = NewAwsEtcdEncryption().Copy(object.etcdEncryption) + } else { + b.etcdEncryption = nil + } + b.privateHostedZoneID = object.privateHostedZoneID + b.privateHostedZoneRoleARN = object.privateHostedZoneRoleARN + b.privateLink = object.privateLink + if object.privateLinkConfiguration != nil { + b.privateLinkConfiguration = NewPrivateLinkClusterConfiguration().Copy(object.privateLinkConfiguration) + } else { + b.privateLinkConfiguration = nil + } + b.secretAccessKey = object.secretAccessKey + if object.subnetIDs != nil { + b.subnetIDs = make([]string, len(object.subnetIDs)) + copy(b.subnetIDs, object.subnetIDs) + } else { + b.subnetIDs = nil + } + if len(object.tags) > 0 { + b.tags = map[string]string{} + for k, v := range object.tags { + b.tags[k] = v + } + } else { + b.tags = nil + } + return b +} + +// Build creates a 'AWS' object using the configuration stored in the builder. +func (b *AWSBuilder) Build() (object *AWS, err error) { + object = new(AWS) + object.bitmap_ = b.bitmap_ + object.kmsKeyArn = b.kmsKeyArn + if b.sts != nil { + object.sts, err = b.sts.Build() + if err != nil { + return + } + } + object.accessKeyID = b.accessKeyID + object.accountID = b.accountID + if b.additionalAllowedPrincipals != nil { + object.additionalAllowedPrincipals = make([]string, len(b.additionalAllowedPrincipals)) + copy(object.additionalAllowedPrincipals, b.additionalAllowedPrincipals) + } + if b.additionalComputeSecurityGroupIds != nil { + object.additionalComputeSecurityGroupIds = make([]string, len(b.additionalComputeSecurityGroupIds)) + copy(object.additionalComputeSecurityGroupIds, b.additionalComputeSecurityGroupIds) + } + if b.additionalControlPlaneSecurityGroupIds != nil { + object.additionalControlPlaneSecurityGroupIds = make([]string, len(b.additionalControlPlaneSecurityGroupIds)) + copy(object.additionalControlPlaneSecurityGroupIds, b.additionalControlPlaneSecurityGroupIds) + } + if b.additionalInfraSecurityGroupIds != nil { + object.additionalInfraSecurityGroupIds = make([]string, len(b.additionalInfraSecurityGroupIds)) + copy(object.additionalInfraSecurityGroupIds, b.additionalInfraSecurityGroupIds) + } + if b.auditLog != nil { + object.auditLog, err = b.auditLog.Build() + if err != nil { + return + } + } + object.billingAccountID = b.billingAccountID + object.ec2MetadataHttpTokens = b.ec2MetadataHttpTokens + if b.etcdEncryption != nil { + object.etcdEncryption, err = b.etcdEncryption.Build() + if err != nil { + return + } + } + object.privateHostedZoneID = b.privateHostedZoneID + object.privateHostedZoneRoleARN = b.privateHostedZoneRoleARN + object.privateLink = b.privateLink + if b.privateLinkConfiguration != nil { + object.privateLinkConfiguration, err = b.privateLinkConfiguration.Build() + if err != nil { + return + } + } + object.secretAccessKey = b.secretAccessKey + if b.subnetIDs != nil { + object.subnetIDs = make([]string, len(b.subnetIDs)) + copy(object.subnetIDs, b.subnetIDs) + } + if b.tags != nil { + object.tags = make(map[string]string) + for k, v := range b.tags { + object.tags[k] = v + } + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_client.go b/clustersmgmt/v2alpha1/aws_client.go new file mode 100644 index 00000000..48fc5fe5 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_client.go @@ -0,0 +1,59 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "net/http" + "path" +) + +// AWSClient is the client of the 'AWS' resource. +// +// Manages AWS specific parts for a specific cluster. +type AWSClient struct { + transport http.RoundTripper + path string +} + +// NewAWSClient creates a new client for the 'AWS' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSClient(transport http.RoundTripper, path string) *AWSClient { + return &AWSClient{ + transport: transport, + path: path, + } +} + +// PrivateLinkConfiguration returns the target 'private_link_configuration' resource. +func (c *AWSClient) PrivateLinkConfiguration() *PrivateLinkConfigurationClient { + return NewPrivateLinkConfigurationClient( + c.transport, + path.Join(c.path, "private_link_configuration"), + ) +} + +// RolePolicyBindings returns the target 'role_policy_bindings' resource. +func (c *AWSClient) RolePolicyBindings() *RolePolicyBindingsClient { + return NewRolePolicyBindingsClient( + c.transport, + path.Join(c.path, "role_policy_bindings"), + ) +} diff --git a/clustersmgmt/v2alpha1/aws_etcd_encryption_builder.go b/clustersmgmt/v2alpha1/aws_etcd_encryption_builder.go new file mode 100644 index 00000000..6fa70c3e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_etcd_encryption_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AwsEtcdEncryptionBuilder contains the data and logic needed to build 'aws_etcd_encryption' objects. +// +// Contains the necessary attributes to support etcd encryption for AWS based clusters. +type AwsEtcdEncryptionBuilder struct { + bitmap_ uint32 + kmsKeyARN string +} + +// NewAwsEtcdEncryption creates a new builder of 'aws_etcd_encryption' objects. +func NewAwsEtcdEncryption() *AwsEtcdEncryptionBuilder { + return &AwsEtcdEncryptionBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AwsEtcdEncryptionBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// KMSKeyARN sets the value of the 'KMS_key_ARN' attribute to the given value. +func (b *AwsEtcdEncryptionBuilder) KMSKeyARN(value string) *AwsEtcdEncryptionBuilder { + b.kmsKeyARN = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AwsEtcdEncryptionBuilder) Copy(object *AwsEtcdEncryption) *AwsEtcdEncryptionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.kmsKeyARN = object.kmsKeyARN + return b +} + +// Build creates a 'aws_etcd_encryption' object using the configuration stored in the builder. +func (b *AwsEtcdEncryptionBuilder) Build() (object *AwsEtcdEncryption, err error) { + object = new(AwsEtcdEncryption) + object.bitmap_ = b.bitmap_ + object.kmsKeyARN = b.kmsKeyARN + return +} diff --git a/clustersmgmt/v2alpha1/aws_etcd_encryption_list_builder.go b/clustersmgmt/v2alpha1/aws_etcd_encryption_list_builder.go new file mode 100644 index 00000000..29e033e5 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_etcd_encryption_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AwsEtcdEncryptionListBuilder contains the data and logic needed to build +// 'aws_etcd_encryption' objects. +type AwsEtcdEncryptionListBuilder struct { + items []*AwsEtcdEncryptionBuilder +} + +// NewAwsEtcdEncryptionList creates a new builder of 'aws_etcd_encryption' objects. +func NewAwsEtcdEncryptionList() *AwsEtcdEncryptionListBuilder { + return new(AwsEtcdEncryptionListBuilder) +} + +// Items sets the items of the list. +func (b *AwsEtcdEncryptionListBuilder) Items(values ...*AwsEtcdEncryptionBuilder) *AwsEtcdEncryptionListBuilder { + b.items = make([]*AwsEtcdEncryptionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AwsEtcdEncryptionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AwsEtcdEncryptionListBuilder) Copy(list *AwsEtcdEncryptionList) *AwsEtcdEncryptionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AwsEtcdEncryptionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAwsEtcdEncryption().Copy(v) + } + } + return b +} + +// Build creates a list of 'aws_etcd_encryption' objects using the +// configuration stored in the builder. +func (b *AwsEtcdEncryptionListBuilder) Build() (list *AwsEtcdEncryptionList, err error) { + items := make([]*AwsEtcdEncryption, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AwsEtcdEncryptionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_etcd_encryption_list_type_json.go b/clustersmgmt/v2alpha1/aws_etcd_encryption_list_type_json.go new file mode 100644 index 00000000..578d78ba --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_etcd_encryption_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAwsEtcdEncryptionList writes a list of values of the 'aws_etcd_encryption' type to +// the given writer. +func MarshalAwsEtcdEncryptionList(list []*AwsEtcdEncryption, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAwsEtcdEncryptionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAwsEtcdEncryptionList writes a list of value of the 'aws_etcd_encryption' type to +// the given stream. +func writeAwsEtcdEncryptionList(list []*AwsEtcdEncryption, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAwsEtcdEncryption(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAwsEtcdEncryptionList reads a list of values of the 'aws_etcd_encryption' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAwsEtcdEncryptionList(source interface{}) (items []*AwsEtcdEncryption, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAwsEtcdEncryptionList(iterator) + err = iterator.Error + return +} + +// readAwsEtcdEncryptionList reads list of values of the ”aws_etcd_encryption' type from +// the given iterator. +func readAwsEtcdEncryptionList(iterator *jsoniter.Iterator) []*AwsEtcdEncryption { + list := []*AwsEtcdEncryption{} + for iterator.ReadArray() { + item := readAwsEtcdEncryption(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_etcd_encryption_type.go b/clustersmgmt/v2alpha1/aws_etcd_encryption_type.go new file mode 100644 index 00000000..05f02afa --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_etcd_encryption_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AwsEtcdEncryption represents the values of the 'aws_etcd_encryption' type. +// +// Contains the necessary attributes to support etcd encryption for AWS based clusters. +type AwsEtcdEncryption struct { + bitmap_ uint32 + kmsKeyARN string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AwsEtcdEncryption) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// KMSKeyARN returns the value of the 'KMS_key_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN of the KMS to be used for the etcd encryption +func (o *AwsEtcdEncryption) KMSKeyARN() string { + if o != nil && o.bitmap_&1 != 0 { + return o.kmsKeyARN + } + return "" +} + +// GetKMSKeyARN returns the value of the 'KMS_key_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// ARN of the KMS to be used for the etcd encryption +func (o *AwsEtcdEncryption) GetKMSKeyARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.kmsKeyARN + } + return +} + +// AwsEtcdEncryptionListKind is the name of the type used to represent list of objects of +// type 'aws_etcd_encryption'. +const AwsEtcdEncryptionListKind = "AwsEtcdEncryptionList" + +// AwsEtcdEncryptionListLinkKind is the name of the type used to represent links to list +// of objects of type 'aws_etcd_encryption'. +const AwsEtcdEncryptionListLinkKind = "AwsEtcdEncryptionListLink" + +// AwsEtcdEncryptionNilKind is the name of the type used to nil lists of objects of +// type 'aws_etcd_encryption'. +const AwsEtcdEncryptionListNilKind = "AwsEtcdEncryptionListNil" + +// AwsEtcdEncryptionList is a list of values of the 'aws_etcd_encryption' type. +type AwsEtcdEncryptionList struct { + href string + link bool + items []*AwsEtcdEncryption +} + +// Len returns the length of the list. +func (l *AwsEtcdEncryptionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AwsEtcdEncryptionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AwsEtcdEncryptionList) Get(i int) *AwsEtcdEncryption { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AwsEtcdEncryptionList) Slice() []*AwsEtcdEncryption { + var slice []*AwsEtcdEncryption + if l == nil { + slice = make([]*AwsEtcdEncryption, 0) + } else { + slice = make([]*AwsEtcdEncryption, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AwsEtcdEncryptionList) Each(f func(item *AwsEtcdEncryption) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AwsEtcdEncryptionList) Range(f func(index int, item *AwsEtcdEncryption) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_etcd_encryption_type_json.go b/clustersmgmt/v2alpha1/aws_etcd_encryption_type_json.go new file mode 100644 index 00000000..8a6ef3be --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_etcd_encryption_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAwsEtcdEncryption writes a value of the 'aws_etcd_encryption' type to the given writer. +func MarshalAwsEtcdEncryption(object *AwsEtcdEncryption, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAwsEtcdEncryption(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAwsEtcdEncryption writes a value of the 'aws_etcd_encryption' type to the given stream. +func writeAwsEtcdEncryption(object *AwsEtcdEncryption, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kms_key_arn") + stream.WriteString(object.kmsKeyARN) + } + stream.WriteObjectEnd() +} + +// UnmarshalAwsEtcdEncryption reads a value of the 'aws_etcd_encryption' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAwsEtcdEncryption(source interface{}) (object *AwsEtcdEncryption, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAwsEtcdEncryption(iterator) + err = iterator.Error + return +} + +// readAwsEtcdEncryption reads a value of the 'aws_etcd_encryption' type from the given iterator. +func readAwsEtcdEncryption(iterator *jsoniter.Iterator) *AwsEtcdEncryption { + object := &AwsEtcdEncryption{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kms_key_arn": + value := iterator.ReadString() + object.kmsKeyARN = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_flavour_builder.go b/clustersmgmt/v2alpha1/aws_flavour_builder.go new file mode 100644 index 00000000..328af7c9 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_flavour_builder.go @@ -0,0 +1,158 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSFlavourBuilder contains the data and logic needed to build 'AWS_flavour' objects. +// +// Specification for different classes of nodes inside a flavour. +type AWSFlavourBuilder struct { + bitmap_ uint32 + computeInstanceType string + infraInstanceType string + infraVolume *AWSVolumeBuilder + masterInstanceType string + masterVolume *AWSVolumeBuilder + workerVolume *AWSVolumeBuilder +} + +// NewAWSFlavour creates a new builder of 'AWS_flavour' objects. +func NewAWSFlavour() *AWSFlavourBuilder { + return &AWSFlavourBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSFlavourBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ComputeInstanceType sets the value of the 'compute_instance_type' attribute to the given value. +func (b *AWSFlavourBuilder) ComputeInstanceType(value string) *AWSFlavourBuilder { + b.computeInstanceType = value + b.bitmap_ |= 1 + return b +} + +// InfraInstanceType sets the value of the 'infra_instance_type' attribute to the given value. +func (b *AWSFlavourBuilder) InfraInstanceType(value string) *AWSFlavourBuilder { + b.infraInstanceType = value + b.bitmap_ |= 2 + return b +} + +// InfraVolume sets the value of the 'infra_volume' attribute to the given value. +// +// Holds settings for an AWS storage volume. +func (b *AWSFlavourBuilder) InfraVolume(value *AWSVolumeBuilder) *AWSFlavourBuilder { + b.infraVolume = value + if value != nil { + b.bitmap_ |= 4 + } else { + b.bitmap_ &^= 4 + } + return b +} + +// MasterInstanceType sets the value of the 'master_instance_type' attribute to the given value. +func (b *AWSFlavourBuilder) MasterInstanceType(value string) *AWSFlavourBuilder { + b.masterInstanceType = value + b.bitmap_ |= 8 + return b +} + +// MasterVolume sets the value of the 'master_volume' attribute to the given value. +// +// Holds settings for an AWS storage volume. +func (b *AWSFlavourBuilder) MasterVolume(value *AWSVolumeBuilder) *AWSFlavourBuilder { + b.masterVolume = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// WorkerVolume sets the value of the 'worker_volume' attribute to the given value. +// +// Holds settings for an AWS storage volume. +func (b *AWSFlavourBuilder) WorkerVolume(value *AWSVolumeBuilder) *AWSFlavourBuilder { + b.workerVolume = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSFlavourBuilder) Copy(object *AWSFlavour) *AWSFlavourBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.computeInstanceType = object.computeInstanceType + b.infraInstanceType = object.infraInstanceType + if object.infraVolume != nil { + b.infraVolume = NewAWSVolume().Copy(object.infraVolume) + } else { + b.infraVolume = nil + } + b.masterInstanceType = object.masterInstanceType + if object.masterVolume != nil { + b.masterVolume = NewAWSVolume().Copy(object.masterVolume) + } else { + b.masterVolume = nil + } + if object.workerVolume != nil { + b.workerVolume = NewAWSVolume().Copy(object.workerVolume) + } else { + b.workerVolume = nil + } + return b +} + +// Build creates a 'AWS_flavour' object using the configuration stored in the builder. +func (b *AWSFlavourBuilder) Build() (object *AWSFlavour, err error) { + object = new(AWSFlavour) + object.bitmap_ = b.bitmap_ + object.computeInstanceType = b.computeInstanceType + object.infraInstanceType = b.infraInstanceType + if b.infraVolume != nil { + object.infraVolume, err = b.infraVolume.Build() + if err != nil { + return + } + } + object.masterInstanceType = b.masterInstanceType + if b.masterVolume != nil { + object.masterVolume, err = b.masterVolume.Build() + if err != nil { + return + } + } + if b.workerVolume != nil { + object.workerVolume, err = b.workerVolume.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_flavour_list_builder.go b/clustersmgmt/v2alpha1/aws_flavour_list_builder.go new file mode 100644 index 00000000..e4a1062e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_flavour_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSFlavourListBuilder contains the data and logic needed to build +// 'AWS_flavour' objects. +type AWSFlavourListBuilder struct { + items []*AWSFlavourBuilder +} + +// NewAWSFlavourList creates a new builder of 'AWS_flavour' objects. +func NewAWSFlavourList() *AWSFlavourListBuilder { + return new(AWSFlavourListBuilder) +} + +// Items sets the items of the list. +func (b *AWSFlavourListBuilder) Items(values ...*AWSFlavourBuilder) *AWSFlavourListBuilder { + b.items = make([]*AWSFlavourBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSFlavourListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSFlavourListBuilder) Copy(list *AWSFlavourList) *AWSFlavourListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSFlavourBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSFlavour().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_flavour' objects using the +// configuration stored in the builder. +func (b *AWSFlavourListBuilder) Build() (list *AWSFlavourList, err error) { + items := make([]*AWSFlavour, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSFlavourList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_flavour_list_type_json.go b/clustersmgmt/v2alpha1/aws_flavour_list_type_json.go new file mode 100644 index 00000000..b3ebc9f9 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_flavour_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSFlavourList writes a list of values of the 'AWS_flavour' type to +// the given writer. +func MarshalAWSFlavourList(list []*AWSFlavour, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSFlavourList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSFlavourList writes a list of value of the 'AWS_flavour' type to +// the given stream. +func writeAWSFlavourList(list []*AWSFlavour, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSFlavour(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSFlavourList reads a list of values of the 'AWS_flavour' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSFlavourList(source interface{}) (items []*AWSFlavour, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSFlavourList(iterator) + err = iterator.Error + return +} + +// readAWSFlavourList reads list of values of the ”AWS_flavour' type from +// the given iterator. +func readAWSFlavourList(iterator *jsoniter.Iterator) []*AWSFlavour { + list := []*AWSFlavour{} + for iterator.ReadArray() { + item := readAWSFlavour(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_flavour_type.go b/clustersmgmt/v2alpha1/aws_flavour_type.go new file mode 100644 index 00000000..b19fae74 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_flavour_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSFlavour represents the values of the 'AWS_flavour' type. +// +// Specification for different classes of nodes inside a flavour. +type AWSFlavour struct { + bitmap_ uint32 + computeInstanceType string + infraInstanceType string + infraVolume *AWSVolume + masterInstanceType string + masterVolume *AWSVolume + workerVolume *AWSVolume +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSFlavour) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ComputeInstanceType returns the value of the 'compute_instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS default instance type for the worker volume. +// +// User can be overridden specifying in the cluster itself a type for compute node. +func (o *AWSFlavour) ComputeInstanceType() string { + if o != nil && o.bitmap_&1 != 0 { + return o.computeInstanceType + } + return "" +} + +// GetComputeInstanceType returns the value of the 'compute_instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// AWS default instance type for the worker volume. +// +// User can be overridden specifying in the cluster itself a type for compute node. +func (o *AWSFlavour) GetComputeInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.computeInstanceType + } + return +} + +// InfraInstanceType returns the value of the 'infra_instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS default instance type for the infra volume. +func (o *AWSFlavour) InfraInstanceType() string { + if o != nil && o.bitmap_&2 != 0 { + return o.infraInstanceType + } + return "" +} + +// GetInfraInstanceType returns the value of the 'infra_instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// AWS default instance type for the infra volume. +func (o *AWSFlavour) GetInfraInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.infraInstanceType + } + return +} + +// InfraVolume returns the value of the 'infra_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Infra volume specification. +func (o *AWSFlavour) InfraVolume() *AWSVolume { + if o != nil && o.bitmap_&4 != 0 { + return o.infraVolume + } + return nil +} + +// GetInfraVolume returns the value of the 'infra_volume' attribute and +// a flag indicating if the attribute has a value. +// +// Infra volume specification. +func (o *AWSFlavour) GetInfraVolume() (value *AWSVolume, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.infraVolume + } + return +} + +// MasterInstanceType returns the value of the 'master_instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS default instance type for the master volume. +func (o *AWSFlavour) MasterInstanceType() string { + if o != nil && o.bitmap_&8 != 0 { + return o.masterInstanceType + } + return "" +} + +// GetMasterInstanceType returns the value of the 'master_instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// AWS default instance type for the master volume. +func (o *AWSFlavour) GetMasterInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.masterInstanceType + } + return +} + +// MasterVolume returns the value of the 'master_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Master volume specification. +func (o *AWSFlavour) MasterVolume() *AWSVolume { + if o != nil && o.bitmap_&16 != 0 { + return o.masterVolume + } + return nil +} + +// GetMasterVolume returns the value of the 'master_volume' attribute and +// a flag indicating if the attribute has a value. +// +// Master volume specification. +func (o *AWSFlavour) GetMasterVolume() (value *AWSVolume, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.masterVolume + } + return +} + +// WorkerVolume returns the value of the 'worker_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Worker volume specification. +func (o *AWSFlavour) WorkerVolume() *AWSVolume { + if o != nil && o.bitmap_&32 != 0 { + return o.workerVolume + } + return nil +} + +// GetWorkerVolume returns the value of the 'worker_volume' attribute and +// a flag indicating if the attribute has a value. +// +// Worker volume specification. +func (o *AWSFlavour) GetWorkerVolume() (value *AWSVolume, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.workerVolume + } + return +} + +// AWSFlavourListKind is the name of the type used to represent list of objects of +// type 'AWS_flavour'. +const AWSFlavourListKind = "AWSFlavourList" + +// AWSFlavourListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_flavour'. +const AWSFlavourListLinkKind = "AWSFlavourListLink" + +// AWSFlavourNilKind is the name of the type used to nil lists of objects of +// type 'AWS_flavour'. +const AWSFlavourListNilKind = "AWSFlavourListNil" + +// AWSFlavourList is a list of values of the 'AWS_flavour' type. +type AWSFlavourList struct { + href string + link bool + items []*AWSFlavour +} + +// Len returns the length of the list. +func (l *AWSFlavourList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSFlavourList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSFlavourList) Get(i int) *AWSFlavour { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSFlavourList) Slice() []*AWSFlavour { + var slice []*AWSFlavour + if l == nil { + slice = make([]*AWSFlavour, 0) + } else { + slice = make([]*AWSFlavour, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSFlavourList) Each(f func(item *AWSFlavour) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSFlavourList) Range(f func(index int, item *AWSFlavour) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_flavour_type_json.go b/clustersmgmt/v2alpha1/aws_flavour_type_json.go new file mode 100644 index 00000000..9f86ccb6 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_flavour_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSFlavour writes a value of the 'AWS_flavour' type to the given writer. +func MarshalAWSFlavour(object *AWSFlavour, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSFlavour(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSFlavour writes a value of the 'AWS_flavour' type to the given stream. +func writeAWSFlavour(object *AWSFlavour, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute_instance_type") + stream.WriteString(object.computeInstanceType) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra_instance_type") + stream.WriteString(object.infraInstanceType) + count++ + } + present_ = object.bitmap_&4 != 0 && object.infraVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra_volume") + writeAWSVolume(object.infraVolume, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master_instance_type") + stream.WriteString(object.masterInstanceType) + count++ + } + present_ = object.bitmap_&16 != 0 && object.masterVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master_volume") + writeAWSVolume(object.masterVolume, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.workerVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("worker_volume") + writeAWSVolume(object.workerVolume, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSFlavour reads a value of the 'AWS_flavour' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSFlavour(source interface{}) (object *AWSFlavour, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSFlavour(iterator) + err = iterator.Error + return +} + +// readAWSFlavour reads a value of the 'AWS_flavour' type from the given iterator. +func readAWSFlavour(iterator *jsoniter.Iterator) *AWSFlavour { + object := &AWSFlavour{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "compute_instance_type": + value := iterator.ReadString() + object.computeInstanceType = value + object.bitmap_ |= 1 + case "infra_instance_type": + value := iterator.ReadString() + object.infraInstanceType = value + object.bitmap_ |= 2 + case "infra_volume": + value := readAWSVolume(iterator) + object.infraVolume = value + object.bitmap_ |= 4 + case "master_instance_type": + value := iterator.ReadString() + object.masterInstanceType = value + object.bitmap_ |= 8 + case "master_volume": + value := readAWSVolume(iterator) + object.masterVolume = value + object.bitmap_ |= 16 + case "worker_volume": + value := readAWSVolume(iterator) + object.workerVolume = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_builder.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_builder.go new file mode 100644 index 00000000..6dd4dae0 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_builder.go @@ -0,0 +1,111 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleBuilder contains the data and logic needed to build 'AWS_infrastructure_access_role' objects. +// +// A set of acces permissions for AWS resources +type AWSInfrastructureAccessRoleBuilder struct { + bitmap_ uint32 + id string + href string + description string + displayName string + state AWSInfrastructureAccessRoleState +} + +// NewAWSInfrastructureAccessRole creates a new builder of 'AWS_infrastructure_access_role' objects. +func NewAWSInfrastructureAccessRole() *AWSInfrastructureAccessRoleBuilder { + return &AWSInfrastructureAccessRoleBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AWSInfrastructureAccessRoleBuilder) Link(value bool) *AWSInfrastructureAccessRoleBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AWSInfrastructureAccessRoleBuilder) ID(value string) *AWSInfrastructureAccessRoleBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AWSInfrastructureAccessRoleBuilder) HREF(value string) *AWSInfrastructureAccessRoleBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSInfrastructureAccessRoleBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *AWSInfrastructureAccessRoleBuilder) Description(value string) *AWSInfrastructureAccessRoleBuilder { + b.description = value + b.bitmap_ |= 8 + return b +} + +// DisplayName sets the value of the 'display_name' attribute to the given value. +func (b *AWSInfrastructureAccessRoleBuilder) DisplayName(value string) *AWSInfrastructureAccessRoleBuilder { + b.displayName = value + b.bitmap_ |= 16 + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// State of an AWS infrastructure access role. +func (b *AWSInfrastructureAccessRoleBuilder) State(value AWSInfrastructureAccessRoleState) *AWSInfrastructureAccessRoleBuilder { + b.state = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSInfrastructureAccessRoleBuilder) Copy(object *AWSInfrastructureAccessRole) *AWSInfrastructureAccessRoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.description = object.description + b.displayName = object.displayName + b.state = object.state + return b +} + +// Build creates a 'AWS_infrastructure_access_role' object using the configuration stored in the builder. +func (b *AWSInfrastructureAccessRoleBuilder) Build() (object *AWSInfrastructureAccessRole, err error) { + object = new(AWSInfrastructureAccessRole) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.description = b.description + object.displayName = b.displayName + object.state = b.state + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_client.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_client.go new file mode 100644 index 00000000..7016f422 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSInfrastructureAccessRoleClient is the client of the 'AWS_infrastructure_access_role' resource. +// +// Manages a specific aws infrastructure access role. +type AWSInfrastructureAccessRoleClient struct { + transport http.RoundTripper + path string +} + +// NewAWSInfrastructureAccessRoleClient creates a new client for the 'AWS_infrastructure_access_role' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSInfrastructureAccessRoleClient(transport http.RoundTripper, path string) *AWSInfrastructureAccessRoleClient { + return &AWSInfrastructureAccessRoleClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the aws infrastructure access role. +func (c *AWSInfrastructureAccessRoleClient) Get() *AWSInfrastructureAccessRoleGetRequest { + return &AWSInfrastructureAccessRoleGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSInfrastructureAccessRolePollRequest is the request for the Poll method. +type AWSInfrastructureAccessRolePollRequest struct { + request *AWSInfrastructureAccessRoleGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AWSInfrastructureAccessRolePollRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRolePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AWSInfrastructureAccessRolePollRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRolePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AWSInfrastructureAccessRolePollRequest) Interval(value time.Duration) *AWSInfrastructureAccessRolePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AWSInfrastructureAccessRolePollRequest) Status(value int) *AWSInfrastructureAccessRolePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AWSInfrastructureAccessRolePollRequest) Predicate(value func(*AWSInfrastructureAccessRoleGetResponse) bool) *AWSInfrastructureAccessRolePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AWSInfrastructureAccessRoleGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AWSInfrastructureAccessRolePollRequest) StartContext(ctx context.Context) (response *AWSInfrastructureAccessRolePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AWSInfrastructureAccessRolePollResponse{ + response: result.(*AWSInfrastructureAccessRoleGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AWSInfrastructureAccessRolePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AWSInfrastructureAccessRolePollResponse is the response for the Poll method. +type AWSInfrastructureAccessRolePollResponse struct { + response *AWSInfrastructureAccessRoleGetResponse +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRolePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRolePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRolePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AWSInfrastructureAccessRolePollResponse) Body() *AWSInfrastructureAccessRole { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AWSInfrastructureAccessRolePollResponse) GetBody() (value *AWSInfrastructureAccessRole, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AWSInfrastructureAccessRoleClient) Poll() *AWSInfrastructureAccessRolePollRequest { + return &AWSInfrastructureAccessRolePollRequest{ + request: c.Get(), + } +} + +// AWSInfrastructureAccessRoleGetRequest is the request for the 'get' method. +type AWSInfrastructureAccessRoleGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AWSInfrastructureAccessRoleGetRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRoleGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSInfrastructureAccessRoleGetRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRoleGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSInfrastructureAccessRoleGetRequest) Impersonate(user string) *AWSInfrastructureAccessRoleGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSInfrastructureAccessRoleGetRequest) Send() (result *AWSInfrastructureAccessRoleGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSInfrastructureAccessRoleGetRequest) SendContext(ctx context.Context) (result *AWSInfrastructureAccessRoleGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSInfrastructureAccessRoleGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSInfrastructureAccessRoleGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSInfrastructureAccessRoleGetResponse is the response for the 'get' method. +type AWSInfrastructureAccessRoleGetResponse struct { + status int + header http.Header + err *errors.Error + body *AWSInfrastructureAccessRole +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRoleGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRoleGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRoleGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AWSInfrastructureAccessRoleGetResponse) Body() *AWSInfrastructureAccessRole { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AWSInfrastructureAccessRoleGetResponse) GetBody() (value *AWSInfrastructureAccessRole, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_builder.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_builder.go new file mode 100644 index 00000000..488f4b52 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_builder.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleGrantBuilder contains the data and logic needed to build 'AWS_infrastructure_access_role_grant' objects. +// +// Representation of an AWS infrastructure access role grant. +type AWSInfrastructureAccessRoleGrantBuilder struct { + bitmap_ uint32 + id string + href string + consoleURL string + role *AWSInfrastructureAccessRoleBuilder + state AWSInfrastructureAccessRoleGrantState + stateDescription string + userARN string +} + +// NewAWSInfrastructureAccessRoleGrant creates a new builder of 'AWS_infrastructure_access_role_grant' objects. +func NewAWSInfrastructureAccessRoleGrant() *AWSInfrastructureAccessRoleGrantBuilder { + return &AWSInfrastructureAccessRoleGrantBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AWSInfrastructureAccessRoleGrantBuilder) Link(value bool) *AWSInfrastructureAccessRoleGrantBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AWSInfrastructureAccessRoleGrantBuilder) ID(value string) *AWSInfrastructureAccessRoleGrantBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AWSInfrastructureAccessRoleGrantBuilder) HREF(value string) *AWSInfrastructureAccessRoleGrantBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSInfrastructureAccessRoleGrantBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ConsoleURL sets the value of the 'console_URL' attribute to the given value. +func (b *AWSInfrastructureAccessRoleGrantBuilder) ConsoleURL(value string) *AWSInfrastructureAccessRoleGrantBuilder { + b.consoleURL = value + b.bitmap_ |= 8 + return b +} + +// Role sets the value of the 'role' attribute to the given value. +// +// A set of acces permissions for AWS resources +func (b *AWSInfrastructureAccessRoleGrantBuilder) Role(value *AWSInfrastructureAccessRoleBuilder) *AWSInfrastructureAccessRoleGrantBuilder { + b.role = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// State of an AWS infrastructure access role grant. +func (b *AWSInfrastructureAccessRoleGrantBuilder) State(value AWSInfrastructureAccessRoleGrantState) *AWSInfrastructureAccessRoleGrantBuilder { + b.state = value + b.bitmap_ |= 32 + return b +} + +// StateDescription sets the value of the 'state_description' attribute to the given value. +func (b *AWSInfrastructureAccessRoleGrantBuilder) StateDescription(value string) *AWSInfrastructureAccessRoleGrantBuilder { + b.stateDescription = value + b.bitmap_ |= 64 + return b +} + +// UserARN sets the value of the 'user_ARN' attribute to the given value. +func (b *AWSInfrastructureAccessRoleGrantBuilder) UserARN(value string) *AWSInfrastructureAccessRoleGrantBuilder { + b.userARN = value + b.bitmap_ |= 128 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSInfrastructureAccessRoleGrantBuilder) Copy(object *AWSInfrastructureAccessRoleGrant) *AWSInfrastructureAccessRoleGrantBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.consoleURL = object.consoleURL + if object.role != nil { + b.role = NewAWSInfrastructureAccessRole().Copy(object.role) + } else { + b.role = nil + } + b.state = object.state + b.stateDescription = object.stateDescription + b.userARN = object.userARN + return b +} + +// Build creates a 'AWS_infrastructure_access_role_grant' object using the configuration stored in the builder. +func (b *AWSInfrastructureAccessRoleGrantBuilder) Build() (object *AWSInfrastructureAccessRoleGrant, err error) { + object = new(AWSInfrastructureAccessRoleGrant) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.consoleURL = b.consoleURL + if b.role != nil { + object.role, err = b.role.Build() + if err != nil { + return + } + } + object.state = b.state + object.stateDescription = b.stateDescription + object.userARN = b.userARN + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_client.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_client.go new file mode 100644 index 00000000..672ddec3 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSInfrastructureAccessRoleGrantClient is the client of the 'AWS_infrastructure_access_role_grant' resource. +// +// Manages a specific AWS infrastructure access role grant. +type AWSInfrastructureAccessRoleGrantClient struct { + transport http.RoundTripper + path string +} + +// NewAWSInfrastructureAccessRoleGrantClient creates a new client for the 'AWS_infrastructure_access_role_grant' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSInfrastructureAccessRoleGrantClient(transport http.RoundTripper, path string) *AWSInfrastructureAccessRoleGrantClient { + return &AWSInfrastructureAccessRoleGrantClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the AWS infrastructure access role grant. +func (c *AWSInfrastructureAccessRoleGrantClient) Delete() *AWSInfrastructureAccessRoleGrantDeleteRequest { + return &AWSInfrastructureAccessRoleGrantDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the AWS infrastructure access role grant. +func (c *AWSInfrastructureAccessRoleGrantClient) Get() *AWSInfrastructureAccessRoleGrantGetRequest { + return &AWSInfrastructureAccessRoleGrantGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSInfrastructureAccessRoleGrantPollRequest is the request for the Poll method. +type AWSInfrastructureAccessRoleGrantPollRequest struct { + request *AWSInfrastructureAccessRoleGrantGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRoleGrantPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRoleGrantPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) Interval(value time.Duration) *AWSInfrastructureAccessRoleGrantPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) Status(value int) *AWSInfrastructureAccessRoleGrantPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) Predicate(value func(*AWSInfrastructureAccessRoleGrantGetResponse) bool) *AWSInfrastructureAccessRoleGrantPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*AWSInfrastructureAccessRoleGrantGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) StartContext(ctx context.Context) (response *AWSInfrastructureAccessRoleGrantPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &AWSInfrastructureAccessRoleGrantPollResponse{ + response: result.(*AWSInfrastructureAccessRoleGrantGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *AWSInfrastructureAccessRoleGrantPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// AWSInfrastructureAccessRoleGrantPollResponse is the response for the Poll method. +type AWSInfrastructureAccessRoleGrantPollResponse struct { + response *AWSInfrastructureAccessRoleGrantGetResponse +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRoleGrantPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRoleGrantPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRoleGrantPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *AWSInfrastructureAccessRoleGrantPollResponse) Body() *AWSInfrastructureAccessRoleGrant { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AWSInfrastructureAccessRoleGrantPollResponse) GetBody() (value *AWSInfrastructureAccessRoleGrant, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *AWSInfrastructureAccessRoleGrantClient) Poll() *AWSInfrastructureAccessRoleGrantPollRequest { + return &AWSInfrastructureAccessRoleGrantPollRequest{ + request: c.Get(), + } +} + +// AWSInfrastructureAccessRoleGrantDeleteRequest is the request for the 'delete' method. +type AWSInfrastructureAccessRoleGrantDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AWSInfrastructureAccessRoleGrantDeleteRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRoleGrantDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSInfrastructureAccessRoleGrantDeleteRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRoleGrantDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSInfrastructureAccessRoleGrantDeleteRequest) Impersonate(user string) *AWSInfrastructureAccessRoleGrantDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSInfrastructureAccessRoleGrantDeleteRequest) Send() (result *AWSInfrastructureAccessRoleGrantDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSInfrastructureAccessRoleGrantDeleteRequest) SendContext(ctx context.Context) (result *AWSInfrastructureAccessRoleGrantDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSInfrastructureAccessRoleGrantDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// AWSInfrastructureAccessRoleGrantDeleteResponse is the response for the 'delete' method. +type AWSInfrastructureAccessRoleGrantDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRoleGrantDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRoleGrantDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRoleGrantDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AWSInfrastructureAccessRoleGrantGetRequest is the request for the 'get' method. +type AWSInfrastructureAccessRoleGrantGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *AWSInfrastructureAccessRoleGrantGetRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRoleGrantGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSInfrastructureAccessRoleGrantGetRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRoleGrantGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSInfrastructureAccessRoleGrantGetRequest) Impersonate(user string) *AWSInfrastructureAccessRoleGrantGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSInfrastructureAccessRoleGrantGetRequest) Send() (result *AWSInfrastructureAccessRoleGrantGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSInfrastructureAccessRoleGrantGetRequest) SendContext(ctx context.Context) (result *AWSInfrastructureAccessRoleGrantGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSInfrastructureAccessRoleGrantGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSInfrastructureAccessRoleGrantGetResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSInfrastructureAccessRoleGrantGetResponse is the response for the 'get' method. +type AWSInfrastructureAccessRoleGrantGetResponse struct { + status int + header http.Header + err *errors.Error + body *AWSInfrastructureAccessRoleGrant +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRoleGrantGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRoleGrantGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRoleGrantGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *AWSInfrastructureAccessRoleGrantGetResponse) Body() *AWSInfrastructureAccessRoleGrant { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *AWSInfrastructureAccessRoleGrantGetResponse) GetBody() (value *AWSInfrastructureAccessRoleGrant, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_list_builder.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_list_builder.go new file mode 100644 index 00000000..cd8090e1 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleGrantListBuilder contains the data and logic needed to build +// 'AWS_infrastructure_access_role_grant' objects. +type AWSInfrastructureAccessRoleGrantListBuilder struct { + items []*AWSInfrastructureAccessRoleGrantBuilder +} + +// NewAWSInfrastructureAccessRoleGrantList creates a new builder of 'AWS_infrastructure_access_role_grant' objects. +func NewAWSInfrastructureAccessRoleGrantList() *AWSInfrastructureAccessRoleGrantListBuilder { + return new(AWSInfrastructureAccessRoleGrantListBuilder) +} + +// Items sets the items of the list. +func (b *AWSInfrastructureAccessRoleGrantListBuilder) Items(values ...*AWSInfrastructureAccessRoleGrantBuilder) *AWSInfrastructureAccessRoleGrantListBuilder { + b.items = make([]*AWSInfrastructureAccessRoleGrantBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSInfrastructureAccessRoleGrantListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSInfrastructureAccessRoleGrantListBuilder) Copy(list *AWSInfrastructureAccessRoleGrantList) *AWSInfrastructureAccessRoleGrantListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSInfrastructureAccessRoleGrantBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSInfrastructureAccessRoleGrant().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_infrastructure_access_role_grant' objects using the +// configuration stored in the builder. +func (b *AWSInfrastructureAccessRoleGrantListBuilder) Build() (list *AWSInfrastructureAccessRoleGrantList, err error) { + items := make([]*AWSInfrastructureAccessRoleGrant, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSInfrastructureAccessRoleGrantList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_list_type_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_list_type_json.go new file mode 100644 index 00000000..f515adc8 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSInfrastructureAccessRoleGrantList writes a list of values of the 'AWS_infrastructure_access_role_grant' type to +// the given writer. +func MarshalAWSInfrastructureAccessRoleGrantList(list []*AWSInfrastructureAccessRoleGrant, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSInfrastructureAccessRoleGrantList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSInfrastructureAccessRoleGrantList writes a list of value of the 'AWS_infrastructure_access_role_grant' type to +// the given stream. +func writeAWSInfrastructureAccessRoleGrantList(list []*AWSInfrastructureAccessRoleGrant, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSInfrastructureAccessRoleGrant(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSInfrastructureAccessRoleGrantList reads a list of values of the 'AWS_infrastructure_access_role_grant' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSInfrastructureAccessRoleGrantList(source interface{}) (items []*AWSInfrastructureAccessRoleGrant, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSInfrastructureAccessRoleGrantList(iterator) + err = iterator.Error + return +} + +// readAWSInfrastructureAccessRoleGrantList reads list of values of the ”AWS_infrastructure_access_role_grant' type from +// the given iterator. +func readAWSInfrastructureAccessRoleGrantList(iterator *jsoniter.Iterator) []*AWSInfrastructureAccessRoleGrant { + list := []*AWSInfrastructureAccessRoleGrant{} + for iterator.ReadArray() { + item := readAWSInfrastructureAccessRoleGrant(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_resource_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_resource_json.go new file mode 100644 index 00000000..e867dd88 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAWSInfrastructureAccessRoleGrantDeleteRequest(request *AWSInfrastructureAccessRoleGrantDeleteRequest, writer io.Writer) error { + return nil +} +func readAWSInfrastructureAccessRoleGrantDeleteResponse(response *AWSInfrastructureAccessRoleGrantDeleteResponse, reader io.Reader) error { + return nil +} +func writeAWSInfrastructureAccessRoleGrantGetRequest(request *AWSInfrastructureAccessRoleGrantGetRequest, writer io.Writer) error { + return nil +} +func readAWSInfrastructureAccessRoleGrantGetResponse(response *AWSInfrastructureAccessRoleGrantGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAWSInfrastructureAccessRoleGrant(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_state_list_type_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_state_list_type_json.go new file mode 100644 index 00000000..2f6c3838 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSInfrastructureAccessRoleGrantStateList writes a list of values of the 'AWS_infrastructure_access_role_grant_state' type to +// the given writer. +func MarshalAWSInfrastructureAccessRoleGrantStateList(list []AWSInfrastructureAccessRoleGrantState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSInfrastructureAccessRoleGrantStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSInfrastructureAccessRoleGrantStateList writes a list of value of the 'AWS_infrastructure_access_role_grant_state' type to +// the given stream. +func writeAWSInfrastructureAccessRoleGrantStateList(list []AWSInfrastructureAccessRoleGrantState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSInfrastructureAccessRoleGrantStateList reads a list of values of the 'AWS_infrastructure_access_role_grant_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSInfrastructureAccessRoleGrantStateList(source interface{}) (items []AWSInfrastructureAccessRoleGrantState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSInfrastructureAccessRoleGrantStateList(iterator) + err = iterator.Error + return +} + +// readAWSInfrastructureAccessRoleGrantStateList reads list of values of the ”AWS_infrastructure_access_role_grant_state' type from +// the given iterator. +func readAWSInfrastructureAccessRoleGrantStateList(iterator *jsoniter.Iterator) []AWSInfrastructureAccessRoleGrantState { + list := []AWSInfrastructureAccessRoleGrantState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := AWSInfrastructureAccessRoleGrantState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_state_type.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_state_type.go new file mode 100644 index 00000000..d448d5b8 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_state_type.go @@ -0,0 +1,38 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleGrantState represents the values of the 'AWS_infrastructure_access_role_grant_state' enumerated type. +type AWSInfrastructureAccessRoleGrantState string + +const ( + // The access role grant is in the process of being deleted. + AWSInfrastructureAccessRoleGrantStateDeleting AWSInfrastructureAccessRoleGrantState = "deleting" + // The attempt to grant access role to user ARN failed. + AWSInfrastructureAccessRoleGrantStateFailed AWSInfrastructureAccessRoleGrantState = "failed" + // The access role grant in pending. + AWSInfrastructureAccessRoleGrantStatePending AWSInfrastructureAccessRoleGrantState = "pending" + // Access role has been granted to user. + AWSInfrastructureAccessRoleGrantStateReady AWSInfrastructureAccessRoleGrantState = "ready" + // This ia a special state intended for the user know + // that the access role grant has been removed by SRE. + // The user can delete this grant from the DB. + AWSInfrastructureAccessRoleGrantStateRemoved AWSInfrastructureAccessRoleGrantState = "removed" +) diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_type.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_type.go new file mode 100644 index 00000000..f10aec1d --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_type.go @@ -0,0 +1,342 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleGrantKind is the name of the type used to represent objects +// of type 'AWS_infrastructure_access_role_grant'. +const AWSInfrastructureAccessRoleGrantKind = "AWSInfrastructureAccessRoleGrant" + +// AWSInfrastructureAccessRoleGrantLinkKind is the name of the type used to represent links +// to objects of type 'AWS_infrastructure_access_role_grant'. +const AWSInfrastructureAccessRoleGrantLinkKind = "AWSInfrastructureAccessRoleGrantLink" + +// AWSInfrastructureAccessRoleGrantNilKind is the name of the type used to nil references +// to objects of type 'AWS_infrastructure_access_role_grant'. +const AWSInfrastructureAccessRoleGrantNilKind = "AWSInfrastructureAccessRoleGrantNil" + +// AWSInfrastructureAccessRoleGrant represents the values of the 'AWS_infrastructure_access_role_grant' type. +// +// Representation of an AWS infrastructure access role grant. +type AWSInfrastructureAccessRoleGrant struct { + bitmap_ uint32 + id string + href string + consoleURL string + role *AWSInfrastructureAccessRole + state AWSInfrastructureAccessRoleGrantState + stateDescription string + userARN string +} + +// Kind returns the name of the type of the object. +func (o *AWSInfrastructureAccessRoleGrant) Kind() string { + if o == nil { + return AWSInfrastructureAccessRoleGrantNilKind + } + if o.bitmap_&1 != 0 { + return AWSInfrastructureAccessRoleGrantLinkKind + } + return AWSInfrastructureAccessRoleGrantKind +} + +// Link returns true iif this is a link. +func (o *AWSInfrastructureAccessRoleGrant) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AWSInfrastructureAccessRoleGrant) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AWSInfrastructureAccessRoleGrant) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AWSInfrastructureAccessRoleGrant) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AWSInfrastructureAccessRoleGrant) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSInfrastructureAccessRoleGrant) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ConsoleURL returns the value of the 'console_URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// URL to switch to the role in AWS console. +func (o *AWSInfrastructureAccessRoleGrant) ConsoleURL() string { + if o != nil && o.bitmap_&8 != 0 { + return o.consoleURL + } + return "" +} + +// GetConsoleURL returns the value of the 'console_URL' attribute and +// a flag indicating if the attribute has a value. +// +// URL to switch to the role in AWS console. +func (o *AWSInfrastructureAccessRoleGrant) GetConsoleURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.consoleURL + } + return +} + +// Role returns the value of the 'role' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to AWS infrastructure access role. +// Grant must use a 'valid' role. +func (o *AWSInfrastructureAccessRoleGrant) Role() *AWSInfrastructureAccessRole { + if o != nil && o.bitmap_&16 != 0 { + return o.role + } + return nil +} + +// GetRole returns the value of the 'role' attribute and +// a flag indicating if the attribute has a value. +// +// Link to AWS infrastructure access role. +// Grant must use a 'valid' role. +func (o *AWSInfrastructureAccessRoleGrant) GetRole() (value *AWSInfrastructureAccessRole, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.role + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State of the grant. +func (o *AWSInfrastructureAccessRoleGrant) State() AWSInfrastructureAccessRoleGrantState { + if o != nil && o.bitmap_&32 != 0 { + return o.state + } + return AWSInfrastructureAccessRoleGrantState("") +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// State of the grant. +func (o *AWSInfrastructureAccessRoleGrant) GetState() (value AWSInfrastructureAccessRoleGrantState, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.state + } + return +} + +// StateDescription returns the value of the 'state_description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the state. +// Will be empty unless state is 'Failed'. +func (o *AWSInfrastructureAccessRoleGrant) StateDescription() string { + if o != nil && o.bitmap_&64 != 0 { + return o.stateDescription + } + return "" +} + +// GetStateDescription returns the value of the 'state_description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the state. +// Will be empty unless state is 'Failed'. +func (o *AWSInfrastructureAccessRoleGrant) GetStateDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.stateDescription + } + return +} + +// UserARN returns the value of the 'user_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The user AWS IAM ARN we want to grant the role. +func (o *AWSInfrastructureAccessRoleGrant) UserARN() string { + if o != nil && o.bitmap_&128 != 0 { + return o.userARN + } + return "" +} + +// GetUserARN returns the value of the 'user_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// The user AWS IAM ARN we want to grant the role. +func (o *AWSInfrastructureAccessRoleGrant) GetUserARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.userARN + } + return +} + +// AWSInfrastructureAccessRoleGrantListKind is the name of the type used to represent list of objects of +// type 'AWS_infrastructure_access_role_grant'. +const AWSInfrastructureAccessRoleGrantListKind = "AWSInfrastructureAccessRoleGrantList" + +// AWSInfrastructureAccessRoleGrantListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_infrastructure_access_role_grant'. +const AWSInfrastructureAccessRoleGrantListLinkKind = "AWSInfrastructureAccessRoleGrantListLink" + +// AWSInfrastructureAccessRoleGrantNilKind is the name of the type used to nil lists of objects of +// type 'AWS_infrastructure_access_role_grant'. +const AWSInfrastructureAccessRoleGrantListNilKind = "AWSInfrastructureAccessRoleGrantListNil" + +// AWSInfrastructureAccessRoleGrantList is a list of values of the 'AWS_infrastructure_access_role_grant' type. +type AWSInfrastructureAccessRoleGrantList struct { + href string + link bool + items []*AWSInfrastructureAccessRoleGrant +} + +// Kind returns the name of the type of the object. +func (l *AWSInfrastructureAccessRoleGrantList) Kind() string { + if l == nil { + return AWSInfrastructureAccessRoleGrantListNilKind + } + if l.link { + return AWSInfrastructureAccessRoleGrantListLinkKind + } + return AWSInfrastructureAccessRoleGrantListKind +} + +// Link returns true iif this is a link. +func (l *AWSInfrastructureAccessRoleGrantList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AWSInfrastructureAccessRoleGrantList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AWSInfrastructureAccessRoleGrantList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AWSInfrastructureAccessRoleGrantList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSInfrastructureAccessRoleGrantList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSInfrastructureAccessRoleGrantList) Get(i int) *AWSInfrastructureAccessRoleGrant { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSInfrastructureAccessRoleGrantList) Slice() []*AWSInfrastructureAccessRoleGrant { + var slice []*AWSInfrastructureAccessRoleGrant + if l == nil { + slice = make([]*AWSInfrastructureAccessRoleGrant, 0) + } else { + slice = make([]*AWSInfrastructureAccessRoleGrant, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSInfrastructureAccessRoleGrantList) Each(f func(item *AWSInfrastructureAccessRoleGrant) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSInfrastructureAccessRoleGrantList) Range(f func(index int, item *AWSInfrastructureAccessRoleGrant) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_type_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_type_json.go new file mode 100644 index 00000000..7816f82b --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grant_type_json.go @@ -0,0 +1,173 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSInfrastructureAccessRoleGrant writes a value of the 'AWS_infrastructure_access_role_grant' type to the given writer. +func MarshalAWSInfrastructureAccessRoleGrant(object *AWSInfrastructureAccessRoleGrant, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSInfrastructureAccessRoleGrant(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSInfrastructureAccessRoleGrant writes a value of the 'AWS_infrastructure_access_role_grant' type to the given stream. +func writeAWSInfrastructureAccessRoleGrant(object *AWSInfrastructureAccessRoleGrant, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AWSInfrastructureAccessRoleGrantLinkKind) + } else { + stream.WriteString(AWSInfrastructureAccessRoleGrantKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("console_url") + stream.WriteString(object.consoleURL) + count++ + } + present_ = object.bitmap_&16 != 0 && object.role != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("role") + writeAWSInfrastructureAccessRole(object.role, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(string(object.state)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state_description") + stream.WriteString(object.stateDescription) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("user_arn") + stream.WriteString(object.userARN) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSInfrastructureAccessRoleGrant reads a value of the 'AWS_infrastructure_access_role_grant' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSInfrastructureAccessRoleGrant(source interface{}) (object *AWSInfrastructureAccessRoleGrant, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSInfrastructureAccessRoleGrant(iterator) + err = iterator.Error + return +} + +// readAWSInfrastructureAccessRoleGrant reads a value of the 'AWS_infrastructure_access_role_grant' type from the given iterator. +func readAWSInfrastructureAccessRoleGrant(iterator *jsoniter.Iterator) *AWSInfrastructureAccessRoleGrant { + object := &AWSInfrastructureAccessRoleGrant{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AWSInfrastructureAccessRoleGrantLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "console_url": + value := iterator.ReadString() + object.consoleURL = value + object.bitmap_ |= 8 + case "role": + value := readAWSInfrastructureAccessRole(iterator) + object.role = value + object.bitmap_ |= 16 + case "state": + text := iterator.ReadString() + value := AWSInfrastructureAccessRoleGrantState(text) + object.state = value + object.bitmap_ |= 32 + case "state_description": + value := iterator.ReadString() + object.stateDescription = value + object.bitmap_ |= 64 + case "user_arn": + value := iterator.ReadString() + object.userARN = value + object.bitmap_ |= 128 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grants_client.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grants_client.go new file mode 100644 index 00000000..1377e505 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grants_client.go @@ -0,0 +1,508 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSInfrastructureAccessRoleGrantsClient is the client of the 'AWS_infrastructure_access_role_grants' resource. +// +// Manages the collection of AWS infrastructure access role grants. +type AWSInfrastructureAccessRoleGrantsClient struct { + transport http.RoundTripper + path string +} + +// NewAWSInfrastructureAccessRoleGrantsClient creates a new client for the 'AWS_infrastructure_access_role_grants' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSInfrastructureAccessRoleGrantsClient(transport http.RoundTripper, path string) *AWSInfrastructureAccessRoleGrantsClient { + return &AWSInfrastructureAccessRoleGrantsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Create a new AWS infrastructure access role grant and add it to the collection of +// AWS infrastructure access role grants on the cluster. +func (c *AWSInfrastructureAccessRoleGrantsClient) Add() *AWSInfrastructureAccessRoleGrantsAddRequest { + return &AWSInfrastructureAccessRoleGrantsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of AWS infrastructure access role grants. +func (c *AWSInfrastructureAccessRoleGrantsClient) List() *AWSInfrastructureAccessRoleGrantsListRequest { + return &AWSInfrastructureAccessRoleGrantsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSInfrastructureAccessRoleGrant returns the target 'AWS_infrastructure_access_role_grant' resource for the given identifier. +// +// Returns a reference to the service that manages a specific AWS infrastructure access role grant. +func (c *AWSInfrastructureAccessRoleGrantsClient) AWSInfrastructureAccessRoleGrant(id string) *AWSInfrastructureAccessRoleGrantClient { + return NewAWSInfrastructureAccessRoleGrantClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AWSInfrastructureAccessRoleGrantsAddRequest is the request for the 'add' method. +type AWSInfrastructureAccessRoleGrantsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AWSInfrastructureAccessRoleGrant +} + +// Parameter adds a query parameter. +func (r *AWSInfrastructureAccessRoleGrantsAddRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRoleGrantsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSInfrastructureAccessRoleGrantsAddRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRoleGrantsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSInfrastructureAccessRoleGrantsAddRequest) Impersonate(user string) *AWSInfrastructureAccessRoleGrantsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the AWS infrastructure access role grant. +func (r *AWSInfrastructureAccessRoleGrantsAddRequest) Body(value *AWSInfrastructureAccessRoleGrant) *AWSInfrastructureAccessRoleGrantsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSInfrastructureAccessRoleGrantsAddRequest) Send() (result *AWSInfrastructureAccessRoleGrantsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSInfrastructureAccessRoleGrantsAddRequest) SendContext(ctx context.Context) (result *AWSInfrastructureAccessRoleGrantsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAWSInfrastructureAccessRoleGrantsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSInfrastructureAccessRoleGrantsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSInfrastructureAccessRoleGrantsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSInfrastructureAccessRoleGrantsAddResponse is the response for the 'add' method. +type AWSInfrastructureAccessRoleGrantsAddResponse struct { + status int + header http.Header + err *errors.Error + body *AWSInfrastructureAccessRoleGrant +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRoleGrantsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRoleGrantsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRoleGrantsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the AWS infrastructure access role grant. +func (r *AWSInfrastructureAccessRoleGrantsAddResponse) Body() *AWSInfrastructureAccessRoleGrant { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the AWS infrastructure access role grant. +func (r *AWSInfrastructureAccessRoleGrantsAddResponse) GetBody() (value *AWSInfrastructureAccessRoleGrant, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// AWSInfrastructureAccessRoleGrantsListRequest is the request for the 'list' method. +type AWSInfrastructureAccessRoleGrantsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRoleGrantsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRoleGrantsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Impersonate(user string) *AWSInfrastructureAccessRoleGrantsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the AWS infrastructure access role grant +// instead of the names of the columns of a table. For example, in order to sort the +// AWS infrastructure access role grants descending by user ARN the value should be: +// +// ```sql +// user_arn desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Order(value string) *AWSInfrastructureAccessRoleGrantsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Page(value int) *AWSInfrastructureAccessRoleGrantsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the AWS infrastructure access role grant +// instead of the names of the columns of a table. For example, in order to retrieve +// all the AWS infrastructure access role grants with a user ARN starting with `user` the value should be: +// +// ```sql +// user_arn like '%user' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the AWS +// infrastructure access role grants that the user has permission to see will be returned. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Search(value string) *AWSInfrastructureAccessRoleGrantsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Size(value int) *AWSInfrastructureAccessRoleGrantsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) Send() (result *AWSInfrastructureAccessRoleGrantsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSInfrastructureAccessRoleGrantsListRequest) SendContext(ctx context.Context) (result *AWSInfrastructureAccessRoleGrantsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSInfrastructureAccessRoleGrantsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSInfrastructureAccessRoleGrantsListResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSInfrastructureAccessRoleGrantsListResponse is the response for the 'list' method. +type AWSInfrastructureAccessRoleGrantsListResponse struct { + status int + header http.Header + err *errors.Error + items *AWSInfrastructureAccessRoleGrantList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of AWS infrastructure access role grants. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Items() *AWSInfrastructureAccessRoleGrantList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of AWS infrastructure access role grants. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) GetItems() (value *AWSInfrastructureAccessRoleGrantList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSInfrastructureAccessRoleGrantsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grants_resource_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grants_resource_json.go new file mode 100644 index 00000000..fb503d1e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_grants_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAWSInfrastructureAccessRoleGrantsAddRequest(request *AWSInfrastructureAccessRoleGrantsAddRequest, writer io.Writer) error { + return MarshalAWSInfrastructureAccessRoleGrant(request.body, writer) +} +func readAWSInfrastructureAccessRoleGrantsAddResponse(response *AWSInfrastructureAccessRoleGrantsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAWSInfrastructureAccessRoleGrant(reader) + return err +} +func writeAWSInfrastructureAccessRoleGrantsListRequest(request *AWSInfrastructureAccessRoleGrantsListRequest, writer io.Writer) error { + return nil +} +func readAWSInfrastructureAccessRoleGrantsListResponse(response *AWSInfrastructureAccessRoleGrantsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAWSInfrastructureAccessRoleGrantList(iterator) + response.items = &AWSInfrastructureAccessRoleGrantList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_list_builder.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_list_builder.go new file mode 100644 index 00000000..b0188457 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleListBuilder contains the data and logic needed to build +// 'AWS_infrastructure_access_role' objects. +type AWSInfrastructureAccessRoleListBuilder struct { + items []*AWSInfrastructureAccessRoleBuilder +} + +// NewAWSInfrastructureAccessRoleList creates a new builder of 'AWS_infrastructure_access_role' objects. +func NewAWSInfrastructureAccessRoleList() *AWSInfrastructureAccessRoleListBuilder { + return new(AWSInfrastructureAccessRoleListBuilder) +} + +// Items sets the items of the list. +func (b *AWSInfrastructureAccessRoleListBuilder) Items(values ...*AWSInfrastructureAccessRoleBuilder) *AWSInfrastructureAccessRoleListBuilder { + b.items = make([]*AWSInfrastructureAccessRoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSInfrastructureAccessRoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSInfrastructureAccessRoleListBuilder) Copy(list *AWSInfrastructureAccessRoleList) *AWSInfrastructureAccessRoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSInfrastructureAccessRoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSInfrastructureAccessRole().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_infrastructure_access_role' objects using the +// configuration stored in the builder. +func (b *AWSInfrastructureAccessRoleListBuilder) Build() (list *AWSInfrastructureAccessRoleList, err error) { + items := make([]*AWSInfrastructureAccessRole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSInfrastructureAccessRoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_list_type_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_list_type_json.go new file mode 100644 index 00000000..ced92893 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSInfrastructureAccessRoleList writes a list of values of the 'AWS_infrastructure_access_role' type to +// the given writer. +func MarshalAWSInfrastructureAccessRoleList(list []*AWSInfrastructureAccessRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSInfrastructureAccessRoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSInfrastructureAccessRoleList writes a list of value of the 'AWS_infrastructure_access_role' type to +// the given stream. +func writeAWSInfrastructureAccessRoleList(list []*AWSInfrastructureAccessRole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSInfrastructureAccessRole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSInfrastructureAccessRoleList reads a list of values of the 'AWS_infrastructure_access_role' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSInfrastructureAccessRoleList(source interface{}) (items []*AWSInfrastructureAccessRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSInfrastructureAccessRoleList(iterator) + err = iterator.Error + return +} + +// readAWSInfrastructureAccessRoleList reads list of values of the ”AWS_infrastructure_access_role' type from +// the given iterator. +func readAWSInfrastructureAccessRoleList(iterator *jsoniter.Iterator) []*AWSInfrastructureAccessRole { + list := []*AWSInfrastructureAccessRole{} + for iterator.ReadArray() { + item := readAWSInfrastructureAccessRole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_resource_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_resource_json.go new file mode 100644 index 00000000..993179a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAWSInfrastructureAccessRoleGetRequest(request *AWSInfrastructureAccessRoleGetRequest, writer io.Writer) error { + return nil +} +func readAWSInfrastructureAccessRoleGetResponse(response *AWSInfrastructureAccessRoleGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalAWSInfrastructureAccessRole(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_state_list_type_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_state_list_type_json.go new file mode 100644 index 00000000..22e735b4 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSInfrastructureAccessRoleStateList writes a list of values of the 'AWS_infrastructure_access_role_state' type to +// the given writer. +func MarshalAWSInfrastructureAccessRoleStateList(list []AWSInfrastructureAccessRoleState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSInfrastructureAccessRoleStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSInfrastructureAccessRoleStateList writes a list of value of the 'AWS_infrastructure_access_role_state' type to +// the given stream. +func writeAWSInfrastructureAccessRoleStateList(list []AWSInfrastructureAccessRoleState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSInfrastructureAccessRoleStateList reads a list of values of the 'AWS_infrastructure_access_role_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSInfrastructureAccessRoleStateList(source interface{}) (items []AWSInfrastructureAccessRoleState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSInfrastructureAccessRoleStateList(iterator) + err = iterator.Error + return +} + +// readAWSInfrastructureAccessRoleStateList reads list of values of the ”AWS_infrastructure_access_role_state' type from +// the given iterator. +func readAWSInfrastructureAccessRoleStateList(iterator *jsoniter.Iterator) []AWSInfrastructureAccessRoleState { + list := []AWSInfrastructureAccessRoleState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := AWSInfrastructureAccessRoleState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_state_type.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_state_type.go new file mode 100644 index 00000000..171f557d --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_state_type.go @@ -0,0 +1,36 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleState represents the values of the 'AWS_infrastructure_access_role_state' enumerated type. +type AWSInfrastructureAccessRoleState string + +const ( + // Role definition is invalid. Role can't be used. + AWSInfrastructureAccessRoleStateInvalid AWSInfrastructureAccessRoleState = "invalid" + // This is a special state intended for the user know + // that the access role has been removed by SRE, + // but there are still grants referencing it. + // Role can't be used in a new grant. + AWSInfrastructureAccessRoleStateRemoved AWSInfrastructureAccessRoleState = "removed" + // Access role is valid an can be used. + // Only valid roles can be used in a role grant. + AWSInfrastructureAccessRoleStateValid AWSInfrastructureAccessRoleState = "valid" +) diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_type.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_type.go new file mode 100644 index 00000000..6901369d --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_type.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSInfrastructureAccessRoleKind is the name of the type used to represent objects +// of type 'AWS_infrastructure_access_role'. +const AWSInfrastructureAccessRoleKind = "AWSInfrastructureAccessRole" + +// AWSInfrastructureAccessRoleLinkKind is the name of the type used to represent links +// to objects of type 'AWS_infrastructure_access_role'. +const AWSInfrastructureAccessRoleLinkKind = "AWSInfrastructureAccessRoleLink" + +// AWSInfrastructureAccessRoleNilKind is the name of the type used to nil references +// to objects of type 'AWS_infrastructure_access_role'. +const AWSInfrastructureAccessRoleNilKind = "AWSInfrastructureAccessRoleNil" + +// AWSInfrastructureAccessRole represents the values of the 'AWS_infrastructure_access_role' type. +// +// A set of acces permissions for AWS resources +type AWSInfrastructureAccessRole struct { + bitmap_ uint32 + id string + href string + description string + displayName string + state AWSInfrastructureAccessRoleState +} + +// Kind returns the name of the type of the object. +func (o *AWSInfrastructureAccessRole) Kind() string { + if o == nil { + return AWSInfrastructureAccessRoleNilKind + } + if o.bitmap_&1 != 0 { + return AWSInfrastructureAccessRoleLinkKind + } + return AWSInfrastructureAccessRoleKind +} + +// Link returns true iif this is a link. +func (o *AWSInfrastructureAccessRole) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AWSInfrastructureAccessRole) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AWSInfrastructureAccessRole) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AWSInfrastructureAccessRole) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AWSInfrastructureAccessRole) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSInfrastructureAccessRole) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the role. +func (o *AWSInfrastructureAccessRole) Description() string { + if o != nil && o.bitmap_&8 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the role. +func (o *AWSInfrastructureAccessRole) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.description + } + return +} + +// DisplayName returns the value of the 'display_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Human friendly identifier of the role, for example `Read only`. +func (o *AWSInfrastructureAccessRole) DisplayName() string { + if o != nil && o.bitmap_&16 != 0 { + return o.displayName + } + return "" +} + +// GetDisplayName returns the value of the 'display_name' attribute and +// a flag indicating if the attribute has a value. +// +// Human friendly identifier of the role, for example `Read only`. +func (o *AWSInfrastructureAccessRole) GetDisplayName() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.displayName + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State of the role. +func (o *AWSInfrastructureAccessRole) State() AWSInfrastructureAccessRoleState { + if o != nil && o.bitmap_&32 != 0 { + return o.state + } + return AWSInfrastructureAccessRoleState("") +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// State of the role. +func (o *AWSInfrastructureAccessRole) GetState() (value AWSInfrastructureAccessRoleState, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.state + } + return +} + +// AWSInfrastructureAccessRoleListKind is the name of the type used to represent list of objects of +// type 'AWS_infrastructure_access_role'. +const AWSInfrastructureAccessRoleListKind = "AWSInfrastructureAccessRoleList" + +// AWSInfrastructureAccessRoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_infrastructure_access_role'. +const AWSInfrastructureAccessRoleListLinkKind = "AWSInfrastructureAccessRoleListLink" + +// AWSInfrastructureAccessRoleNilKind is the name of the type used to nil lists of objects of +// type 'AWS_infrastructure_access_role'. +const AWSInfrastructureAccessRoleListNilKind = "AWSInfrastructureAccessRoleListNil" + +// AWSInfrastructureAccessRoleList is a list of values of the 'AWS_infrastructure_access_role' type. +type AWSInfrastructureAccessRoleList struct { + href string + link bool + items []*AWSInfrastructureAccessRole +} + +// Kind returns the name of the type of the object. +func (l *AWSInfrastructureAccessRoleList) Kind() string { + if l == nil { + return AWSInfrastructureAccessRoleListNilKind + } + if l.link { + return AWSInfrastructureAccessRoleListLinkKind + } + return AWSInfrastructureAccessRoleListKind +} + +// Link returns true iif this is a link. +func (l *AWSInfrastructureAccessRoleList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AWSInfrastructureAccessRoleList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AWSInfrastructureAccessRoleList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AWSInfrastructureAccessRoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSInfrastructureAccessRoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSInfrastructureAccessRoleList) Get(i int) *AWSInfrastructureAccessRole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSInfrastructureAccessRoleList) Slice() []*AWSInfrastructureAccessRole { + var slice []*AWSInfrastructureAccessRole + if l == nil { + slice = make([]*AWSInfrastructureAccessRole, 0) + } else { + slice = make([]*AWSInfrastructureAccessRole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSInfrastructureAccessRoleList) Each(f func(item *AWSInfrastructureAccessRole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSInfrastructureAccessRoleList) Range(f func(index int, item *AWSInfrastructureAccessRole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_role_type_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_type_json.go new file mode 100644 index 00000000..827368fc --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_role_type_json.go @@ -0,0 +1,147 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSInfrastructureAccessRole writes a value of the 'AWS_infrastructure_access_role' type to the given writer. +func MarshalAWSInfrastructureAccessRole(object *AWSInfrastructureAccessRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSInfrastructureAccessRole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSInfrastructureAccessRole writes a value of the 'AWS_infrastructure_access_role' type to the given stream. +func writeAWSInfrastructureAccessRole(object *AWSInfrastructureAccessRole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AWSInfrastructureAccessRoleLinkKind) + } else { + stream.WriteString(AWSInfrastructureAccessRoleKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("display_name") + stream.WriteString(object.displayName) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(string(object.state)) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSInfrastructureAccessRole reads a value of the 'AWS_infrastructure_access_role' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSInfrastructureAccessRole(source interface{}) (object *AWSInfrastructureAccessRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSInfrastructureAccessRole(iterator) + err = iterator.Error + return +} + +// readAWSInfrastructureAccessRole reads a value of the 'AWS_infrastructure_access_role' type from the given iterator. +func readAWSInfrastructureAccessRole(iterator *jsoniter.Iterator) *AWSInfrastructureAccessRole { + object := &AWSInfrastructureAccessRole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AWSInfrastructureAccessRoleLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 8 + case "display_name": + value := iterator.ReadString() + object.displayName = value + object.bitmap_ |= 16 + case "state": + text := iterator.ReadString() + value := AWSInfrastructureAccessRoleState(text) + object.state = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_roles_client.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_roles_client.go new file mode 100644 index 00000000..4a0704fe --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_roles_client.go @@ -0,0 +1,345 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSInfrastructureAccessRolesClient is the client of the 'AWS_infrastructure_access_roles' resource. +// +// Manages the collection of aws infrastructure access roles. +type AWSInfrastructureAccessRolesClient struct { + transport http.RoundTripper + path string +} + +// NewAWSInfrastructureAccessRolesClient creates a new client for the 'AWS_infrastructure_access_roles' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSInfrastructureAccessRolesClient(transport http.RoundTripper, path string) *AWSInfrastructureAccessRolesClient { + return &AWSInfrastructureAccessRolesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +func (c *AWSInfrastructureAccessRolesClient) List() *AWSInfrastructureAccessRolesListRequest { + return &AWSInfrastructureAccessRolesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSInfrastructureAccessRole returns the target 'AWS_infrastructure_access_role' resource for the given identifier. +// +// Reference to the resource that manages a specific role. +func (c *AWSInfrastructureAccessRolesClient) AWSInfrastructureAccessRole(id string) *AWSInfrastructureAccessRoleClient { + return NewAWSInfrastructureAccessRoleClient( + c.transport, + path.Join(c.path, id), + ) +} + +// AWSInfrastructureAccessRolesListRequest is the request for the 'list' method. +type AWSInfrastructureAccessRolesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AWSInfrastructureAccessRolesListRequest) Parameter(name string, value interface{}) *AWSInfrastructureAccessRolesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSInfrastructureAccessRolesListRequest) Header(name string, value interface{}) *AWSInfrastructureAccessRolesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSInfrastructureAccessRolesListRequest) Impersonate(user string) *AWSInfrastructureAccessRolesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the role instead of +// the names of the columns of a table. For example, in order to sort the roles +// descending by dislay_name the value should be: +// +// ```sql +// display_name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AWSInfrastructureAccessRolesListRequest) Order(value string) *AWSInfrastructureAccessRolesListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSInfrastructureAccessRolesListRequest) Page(value int) *AWSInfrastructureAccessRolesListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the role instead of +// the names of the columns of a table. For example, in order to retrieve all the +// role with a name starting with `my`the value should be: +// +// ```sql +// display_name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the roles +// that the user has permission to see will be returned. +func (r *AWSInfrastructureAccessRolesListRequest) Search(value string) *AWSInfrastructureAccessRolesListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSInfrastructureAccessRolesListRequest) Size(value int) *AWSInfrastructureAccessRolesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSInfrastructureAccessRolesListRequest) Send() (result *AWSInfrastructureAccessRolesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSInfrastructureAccessRolesListRequest) SendContext(ctx context.Context) (result *AWSInfrastructureAccessRolesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSInfrastructureAccessRolesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSInfrastructureAccessRolesListResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSInfrastructureAccessRolesListResponse is the response for the 'list' method. +type AWSInfrastructureAccessRolesListResponse struct { + status int + header http.Header + err *errors.Error + items *AWSInfrastructureAccessRoleList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AWSInfrastructureAccessRolesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSInfrastructureAccessRolesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSInfrastructureAccessRolesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of roles. +func (r *AWSInfrastructureAccessRolesListResponse) Items() *AWSInfrastructureAccessRoleList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of roles. +func (r *AWSInfrastructureAccessRolesListResponse) GetItems() (value *AWSInfrastructureAccessRoleList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSInfrastructureAccessRolesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSInfrastructureAccessRolesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSInfrastructureAccessRolesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSInfrastructureAccessRolesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSInfrastructureAccessRolesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSInfrastructureAccessRolesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_infrastructure_access_roles_resource_json.go b/clustersmgmt/v2alpha1/aws_infrastructure_access_roles_resource_json.go new file mode 100644 index 00000000..8887ea47 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_infrastructure_access_roles_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAWSInfrastructureAccessRolesListRequest(request *AWSInfrastructureAccessRolesListRequest, writer io.Writer) error { + return nil +} +func readAWSInfrastructureAccessRolesListResponse(response *AWSInfrastructureAccessRolesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAWSInfrastructureAccessRoleList(iterator) + response.items = &AWSInfrastructureAccessRoleList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/aws_inquiries_client.go b/clustersmgmt/v2alpha1/aws_inquiries_client.go new file mode 100644 index 00000000..0b1aa85f --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_inquiries_client.go @@ -0,0 +1,113 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "net/http" + "path" +) + +// AWSInquiriesClient is the client of the 'AWS_inquiries' resource. +// +// Manages the collection of aws inquiries. +type AWSInquiriesClient struct { + transport http.RoundTripper + path string +} + +// NewAWSInquiriesClient creates a new client for the 'AWS_inquiries' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSInquiriesClient(transport http.RoundTripper, path string) *AWSInquiriesClient { + return &AWSInquiriesClient{ + transport: transport, + path: path, + } +} + +// STSAccountRoles returns the target 'AWSSTS_account_roles_inquiry' resource. +// +// Reference to the resource that manages aws sts roles. +func (c *AWSInquiriesClient) STSAccountRoles() *AWSSTSAccountRolesInquiryClient { + return NewAWSSTSAccountRolesInquiryClient( + c.transport, + path.Join(c.path, "sts_account_roles"), + ) +} + +// STSCredentialRequests returns the target 'STS_credential_requests_inquiry' resource. +// +// Reference to the resource that manages sts cred request. +func (c *AWSInquiriesClient) STSCredentialRequests() *STSCredentialRequestsInquiryClient { + return NewSTSCredentialRequestsInquiryClient( + c.transport, + path.Join(c.path, "sts_credential_requests"), + ) +} + +// STSPolicies returns the target 'AWSSTS_policies_inquiry' resource. +// +// Reference to the resource that manages aws sts policies. +func (c *AWSInquiriesClient) STSPolicies() *AWSSTSPoliciesInquiryClient { + return NewAWSSTSPoliciesInquiryClient( + c.transport, + path.Join(c.path, "sts_policies"), + ) +} + +// MachineTypes returns the target 'AWS_region_machine_types_inquiry' resource. +// +// Reference to the resource that manages aws machine types by regions. +func (c *AWSInquiriesClient) MachineTypes() *AWSRegionMachineTypesInquiryClient { + return NewAWSRegionMachineTypesInquiryClient( + c.transport, + path.Join(c.path, "machine_types"), + ) +} + +// Regions returns the target 'available_regions_inquiry' resource. +// +// Reference to the resource that manages a collection of regions. +func (c *AWSInquiriesClient) Regions() *AvailableRegionsInquiryClient { + return NewAvailableRegionsInquiryClient( + c.transport, + path.Join(c.path, "regions"), + ) +} + +// ValidateCredentials returns the target 'aws_validate_credentials' resource. +// +// Reference to the resource that manages creds validation. +func (c *AWSInquiriesClient) ValidateCredentials() *AwsValidateCredentialsClient { + return NewAwsValidateCredentialsClient( + c.transport, + path.Join(c.path, "validate_credentials"), + ) +} + +// Vpcs returns the target 'vpcs_inquiry' resource. +// +// Reference to the resource that manages a collection of vpcs. +func (c *AWSInquiriesClient) Vpcs() *VpcsInquiryClient { + return NewVpcsInquiryClient( + c.transport, + path.Join(c.path, "vpcs"), + ) +} diff --git a/clustersmgmt/v2alpha1/aws_inquiries_resource_json.go b/clustersmgmt/v2alpha1/aws_inquiries_resource_json.go new file mode 100644 index 00000000..45f0dd4e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_inquiries_resource_json.go @@ -0,0 +1,20 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 diff --git a/clustersmgmt/v2alpha1/aws_list_builder.go b/clustersmgmt/v2alpha1/aws_list_builder.go new file mode 100644 index 00000000..8d457d7d --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSListBuilder contains the data and logic needed to build +// 'AWS' objects. +type AWSListBuilder struct { + items []*AWSBuilder +} + +// NewAWSList creates a new builder of 'AWS' objects. +func NewAWSList() *AWSListBuilder { + return new(AWSListBuilder) +} + +// Items sets the items of the list. +func (b *AWSListBuilder) Items(values ...*AWSBuilder) *AWSListBuilder { + b.items = make([]*AWSBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSListBuilder) Copy(list *AWSList) *AWSListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWS().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS' objects using the +// configuration stored in the builder. +func (b *AWSListBuilder) Build() (list *AWSList, err error) { + items := make([]*AWS, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_list_type_json.go b/clustersmgmt/v2alpha1/aws_list_type_json.go new file mode 100644 index 00000000..be48617e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSList writes a list of values of the 'AWS' type to +// the given writer. +func MarshalAWSList(list []*AWS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSList writes a list of value of the 'AWS' type to +// the given stream. +func writeAWSList(list []*AWS, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWS(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSList reads a list of values of the 'AWS' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSList(source interface{}) (items []*AWS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSList(iterator) + err = iterator.Error + return +} + +// readAWSList reads list of values of the ”AWS' type from +// the given iterator. +func readAWSList(iterator *jsoniter.Iterator) []*AWS { + list := []*AWS{} + for iterator.ReadArray() { + item := readAWS(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_machine_pool_builder.go b/clustersmgmt/v2alpha1/aws_machine_pool_builder.go new file mode 100644 index 00000000..5e37586c --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_machine_pool_builder.go @@ -0,0 +1,201 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSMachinePoolBuilder contains the data and logic needed to build 'AWS_machine_pool' objects. +// +// Representation of aws machine pool specific parameters. +type AWSMachinePoolBuilder struct { + bitmap_ uint32 + id string + href string + additionalSecurityGroupIds []string + availabilityZoneTypes map[string]string + spotMarketOptions *AWSSpotMarketOptionsBuilder + subnetOutposts map[string]string + tags map[string]string +} + +// NewAWSMachinePool creates a new builder of 'AWS_machine_pool' objects. +func NewAWSMachinePool() *AWSMachinePoolBuilder { + return &AWSMachinePoolBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AWSMachinePoolBuilder) Link(value bool) *AWSMachinePoolBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AWSMachinePoolBuilder) ID(value string) *AWSMachinePoolBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AWSMachinePoolBuilder) HREF(value string) *AWSMachinePoolBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSMachinePoolBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AdditionalSecurityGroupIds sets the value of the 'additional_security_group_ids' attribute to the given values. +func (b *AWSMachinePoolBuilder) AdditionalSecurityGroupIds(values ...string) *AWSMachinePoolBuilder { + b.additionalSecurityGroupIds = make([]string, len(values)) + copy(b.additionalSecurityGroupIds, values) + b.bitmap_ |= 8 + return b +} + +// AvailabilityZoneTypes sets the value of the 'availability_zone_types' attribute to the given value. +func (b *AWSMachinePoolBuilder) AvailabilityZoneTypes(value map[string]string) *AWSMachinePoolBuilder { + b.availabilityZoneTypes = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// SpotMarketOptions sets the value of the 'spot_market_options' attribute to the given value. +// +// Spot market options for AWS machine pool. +func (b *AWSMachinePoolBuilder) SpotMarketOptions(value *AWSSpotMarketOptionsBuilder) *AWSMachinePoolBuilder { + b.spotMarketOptions = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// SubnetOutposts sets the value of the 'subnet_outposts' attribute to the given value. +func (b *AWSMachinePoolBuilder) SubnetOutposts(value map[string]string) *AWSMachinePoolBuilder { + b.subnetOutposts = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// Tags sets the value of the 'tags' attribute to the given value. +func (b *AWSMachinePoolBuilder) Tags(value map[string]string) *AWSMachinePoolBuilder { + b.tags = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSMachinePoolBuilder) Copy(object *AWSMachinePool) *AWSMachinePoolBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.additionalSecurityGroupIds != nil { + b.additionalSecurityGroupIds = make([]string, len(object.additionalSecurityGroupIds)) + copy(b.additionalSecurityGroupIds, object.additionalSecurityGroupIds) + } else { + b.additionalSecurityGroupIds = nil + } + if len(object.availabilityZoneTypes) > 0 { + b.availabilityZoneTypes = map[string]string{} + for k, v := range object.availabilityZoneTypes { + b.availabilityZoneTypes[k] = v + } + } else { + b.availabilityZoneTypes = nil + } + if object.spotMarketOptions != nil { + b.spotMarketOptions = NewAWSSpotMarketOptions().Copy(object.spotMarketOptions) + } else { + b.spotMarketOptions = nil + } + if len(object.subnetOutposts) > 0 { + b.subnetOutposts = map[string]string{} + for k, v := range object.subnetOutposts { + b.subnetOutposts[k] = v + } + } else { + b.subnetOutposts = nil + } + if len(object.tags) > 0 { + b.tags = map[string]string{} + for k, v := range object.tags { + b.tags[k] = v + } + } else { + b.tags = nil + } + return b +} + +// Build creates a 'AWS_machine_pool' object using the configuration stored in the builder. +func (b *AWSMachinePoolBuilder) Build() (object *AWSMachinePool, err error) { + object = new(AWSMachinePool) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.additionalSecurityGroupIds != nil { + object.additionalSecurityGroupIds = make([]string, len(b.additionalSecurityGroupIds)) + copy(object.additionalSecurityGroupIds, b.additionalSecurityGroupIds) + } + if b.availabilityZoneTypes != nil { + object.availabilityZoneTypes = make(map[string]string) + for k, v := range b.availabilityZoneTypes { + object.availabilityZoneTypes[k] = v + } + } + if b.spotMarketOptions != nil { + object.spotMarketOptions, err = b.spotMarketOptions.Build() + if err != nil { + return + } + } + if b.subnetOutposts != nil { + object.subnetOutposts = make(map[string]string) + for k, v := range b.subnetOutposts { + object.subnetOutposts[k] = v + } + } + if b.tags != nil { + object.tags = make(map[string]string) + for k, v := range b.tags { + object.tags[k] = v + } + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_machine_pool_list_builder.go b/clustersmgmt/v2alpha1/aws_machine_pool_list_builder.go new file mode 100644 index 00000000..7293f0f1 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_machine_pool_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSMachinePoolListBuilder contains the data and logic needed to build +// 'AWS_machine_pool' objects. +type AWSMachinePoolListBuilder struct { + items []*AWSMachinePoolBuilder +} + +// NewAWSMachinePoolList creates a new builder of 'AWS_machine_pool' objects. +func NewAWSMachinePoolList() *AWSMachinePoolListBuilder { + return new(AWSMachinePoolListBuilder) +} + +// Items sets the items of the list. +func (b *AWSMachinePoolListBuilder) Items(values ...*AWSMachinePoolBuilder) *AWSMachinePoolListBuilder { + b.items = make([]*AWSMachinePoolBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSMachinePoolListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSMachinePoolListBuilder) Copy(list *AWSMachinePoolList) *AWSMachinePoolListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSMachinePoolBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSMachinePool().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_machine_pool' objects using the +// configuration stored in the builder. +func (b *AWSMachinePoolListBuilder) Build() (list *AWSMachinePoolList, err error) { + items := make([]*AWSMachinePool, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSMachinePoolList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_machine_pool_list_type_json.go b/clustersmgmt/v2alpha1/aws_machine_pool_list_type_json.go new file mode 100644 index 00000000..cd3fb8dd --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_machine_pool_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSMachinePoolList writes a list of values of the 'AWS_machine_pool' type to +// the given writer. +func MarshalAWSMachinePoolList(list []*AWSMachinePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSMachinePoolList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSMachinePoolList writes a list of value of the 'AWS_machine_pool' type to +// the given stream. +func writeAWSMachinePoolList(list []*AWSMachinePool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSMachinePool(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSMachinePoolList reads a list of values of the 'AWS_machine_pool' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSMachinePoolList(source interface{}) (items []*AWSMachinePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSMachinePoolList(iterator) + err = iterator.Error + return +} + +// readAWSMachinePoolList reads list of values of the ”AWS_machine_pool' type from +// the given iterator. +func readAWSMachinePoolList(iterator *jsoniter.Iterator) []*AWSMachinePool { + list := []*AWSMachinePool{} + for iterator.ReadArray() { + item := readAWSMachinePool(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_machine_pool_type.go b/clustersmgmt/v2alpha1/aws_machine_pool_type.go new file mode 100644 index 00000000..c47fd5d5 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_machine_pool_type.go @@ -0,0 +1,352 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSMachinePoolKind is the name of the type used to represent objects +// of type 'AWS_machine_pool'. +const AWSMachinePoolKind = "AWSMachinePool" + +// AWSMachinePoolLinkKind is the name of the type used to represent links +// to objects of type 'AWS_machine_pool'. +const AWSMachinePoolLinkKind = "AWSMachinePoolLink" + +// AWSMachinePoolNilKind is the name of the type used to nil references +// to objects of type 'AWS_machine_pool'. +const AWSMachinePoolNilKind = "AWSMachinePoolNil" + +// AWSMachinePool represents the values of the 'AWS_machine_pool' type. +// +// Representation of aws machine pool specific parameters. +type AWSMachinePool struct { + bitmap_ uint32 + id string + href string + additionalSecurityGroupIds []string + availabilityZoneTypes map[string]string + spotMarketOptions *AWSSpotMarketOptions + subnetOutposts map[string]string + tags map[string]string +} + +// Kind returns the name of the type of the object. +func (o *AWSMachinePool) Kind() string { + if o == nil { + return AWSMachinePoolNilKind + } + if o.bitmap_&1 != 0 { + return AWSMachinePoolLinkKind + } + return AWSMachinePoolKind +} + +// Link returns true iif this is a link. +func (o *AWSMachinePool) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AWSMachinePool) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AWSMachinePool) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AWSMachinePool) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AWSMachinePool) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSMachinePool) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AdditionalSecurityGroupIds returns the value of the 'additional_security_group_ids' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional AWS Security Groups to be added machine pool. Note that machine pools can only be worker node at the time. +func (o *AWSMachinePool) AdditionalSecurityGroupIds() []string { + if o != nil && o.bitmap_&8 != 0 { + return o.additionalSecurityGroupIds + } + return nil +} + +// GetAdditionalSecurityGroupIds returns the value of the 'additional_security_group_ids' attribute and +// a flag indicating if the attribute has a value. +// +// Additional AWS Security Groups to be added machine pool. Note that machine pools can only be worker node at the time. +func (o *AWSMachinePool) GetAdditionalSecurityGroupIds() (value []string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.additionalSecurityGroupIds + } + return +} + +// AvailabilityZoneTypes returns the value of the 'availability_zone_types' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Associates nodepool availability zones with zone types (e.g. wavelength, local). +func (o *AWSMachinePool) AvailabilityZoneTypes() map[string]string { + if o != nil && o.bitmap_&16 != 0 { + return o.availabilityZoneTypes + } + return nil +} + +// GetAvailabilityZoneTypes returns the value of the 'availability_zone_types' attribute and +// a flag indicating if the attribute has a value. +// +// Associates nodepool availability zones with zone types (e.g. wavelength, local). +func (o *AWSMachinePool) GetAvailabilityZoneTypes() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.availabilityZoneTypes + } + return +} + +// SpotMarketOptions returns the value of the 'spot_market_options' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Use spot instances on this machine pool to reduce cost. +func (o *AWSMachinePool) SpotMarketOptions() *AWSSpotMarketOptions { + if o != nil && o.bitmap_&32 != 0 { + return o.spotMarketOptions + } + return nil +} + +// GetSpotMarketOptions returns the value of the 'spot_market_options' attribute and +// a flag indicating if the attribute has a value. +// +// Use spot instances on this machine pool to reduce cost. +func (o *AWSMachinePool) GetSpotMarketOptions() (value *AWSSpotMarketOptions, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.spotMarketOptions + } + return +} + +// SubnetOutposts returns the value of the 'subnet_outposts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Associates nodepool subnets with AWS Outposts. +func (o *AWSMachinePool) SubnetOutposts() map[string]string { + if o != nil && o.bitmap_&64 != 0 { + return o.subnetOutposts + } + return nil +} + +// GetSubnetOutposts returns the value of the 'subnet_outposts' attribute and +// a flag indicating if the attribute has a value. +// +// Associates nodepool subnets with AWS Outposts. +func (o *AWSMachinePool) GetSubnetOutposts() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.subnetOutposts + } + return +} + +// Tags returns the value of the 'tags' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional keys and values that the machine pool provisioner will add as AWS tags to all AWS resources it creates. +// +// AWS tags must conform to the following standards: +// - Each resource may have a maximum of 25 tags +// - Tags beginning with "aws:" are reserved for system use and may not be set +// - Tag keys may be between 1 and 128 characters in length +// - Tag values may be between 0 and 256 characters in length +// - Tags may only contain letters, numbers, spaces, and the following characters: [_ . : / = + - @] +func (o *AWSMachinePool) Tags() map[string]string { + if o != nil && o.bitmap_&128 != 0 { + return o.tags + } + return nil +} + +// GetTags returns the value of the 'tags' attribute and +// a flag indicating if the attribute has a value. +// +// Optional keys and values that the machine pool provisioner will add as AWS tags to all AWS resources it creates. +// +// AWS tags must conform to the following standards: +// - Each resource may have a maximum of 25 tags +// - Tags beginning with "aws:" are reserved for system use and may not be set +// - Tag keys may be between 1 and 128 characters in length +// - Tag values may be between 0 and 256 characters in length +// - Tags may only contain letters, numbers, spaces, and the following characters: [_ . : / = + - @] +func (o *AWSMachinePool) GetTags() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.tags + } + return +} + +// AWSMachinePoolListKind is the name of the type used to represent list of objects of +// type 'AWS_machine_pool'. +const AWSMachinePoolListKind = "AWSMachinePoolList" + +// AWSMachinePoolListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_machine_pool'. +const AWSMachinePoolListLinkKind = "AWSMachinePoolListLink" + +// AWSMachinePoolNilKind is the name of the type used to nil lists of objects of +// type 'AWS_machine_pool'. +const AWSMachinePoolListNilKind = "AWSMachinePoolListNil" + +// AWSMachinePoolList is a list of values of the 'AWS_machine_pool' type. +type AWSMachinePoolList struct { + href string + link bool + items []*AWSMachinePool +} + +// Kind returns the name of the type of the object. +func (l *AWSMachinePoolList) Kind() string { + if l == nil { + return AWSMachinePoolListNilKind + } + if l.link { + return AWSMachinePoolListLinkKind + } + return AWSMachinePoolListKind +} + +// Link returns true iif this is a link. +func (l *AWSMachinePoolList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AWSMachinePoolList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AWSMachinePoolList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AWSMachinePoolList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSMachinePoolList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSMachinePoolList) Get(i int) *AWSMachinePool { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSMachinePoolList) Slice() []*AWSMachinePool { + var slice []*AWSMachinePool + if l == nil { + slice = make([]*AWSMachinePool, 0) + } else { + slice = make([]*AWSMachinePool, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSMachinePoolList) Each(f func(item *AWSMachinePool) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSMachinePoolList) Range(f func(index int, item *AWSMachinePool) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_machine_pool_type_json.go b/clustersmgmt/v2alpha1/aws_machine_pool_type_json.go new file mode 100644 index 00000000..f6e602ee --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_machine_pool_type_json.go @@ -0,0 +1,257 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSMachinePool writes a value of the 'AWS_machine_pool' type to the given writer. +func MarshalAWSMachinePool(object *AWSMachinePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSMachinePool(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSMachinePool writes a value of the 'AWS_machine_pool' type to the given stream. +func writeAWSMachinePool(object *AWSMachinePool, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AWSMachinePoolLinkKind) + } else { + stream.WriteString(AWSMachinePoolKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.additionalSecurityGroupIds != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_security_group_ids") + writeStringList(object.additionalSecurityGroupIds, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.availabilityZoneTypes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zone_types") + if object.availabilityZoneTypes != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.availabilityZoneTypes)) + i := 0 + for key := range object.availabilityZoneTypes { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.availabilityZoneTypes[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&32 != 0 && object.spotMarketOptions != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("spot_market_options") + writeAWSSpotMarketOptions(object.spotMarketOptions, stream) + count++ + } + present_ = object.bitmap_&64 != 0 && object.subnetOutposts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnet_outposts") + if object.subnetOutposts != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.subnetOutposts)) + i := 0 + for key := range object.subnetOutposts { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.subnetOutposts[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&128 != 0 && object.tags != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tags") + if object.tags != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.tags)) + i := 0 + for key := range object.tags { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.tags[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSMachinePool reads a value of the 'AWS_machine_pool' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSMachinePool(source interface{}) (object *AWSMachinePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSMachinePool(iterator) + err = iterator.Error + return +} + +// readAWSMachinePool reads a value of the 'AWS_machine_pool' type from the given iterator. +func readAWSMachinePool(iterator *jsoniter.Iterator) *AWSMachinePool { + object := &AWSMachinePool{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AWSMachinePoolLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "additional_security_group_ids": + value := readStringList(iterator) + object.additionalSecurityGroupIds = value + object.bitmap_ |= 8 + case "availability_zone_types": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.availabilityZoneTypes = value + object.bitmap_ |= 16 + case "spot_market_options": + value := readAWSSpotMarketOptions(iterator) + object.spotMarketOptions = value + object.bitmap_ |= 32 + case "subnet_outposts": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.subnetOutposts = value + object.bitmap_ |= 64 + case "tags": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.tags = value + object.bitmap_ |= 128 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_node_pool_builder.go b/clustersmgmt/v2alpha1/aws_node_pool_builder.go new file mode 100644 index 00000000..fcbf74fa --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_node_pool_builder.go @@ -0,0 +1,208 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSNodePoolBuilder contains the data and logic needed to build 'AWS_node_pool' objects. +// +// Representation of aws node pool specific parameters. +type AWSNodePoolBuilder struct { + bitmap_ uint32 + id string + href string + additionalSecurityGroupIds []string + availabilityZoneTypes map[string]string + ec2MetadataHttpTokens Ec2MetadataHttpTokens + instanceProfile string + instanceType string + subnetOutposts map[string]string + tags map[string]string +} + +// NewAWSNodePool creates a new builder of 'AWS_node_pool' objects. +func NewAWSNodePool() *AWSNodePoolBuilder { + return &AWSNodePoolBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AWSNodePoolBuilder) Link(value bool) *AWSNodePoolBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AWSNodePoolBuilder) ID(value string) *AWSNodePoolBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AWSNodePoolBuilder) HREF(value string) *AWSNodePoolBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSNodePoolBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AdditionalSecurityGroupIds sets the value of the 'additional_security_group_ids' attribute to the given values. +func (b *AWSNodePoolBuilder) AdditionalSecurityGroupIds(values ...string) *AWSNodePoolBuilder { + b.additionalSecurityGroupIds = make([]string, len(values)) + copy(b.additionalSecurityGroupIds, values) + b.bitmap_ |= 8 + return b +} + +// AvailabilityZoneTypes sets the value of the 'availability_zone_types' attribute to the given value. +func (b *AWSNodePoolBuilder) AvailabilityZoneTypes(value map[string]string) *AWSNodePoolBuilder { + b.availabilityZoneTypes = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Ec2MetadataHttpTokens sets the value of the 'ec_2_metadata_http_tokens' attribute to the given value. +// +// Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances +func (b *AWSNodePoolBuilder) Ec2MetadataHttpTokens(value Ec2MetadataHttpTokens) *AWSNodePoolBuilder { + b.ec2MetadataHttpTokens = value + b.bitmap_ |= 32 + return b +} + +// InstanceProfile sets the value of the 'instance_profile' attribute to the given value. +func (b *AWSNodePoolBuilder) InstanceProfile(value string) *AWSNodePoolBuilder { + b.instanceProfile = value + b.bitmap_ |= 64 + return b +} + +// InstanceType sets the value of the 'instance_type' attribute to the given value. +func (b *AWSNodePoolBuilder) InstanceType(value string) *AWSNodePoolBuilder { + b.instanceType = value + b.bitmap_ |= 128 + return b +} + +// SubnetOutposts sets the value of the 'subnet_outposts' attribute to the given value. +func (b *AWSNodePoolBuilder) SubnetOutposts(value map[string]string) *AWSNodePoolBuilder { + b.subnetOutposts = value + if value != nil { + b.bitmap_ |= 256 + } else { + b.bitmap_ &^= 256 + } + return b +} + +// Tags sets the value of the 'tags' attribute to the given value. +func (b *AWSNodePoolBuilder) Tags(value map[string]string) *AWSNodePoolBuilder { + b.tags = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSNodePoolBuilder) Copy(object *AWSNodePool) *AWSNodePoolBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.additionalSecurityGroupIds != nil { + b.additionalSecurityGroupIds = make([]string, len(object.additionalSecurityGroupIds)) + copy(b.additionalSecurityGroupIds, object.additionalSecurityGroupIds) + } else { + b.additionalSecurityGroupIds = nil + } + if len(object.availabilityZoneTypes) > 0 { + b.availabilityZoneTypes = map[string]string{} + for k, v := range object.availabilityZoneTypes { + b.availabilityZoneTypes[k] = v + } + } else { + b.availabilityZoneTypes = nil + } + b.ec2MetadataHttpTokens = object.ec2MetadataHttpTokens + b.instanceProfile = object.instanceProfile + b.instanceType = object.instanceType + if len(object.subnetOutposts) > 0 { + b.subnetOutposts = map[string]string{} + for k, v := range object.subnetOutposts { + b.subnetOutposts[k] = v + } + } else { + b.subnetOutposts = nil + } + if len(object.tags) > 0 { + b.tags = map[string]string{} + for k, v := range object.tags { + b.tags[k] = v + } + } else { + b.tags = nil + } + return b +} + +// Build creates a 'AWS_node_pool' object using the configuration stored in the builder. +func (b *AWSNodePoolBuilder) Build() (object *AWSNodePool, err error) { + object = new(AWSNodePool) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.additionalSecurityGroupIds != nil { + object.additionalSecurityGroupIds = make([]string, len(b.additionalSecurityGroupIds)) + copy(object.additionalSecurityGroupIds, b.additionalSecurityGroupIds) + } + if b.availabilityZoneTypes != nil { + object.availabilityZoneTypes = make(map[string]string) + for k, v := range b.availabilityZoneTypes { + object.availabilityZoneTypes[k] = v + } + } + object.ec2MetadataHttpTokens = b.ec2MetadataHttpTokens + object.instanceProfile = b.instanceProfile + object.instanceType = b.instanceType + if b.subnetOutposts != nil { + object.subnetOutposts = make(map[string]string) + for k, v := range b.subnetOutposts { + object.subnetOutposts[k] = v + } + } + if b.tags != nil { + object.tags = make(map[string]string) + for k, v := range b.tags { + object.tags[k] = v + } + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_node_pool_list_builder.go b/clustersmgmt/v2alpha1/aws_node_pool_list_builder.go new file mode 100644 index 00000000..0a0ecde7 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_node_pool_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSNodePoolListBuilder contains the data and logic needed to build +// 'AWS_node_pool' objects. +type AWSNodePoolListBuilder struct { + items []*AWSNodePoolBuilder +} + +// NewAWSNodePoolList creates a new builder of 'AWS_node_pool' objects. +func NewAWSNodePoolList() *AWSNodePoolListBuilder { + return new(AWSNodePoolListBuilder) +} + +// Items sets the items of the list. +func (b *AWSNodePoolListBuilder) Items(values ...*AWSNodePoolBuilder) *AWSNodePoolListBuilder { + b.items = make([]*AWSNodePoolBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSNodePoolListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSNodePoolListBuilder) Copy(list *AWSNodePoolList) *AWSNodePoolListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSNodePoolBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSNodePool().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_node_pool' objects using the +// configuration stored in the builder. +func (b *AWSNodePoolListBuilder) Build() (list *AWSNodePoolList, err error) { + items := make([]*AWSNodePool, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSNodePoolList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_node_pool_list_type_json.go b/clustersmgmt/v2alpha1/aws_node_pool_list_type_json.go new file mode 100644 index 00000000..bd65cfed --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_node_pool_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSNodePoolList writes a list of values of the 'AWS_node_pool' type to +// the given writer. +func MarshalAWSNodePoolList(list []*AWSNodePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSNodePoolList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSNodePoolList writes a list of value of the 'AWS_node_pool' type to +// the given stream. +func writeAWSNodePoolList(list []*AWSNodePool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSNodePool(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSNodePoolList reads a list of values of the 'AWS_node_pool' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSNodePoolList(source interface{}) (items []*AWSNodePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSNodePoolList(iterator) + err = iterator.Error + return +} + +// readAWSNodePoolList reads list of values of the ”AWS_node_pool' type from +// the given iterator. +func readAWSNodePoolList(iterator *jsoniter.Iterator) []*AWSNodePool { + list := []*AWSNodePool{} + for iterator.ReadArray() { + item := readAWSNodePool(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_node_pool_type.go b/clustersmgmt/v2alpha1/aws_node_pool_type.go new file mode 100644 index 00000000..a79c6800 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_node_pool_type.go @@ -0,0 +1,400 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSNodePoolKind is the name of the type used to represent objects +// of type 'AWS_node_pool'. +const AWSNodePoolKind = "AWSNodePool" + +// AWSNodePoolLinkKind is the name of the type used to represent links +// to objects of type 'AWS_node_pool'. +const AWSNodePoolLinkKind = "AWSNodePoolLink" + +// AWSNodePoolNilKind is the name of the type used to nil references +// to objects of type 'AWS_node_pool'. +const AWSNodePoolNilKind = "AWSNodePoolNil" + +// AWSNodePool represents the values of the 'AWS_node_pool' type. +// +// Representation of aws node pool specific parameters. +type AWSNodePool struct { + bitmap_ uint32 + id string + href string + additionalSecurityGroupIds []string + availabilityZoneTypes map[string]string + ec2MetadataHttpTokens Ec2MetadataHttpTokens + instanceProfile string + instanceType string + subnetOutposts map[string]string + tags map[string]string +} + +// Kind returns the name of the type of the object. +func (o *AWSNodePool) Kind() string { + if o == nil { + return AWSNodePoolNilKind + } + if o.bitmap_&1 != 0 { + return AWSNodePoolLinkKind + } + return AWSNodePoolKind +} + +// Link returns true iif this is a link. +func (o *AWSNodePool) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AWSNodePool) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AWSNodePool) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AWSNodePool) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AWSNodePool) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSNodePool) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AdditionalSecurityGroupIds returns the value of the 'additional_security_group_ids' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional AWS Security Groups to be added node pool. +func (o *AWSNodePool) AdditionalSecurityGroupIds() []string { + if o != nil && o.bitmap_&8 != 0 { + return o.additionalSecurityGroupIds + } + return nil +} + +// GetAdditionalSecurityGroupIds returns the value of the 'additional_security_group_ids' attribute and +// a flag indicating if the attribute has a value. +// +// Additional AWS Security Groups to be added node pool. +func (o *AWSNodePool) GetAdditionalSecurityGroupIds() (value []string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.additionalSecurityGroupIds + } + return +} + +// AvailabilityZoneTypes returns the value of the 'availability_zone_types' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Associates nodepool availability zones with zone types (e.g. wavelength, local). +func (o *AWSNodePool) AvailabilityZoneTypes() map[string]string { + if o != nil && o.bitmap_&16 != 0 { + return o.availabilityZoneTypes + } + return nil +} + +// GetAvailabilityZoneTypes returns the value of the 'availability_zone_types' attribute and +// a flag indicating if the attribute has a value. +// +// Associates nodepool availability zones with zone types (e.g. wavelength, local). +func (o *AWSNodePool) GetAvailabilityZoneTypes() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.availabilityZoneTypes + } + return +} + +// Ec2MetadataHttpTokens returns the value of the 'ec_2_metadata_http_tokens' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances +func (o *AWSNodePool) Ec2MetadataHttpTokens() Ec2MetadataHttpTokens { + if o != nil && o.bitmap_&32 != 0 { + return o.ec2MetadataHttpTokens + } + return Ec2MetadataHttpTokens("") +} + +// GetEc2MetadataHttpTokens returns the value of the 'ec_2_metadata_http_tokens' attribute and +// a flag indicating if the attribute has a value. +// +// Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances +func (o *AWSNodePool) GetEc2MetadataHttpTokens() (value Ec2MetadataHttpTokens, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.ec2MetadataHttpTokens + } + return +} + +// InstanceProfile returns the value of the 'instance_profile' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// InstanceProfile is the AWS EC2 instance profile, which is a container for an IAM role that the EC2 instance uses. +func (o *AWSNodePool) InstanceProfile() string { + if o != nil && o.bitmap_&64 != 0 { + return o.instanceProfile + } + return "" +} + +// GetInstanceProfile returns the value of the 'instance_profile' attribute and +// a flag indicating if the attribute has a value. +// +// InstanceProfile is the AWS EC2 instance profile, which is a container for an IAM role that the EC2 instance uses. +func (o *AWSNodePool) GetInstanceProfile() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.instanceProfile + } + return +} + +// InstanceType returns the value of the 'instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// InstanceType is an ec2 instance type for node instances (e.g. m5.large). +func (o *AWSNodePool) InstanceType() string { + if o != nil && o.bitmap_&128 != 0 { + return o.instanceType + } + return "" +} + +// GetInstanceType returns the value of the 'instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// InstanceType is an ec2 instance type for node instances (e.g. m5.large). +func (o *AWSNodePool) GetInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.instanceType + } + return +} + +// SubnetOutposts returns the value of the 'subnet_outposts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Associates nodepool subnets with AWS Outposts. +func (o *AWSNodePool) SubnetOutposts() map[string]string { + if o != nil && o.bitmap_&256 != 0 { + return o.subnetOutposts + } + return nil +} + +// GetSubnetOutposts returns the value of the 'subnet_outposts' attribute and +// a flag indicating if the attribute has a value. +// +// Associates nodepool subnets with AWS Outposts. +func (o *AWSNodePool) GetSubnetOutposts() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.subnetOutposts + } + return +} + +// Tags returns the value of the 'tags' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional keys and values that the installer will add as tags to all AWS resources it creates. +// +// AWS tags must conform to the following standards: +// - Each resource may have a maximum of 25 tags +// - Tags beginning with "aws:" are reserved for system use and may not be set +// - Tag keys may be between 1 and 128 characters in length +// - Tag values may be between 0 and 256 characters in length +// - Tags may only contain letters, numbers, spaces, and the following characters: [_ . : / = + - @] +func (o *AWSNodePool) Tags() map[string]string { + if o != nil && o.bitmap_&512 != 0 { + return o.tags + } + return nil +} + +// GetTags returns the value of the 'tags' attribute and +// a flag indicating if the attribute has a value. +// +// Optional keys and values that the installer will add as tags to all AWS resources it creates. +// +// AWS tags must conform to the following standards: +// - Each resource may have a maximum of 25 tags +// - Tags beginning with "aws:" are reserved for system use and may not be set +// - Tag keys may be between 1 and 128 characters in length +// - Tag values may be between 0 and 256 characters in length +// - Tags may only contain letters, numbers, spaces, and the following characters: [_ . : / = + - @] +func (o *AWSNodePool) GetTags() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.tags + } + return +} + +// AWSNodePoolListKind is the name of the type used to represent list of objects of +// type 'AWS_node_pool'. +const AWSNodePoolListKind = "AWSNodePoolList" + +// AWSNodePoolListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_node_pool'. +const AWSNodePoolListLinkKind = "AWSNodePoolListLink" + +// AWSNodePoolNilKind is the name of the type used to nil lists of objects of +// type 'AWS_node_pool'. +const AWSNodePoolListNilKind = "AWSNodePoolListNil" + +// AWSNodePoolList is a list of values of the 'AWS_node_pool' type. +type AWSNodePoolList struct { + href string + link bool + items []*AWSNodePool +} + +// Kind returns the name of the type of the object. +func (l *AWSNodePoolList) Kind() string { + if l == nil { + return AWSNodePoolListNilKind + } + if l.link { + return AWSNodePoolListLinkKind + } + return AWSNodePoolListKind +} + +// Link returns true iif this is a link. +func (l *AWSNodePoolList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AWSNodePoolList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AWSNodePoolList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AWSNodePoolList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSNodePoolList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSNodePoolList) Get(i int) *AWSNodePool { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSNodePoolList) Slice() []*AWSNodePool { + var slice []*AWSNodePool + if l == nil { + slice = make([]*AWSNodePool, 0) + } else { + slice = make([]*AWSNodePool, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSNodePoolList) Each(f func(item *AWSNodePool) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSNodePoolList) Range(f func(index int, item *AWSNodePool) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_node_pool_type_json.go b/clustersmgmt/v2alpha1/aws_node_pool_type_json.go new file mode 100644 index 00000000..418c0a2f --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_node_pool_type_json.go @@ -0,0 +1,284 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSNodePool writes a value of the 'AWS_node_pool' type to the given writer. +func MarshalAWSNodePool(object *AWSNodePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSNodePool(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSNodePool writes a value of the 'AWS_node_pool' type to the given stream. +func writeAWSNodePool(object *AWSNodePool, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AWSNodePoolLinkKind) + } else { + stream.WriteString(AWSNodePoolKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.additionalSecurityGroupIds != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_security_group_ids") + writeStringList(object.additionalSecurityGroupIds, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.availabilityZoneTypes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zone_types") + if object.availabilityZoneTypes != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.availabilityZoneTypes)) + i := 0 + for key := range object.availabilityZoneTypes { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.availabilityZoneTypes[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ec2_metadata_http_tokens") + stream.WriteString(string(object.ec2MetadataHttpTokens)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("instance_profile") + stream.WriteString(object.instanceProfile) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("instance_type") + stream.WriteString(object.instanceType) + count++ + } + present_ = object.bitmap_&256 != 0 && object.subnetOutposts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnet_outposts") + if object.subnetOutposts != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.subnetOutposts)) + i := 0 + for key := range object.subnetOutposts { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.subnetOutposts[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&512 != 0 && object.tags != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tags") + if object.tags != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.tags)) + i := 0 + for key := range object.tags { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.tags[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSNodePool reads a value of the 'AWS_node_pool' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSNodePool(source interface{}) (object *AWSNodePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSNodePool(iterator) + err = iterator.Error + return +} + +// readAWSNodePool reads a value of the 'AWS_node_pool' type from the given iterator. +func readAWSNodePool(iterator *jsoniter.Iterator) *AWSNodePool { + object := &AWSNodePool{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AWSNodePoolLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "additional_security_group_ids": + value := readStringList(iterator) + object.additionalSecurityGroupIds = value + object.bitmap_ |= 8 + case "availability_zone_types": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.availabilityZoneTypes = value + object.bitmap_ |= 16 + case "ec2_metadata_http_tokens": + text := iterator.ReadString() + value := Ec2MetadataHttpTokens(text) + object.ec2MetadataHttpTokens = value + object.bitmap_ |= 32 + case "instance_profile": + value := iterator.ReadString() + object.instanceProfile = value + object.bitmap_ |= 64 + case "instance_type": + value := iterator.ReadString() + object.instanceType = value + object.bitmap_ |= 128 + case "subnet_outposts": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.subnetOutposts = value + object.bitmap_ |= 256 + case "tags": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.tags = value + object.bitmap_ |= 512 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_region_machine_types_inquiry_client.go b/clustersmgmt/v2alpha1/aws_region_machine_types_inquiry_client.go new file mode 100644 index 00000000..cff045e4 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_region_machine_types_inquiry_client.go @@ -0,0 +1,304 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSRegionMachineTypesInquiryClient is the client of the 'AWS_region_machine_types_inquiry' resource. +// +// Manages machine types in region inquiry. +type AWSRegionMachineTypesInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewAWSRegionMachineTypesInquiryClient creates a new client for the 'AWS_region_machine_types_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSRegionMachineTypesInquiryClient(transport http.RoundTripper, path string) *AWSRegionMachineTypesInquiryClient { + return &AWSRegionMachineTypesInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of machine types in the provided region. +func (c *AWSRegionMachineTypesInquiryClient) Search() *AWSRegionMachineTypesInquirySearchRequest { + return &AWSRegionMachineTypesInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSRegionMachineTypesInquirySearchRequest is the request for the 'search' method. +type AWSRegionMachineTypesInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *AWSRegionMachineTypesInquirySearchRequest) Parameter(name string, value interface{}) *AWSRegionMachineTypesInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSRegionMachineTypesInquirySearchRequest) Header(name string, value interface{}) *AWSRegionMachineTypesInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSRegionMachineTypesInquirySearchRequest) Impersonate(user string) *AWSRegionMachineTypesInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry +func (r *AWSRegionMachineTypesInquirySearchRequest) Body(value *CloudProviderData) *AWSRegionMachineTypesInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSRegionMachineTypesInquirySearchRequest) Page(value int) *AWSRegionMachineTypesInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSRegionMachineTypesInquirySearchRequest) Size(value int) *AWSRegionMachineTypesInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSRegionMachineTypesInquirySearchRequest) Send() (result *AWSRegionMachineTypesInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSRegionMachineTypesInquirySearchRequest) SendContext(ctx context.Context) (result *AWSRegionMachineTypesInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAWSRegionMachineTypesInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSRegionMachineTypesInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSRegionMachineTypesInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSRegionMachineTypesInquirySearchResponse is the response for the 'search' method. +type AWSRegionMachineTypesInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + items *MachineTypeList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AWSRegionMachineTypesInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSRegionMachineTypesInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSRegionMachineTypesInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of machine types. +func (r *AWSRegionMachineTypesInquirySearchResponse) Items() *MachineTypeList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of machine types. +func (r *AWSRegionMachineTypesInquirySearchResponse) GetItems() (value *MachineTypeList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSRegionMachineTypesInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSRegionMachineTypesInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSRegionMachineTypesInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSRegionMachineTypesInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSRegionMachineTypesInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSRegionMachineTypesInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_region_machine_types_inquiry_resource_json.go b/clustersmgmt/v2alpha1/aws_region_machine_types_inquiry_resource_json.go new file mode 100644 index 00000000..a71a03fe --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_region_machine_types_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAWSRegionMachineTypesInquirySearchRequest(request *AWSRegionMachineTypesInquirySearchRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readAWSRegionMachineTypesInquirySearchResponse(response *AWSRegionMachineTypesInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readMachineTypeList(iterator) + response.items = &MachineTypeList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/aws_resource_json.go b/clustersmgmt/v2alpha1/aws_resource_json.go new file mode 100644 index 00000000..45f0dd4e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_resource_json.go @@ -0,0 +1,20 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 diff --git a/clustersmgmt/v2alpha1/aws_spot_market_options_builder.go b/clustersmgmt/v2alpha1/aws_spot_market_options_builder.go new file mode 100644 index 00000000..fb3b2a7e --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_spot_market_options_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSpotMarketOptionsBuilder contains the data and logic needed to build 'AWS_spot_market_options' objects. +// +// Spot market options for AWS machine pool. +type AWSSpotMarketOptionsBuilder struct { + bitmap_ uint32 + id string + href string + maxPrice float64 +} + +// NewAWSSpotMarketOptions creates a new builder of 'AWS_spot_market_options' objects. +func NewAWSSpotMarketOptions() *AWSSpotMarketOptionsBuilder { + return &AWSSpotMarketOptionsBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *AWSSpotMarketOptionsBuilder) Link(value bool) *AWSSpotMarketOptionsBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *AWSSpotMarketOptionsBuilder) ID(value string) *AWSSpotMarketOptionsBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *AWSSpotMarketOptionsBuilder) HREF(value string) *AWSSpotMarketOptionsBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSSpotMarketOptionsBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// MaxPrice sets the value of the 'max_price' attribute to the given value. +func (b *AWSSpotMarketOptionsBuilder) MaxPrice(value float64) *AWSSpotMarketOptionsBuilder { + b.maxPrice = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSSpotMarketOptionsBuilder) Copy(object *AWSSpotMarketOptions) *AWSSpotMarketOptionsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.maxPrice = object.maxPrice + return b +} + +// Build creates a 'AWS_spot_market_options' object using the configuration stored in the builder. +func (b *AWSSpotMarketOptionsBuilder) Build() (object *AWSSpotMarketOptions, err error) { + object = new(AWSSpotMarketOptions) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.maxPrice = b.maxPrice + return +} diff --git a/clustersmgmt/v2alpha1/aws_spot_market_options_list_builder.go b/clustersmgmt/v2alpha1/aws_spot_market_options_list_builder.go new file mode 100644 index 00000000..e8f17119 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_spot_market_options_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSpotMarketOptionsListBuilder contains the data and logic needed to build +// 'AWS_spot_market_options' objects. +type AWSSpotMarketOptionsListBuilder struct { + items []*AWSSpotMarketOptionsBuilder +} + +// NewAWSSpotMarketOptionsList creates a new builder of 'AWS_spot_market_options' objects. +func NewAWSSpotMarketOptionsList() *AWSSpotMarketOptionsListBuilder { + return new(AWSSpotMarketOptionsListBuilder) +} + +// Items sets the items of the list. +func (b *AWSSpotMarketOptionsListBuilder) Items(values ...*AWSSpotMarketOptionsBuilder) *AWSSpotMarketOptionsListBuilder { + b.items = make([]*AWSSpotMarketOptionsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSSpotMarketOptionsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSSpotMarketOptionsListBuilder) Copy(list *AWSSpotMarketOptionsList) *AWSSpotMarketOptionsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSSpotMarketOptionsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSSpotMarketOptions().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_spot_market_options' objects using the +// configuration stored in the builder. +func (b *AWSSpotMarketOptionsListBuilder) Build() (list *AWSSpotMarketOptionsList, err error) { + items := make([]*AWSSpotMarketOptions, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSSpotMarketOptionsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_spot_market_options_list_type_json.go b/clustersmgmt/v2alpha1/aws_spot_market_options_list_type_json.go new file mode 100644 index 00000000..598caa20 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_spot_market_options_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSpotMarketOptionsList writes a list of values of the 'AWS_spot_market_options' type to +// the given writer. +func MarshalAWSSpotMarketOptionsList(list []*AWSSpotMarketOptions, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSpotMarketOptionsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSpotMarketOptionsList writes a list of value of the 'AWS_spot_market_options' type to +// the given stream. +func writeAWSSpotMarketOptionsList(list []*AWSSpotMarketOptions, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSSpotMarketOptions(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSSpotMarketOptionsList reads a list of values of the 'AWS_spot_market_options' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSSpotMarketOptionsList(source interface{}) (items []*AWSSpotMarketOptions, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSSpotMarketOptionsList(iterator) + err = iterator.Error + return +} + +// readAWSSpotMarketOptionsList reads list of values of the ”AWS_spot_market_options' type from +// the given iterator. +func readAWSSpotMarketOptionsList(iterator *jsoniter.Iterator) []*AWSSpotMarketOptions { + list := []*AWSSpotMarketOptions{} + for iterator.ReadArray() { + item := readAWSSpotMarketOptions(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_spot_market_options_type.go b/clustersmgmt/v2alpha1/aws_spot_market_options_type.go new file mode 100644 index 00000000..7d43441a --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_spot_market_options_type.go @@ -0,0 +1,244 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSpotMarketOptionsKind is the name of the type used to represent objects +// of type 'AWS_spot_market_options'. +const AWSSpotMarketOptionsKind = "AWSSpotMarketOptions" + +// AWSSpotMarketOptionsLinkKind is the name of the type used to represent links +// to objects of type 'AWS_spot_market_options'. +const AWSSpotMarketOptionsLinkKind = "AWSSpotMarketOptionsLink" + +// AWSSpotMarketOptionsNilKind is the name of the type used to nil references +// to objects of type 'AWS_spot_market_options'. +const AWSSpotMarketOptionsNilKind = "AWSSpotMarketOptionsNil" + +// AWSSpotMarketOptions represents the values of the 'AWS_spot_market_options' type. +// +// Spot market options for AWS machine pool. +type AWSSpotMarketOptions struct { + bitmap_ uint32 + id string + href string + maxPrice float64 +} + +// Kind returns the name of the type of the object. +func (o *AWSSpotMarketOptions) Kind() string { + if o == nil { + return AWSSpotMarketOptionsNilKind + } + if o.bitmap_&1 != 0 { + return AWSSpotMarketOptionsLinkKind + } + return AWSSpotMarketOptionsKind +} + +// Link returns true iif this is a link. +func (o *AWSSpotMarketOptions) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *AWSSpotMarketOptions) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *AWSSpotMarketOptions) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *AWSSpotMarketOptions) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *AWSSpotMarketOptions) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSSpotMarketOptions) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// MaxPrice returns the value of the 'max_price' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The max price for spot instance. Optional. +// If not set, use the on-demand price. +func (o *AWSSpotMarketOptions) MaxPrice() float64 { + if o != nil && o.bitmap_&8 != 0 { + return o.maxPrice + } + return 0.0 +} + +// GetMaxPrice returns the value of the 'max_price' attribute and +// a flag indicating if the attribute has a value. +// +// The max price for spot instance. Optional. +// If not set, use the on-demand price. +func (o *AWSSpotMarketOptions) GetMaxPrice() (value float64, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.maxPrice + } + return +} + +// AWSSpotMarketOptionsListKind is the name of the type used to represent list of objects of +// type 'AWS_spot_market_options'. +const AWSSpotMarketOptionsListKind = "AWSSpotMarketOptionsList" + +// AWSSpotMarketOptionsListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_spot_market_options'. +const AWSSpotMarketOptionsListLinkKind = "AWSSpotMarketOptionsListLink" + +// AWSSpotMarketOptionsNilKind is the name of the type used to nil lists of objects of +// type 'AWS_spot_market_options'. +const AWSSpotMarketOptionsListNilKind = "AWSSpotMarketOptionsListNil" + +// AWSSpotMarketOptionsList is a list of values of the 'AWS_spot_market_options' type. +type AWSSpotMarketOptionsList struct { + href string + link bool + items []*AWSSpotMarketOptions +} + +// Kind returns the name of the type of the object. +func (l *AWSSpotMarketOptionsList) Kind() string { + if l == nil { + return AWSSpotMarketOptionsListNilKind + } + if l.link { + return AWSSpotMarketOptionsListLinkKind + } + return AWSSpotMarketOptionsListKind +} + +// Link returns true iif this is a link. +func (l *AWSSpotMarketOptionsList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *AWSSpotMarketOptionsList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *AWSSpotMarketOptionsList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *AWSSpotMarketOptionsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSSpotMarketOptionsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSSpotMarketOptionsList) Get(i int) *AWSSpotMarketOptions { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSSpotMarketOptionsList) Slice() []*AWSSpotMarketOptions { + var slice []*AWSSpotMarketOptions + if l == nil { + slice = make([]*AWSSpotMarketOptions, 0) + } else { + slice = make([]*AWSSpotMarketOptions, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSSpotMarketOptionsList) Each(f func(item *AWSSpotMarketOptions) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSSpotMarketOptionsList) Range(f func(index int, item *AWSSpotMarketOptions) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_spot_market_options_type_json.go b/clustersmgmt/v2alpha1/aws_spot_market_options_type_json.go new file mode 100644 index 00000000..a2845a14 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_spot_market_options_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSpotMarketOptions writes a value of the 'AWS_spot_market_options' type to the given writer. +func MarshalAWSSpotMarketOptions(object *AWSSpotMarketOptions, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSpotMarketOptions(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSpotMarketOptions writes a value of the 'AWS_spot_market_options' type to the given stream. +func writeAWSSpotMarketOptions(object *AWSSpotMarketOptions, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(AWSSpotMarketOptionsLinkKind) + } else { + stream.WriteString(AWSSpotMarketOptionsKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_price") + stream.WriteFloat64(object.maxPrice) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSSpotMarketOptions reads a value of the 'AWS_spot_market_options' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSSpotMarketOptions(source interface{}) (object *AWSSpotMarketOptions, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSSpotMarketOptions(iterator) + err = iterator.Error + return +} + +// readAWSSpotMarketOptions reads a value of the 'AWS_spot_market_options' type from the given iterator. +func readAWSSpotMarketOptions(iterator *jsoniter.Iterator) *AWSSpotMarketOptions { + object := &AWSSpotMarketOptions{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == AWSSpotMarketOptionsLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "max_price": + value := iterator.ReadFloat64() + object.maxPrice = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_type.go b/clustersmgmt/v2alpha1/aws_type.go new file mode 100644 index 00000000..34bb68fd --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_type.go @@ -0,0 +1,574 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWS represents the values of the 'AWS' type. +// +// _Amazon Web Services_ specific settings of a cluster. +type AWS struct { + bitmap_ uint32 + kmsKeyArn string + sts *STS + accessKeyID string + accountID string + additionalAllowedPrincipals []string + additionalComputeSecurityGroupIds []string + additionalControlPlaneSecurityGroupIds []string + additionalInfraSecurityGroupIds []string + auditLog *AuditLog + billingAccountID string + ec2MetadataHttpTokens Ec2MetadataHttpTokens + etcdEncryption *AwsEtcdEncryption + privateHostedZoneID string + privateHostedZoneRoleARN string + privateLinkConfiguration *PrivateLinkClusterConfiguration + secretAccessKey string + subnetIDs []string + tags map[string]string + privateLink bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWS) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// KMSKeyArn returns the value of the 'KMS_key_arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Customer Managed Key to encrypt EBS Volume +func (o *AWS) KMSKeyArn() string { + if o != nil && o.bitmap_&1 != 0 { + return o.kmsKeyArn + } + return "" +} + +// GetKMSKeyArn returns the value of the 'KMS_key_arn' attribute and +// a flag indicating if the attribute has a value. +// +// Customer Managed Key to encrypt EBS Volume +func (o *AWS) GetKMSKeyArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.kmsKeyArn + } + return +} + +// STS returns the value of the 'STS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the necessary attributes to support role-based authentication on AWS. +func (o *AWS) STS() *STS { + if o != nil && o.bitmap_&2 != 0 { + return o.sts + } + return nil +} + +// GetSTS returns the value of the 'STS' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the necessary attributes to support role-based authentication on AWS. +func (o *AWS) GetSTS() (value *STS, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.sts + } + return +} + +// AccessKeyID returns the value of the 'access_key_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS access key identifier. +func (o *AWS) AccessKeyID() string { + if o != nil && o.bitmap_&4 != 0 { + return o.accessKeyID + } + return "" +} + +// GetAccessKeyID returns the value of the 'access_key_ID' attribute and +// a flag indicating if the attribute has a value. +// +// AWS access key identifier. +func (o *AWS) GetAccessKeyID() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.accessKeyID + } + return +} + +// AccountID returns the value of the 'account_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS account identifier. +func (o *AWS) AccountID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.accountID + } + return "" +} + +// GetAccountID returns the value of the 'account_ID' attribute and +// a flag indicating if the attribute has a value. +// +// AWS account identifier. +func (o *AWS) GetAccountID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.accountID + } + return +} + +// AdditionalAllowedPrincipals returns the value of the 'additional_allowed_principals' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional allowed principal ARNs to be added to the hosted control plane's VPC Endpoint Service. +func (o *AWS) AdditionalAllowedPrincipals() []string { + if o != nil && o.bitmap_&16 != 0 { + return o.additionalAllowedPrincipals + } + return nil +} + +// GetAdditionalAllowedPrincipals returns the value of the 'additional_allowed_principals' attribute and +// a flag indicating if the attribute has a value. +// +// Additional allowed principal ARNs to be added to the hosted control plane's VPC Endpoint Service. +func (o *AWS) GetAdditionalAllowedPrincipals() (value []string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.additionalAllowedPrincipals + } + return +} + +// AdditionalComputeSecurityGroupIds returns the value of the 'additional_compute_security_group_ids' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional AWS Security Groups to be added to default worker (compute) machine pool. +func (o *AWS) AdditionalComputeSecurityGroupIds() []string { + if o != nil && o.bitmap_&32 != 0 { + return o.additionalComputeSecurityGroupIds + } + return nil +} + +// GetAdditionalComputeSecurityGroupIds returns the value of the 'additional_compute_security_group_ids' attribute and +// a flag indicating if the attribute has a value. +// +// Additional AWS Security Groups to be added to default worker (compute) machine pool. +func (o *AWS) GetAdditionalComputeSecurityGroupIds() (value []string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.additionalComputeSecurityGroupIds + } + return +} + +// AdditionalControlPlaneSecurityGroupIds returns the value of the 'additional_control_plane_security_group_ids' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional AWS Security Groups to be added to default control plane machine pool. +func (o *AWS) AdditionalControlPlaneSecurityGroupIds() []string { + if o != nil && o.bitmap_&64 != 0 { + return o.additionalControlPlaneSecurityGroupIds + } + return nil +} + +// GetAdditionalControlPlaneSecurityGroupIds returns the value of the 'additional_control_plane_security_group_ids' attribute and +// a flag indicating if the attribute has a value. +// +// Additional AWS Security Groups to be added to default control plane machine pool. +func (o *AWS) GetAdditionalControlPlaneSecurityGroupIds() (value []string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.additionalControlPlaneSecurityGroupIds + } + return +} + +// AdditionalInfraSecurityGroupIds returns the value of the 'additional_infra_security_group_ids' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional AWS Security Groups to be added to default infra machine pool. +func (o *AWS) AdditionalInfraSecurityGroupIds() []string { + if o != nil && o.bitmap_&128 != 0 { + return o.additionalInfraSecurityGroupIds + } + return nil +} + +// GetAdditionalInfraSecurityGroupIds returns the value of the 'additional_infra_security_group_ids' attribute and +// a flag indicating if the attribute has a value. +// +// Additional AWS Security Groups to be added to default infra machine pool. +func (o *AWS) GetAdditionalInfraSecurityGroupIds() (value []string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.additionalInfraSecurityGroupIds + } + return +} + +// AuditLog returns the value of the 'audit_log' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Audit log forwarding configuration +func (o *AWS) AuditLog() *AuditLog { + if o != nil && o.bitmap_&256 != 0 { + return o.auditLog + } + return nil +} + +// GetAuditLog returns the value of the 'audit_log' attribute and +// a flag indicating if the attribute has a value. +// +// Audit log forwarding configuration +func (o *AWS) GetAuditLog() (value *AuditLog, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.auditLog + } + return +} + +// BillingAccountID returns the value of the 'billing_account_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// BillingAccountID is the account used for billing subscriptions purchased via the marketplace +func (o *AWS) BillingAccountID() string { + if o != nil && o.bitmap_&512 != 0 { + return o.billingAccountID + } + return "" +} + +// GetBillingAccountID returns the value of the 'billing_account_ID' attribute and +// a flag indicating if the attribute has a value. +// +// BillingAccountID is the account used for billing subscriptions purchased via the marketplace +func (o *AWS) GetBillingAccountID() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.billingAccountID + } + return +} + +// Ec2MetadataHttpTokens returns the value of the 'ec_2_metadata_http_tokens' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances +func (o *AWS) Ec2MetadataHttpTokens() Ec2MetadataHttpTokens { + if o != nil && o.bitmap_&1024 != 0 { + return o.ec2MetadataHttpTokens + } + return Ec2MetadataHttpTokens("") +} + +// GetEc2MetadataHttpTokens returns the value of the 'ec_2_metadata_http_tokens' attribute and +// a flag indicating if the attribute has a value. +// +// Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances +func (o *AWS) GetEc2MetadataHttpTokens() (value Ec2MetadataHttpTokens, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.ec2MetadataHttpTokens + } + return +} + +// EtcdEncryption returns the value of the 'etcd_encryption' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Related etcd encryption configuration +func (o *AWS) EtcdEncryption() *AwsEtcdEncryption { + if o != nil && o.bitmap_&2048 != 0 { + return o.etcdEncryption + } + return nil +} + +// GetEtcdEncryption returns the value of the 'etcd_encryption' attribute and +// a flag indicating if the attribute has a value. +// +// Related etcd encryption configuration +func (o *AWS) GetEtcdEncryption() (value *AwsEtcdEncryption, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.etcdEncryption + } + return +} + +// PrivateHostedZoneID returns the value of the 'private_hosted_zone_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID of private hosted zone. +func (o *AWS) PrivateHostedZoneID() string { + if o != nil && o.bitmap_&4096 != 0 { + return o.privateHostedZoneID + } + return "" +} + +// GetPrivateHostedZoneID returns the value of the 'private_hosted_zone_ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID of private hosted zone. +func (o *AWS) GetPrivateHostedZoneID() (value string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.privateHostedZoneID + } + return +} + +// PrivateHostedZoneRoleARN returns the value of the 'private_hosted_zone_role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Role ARN for private hosted zone. +func (o *AWS) PrivateHostedZoneRoleARN() string { + if o != nil && o.bitmap_&8192 != 0 { + return o.privateHostedZoneRoleARN + } + return "" +} + +// GetPrivateHostedZoneRoleARN returns the value of the 'private_hosted_zone_role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// Role ARN for private hosted zone. +func (o *AWS) GetPrivateHostedZoneRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.privateHostedZoneRoleARN + } + return +} + +// PrivateLink returns the value of the 'private_link' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Sets cluster to be inaccessible externally. +func (o *AWS) PrivateLink() bool { + if o != nil && o.bitmap_&16384 != 0 { + return o.privateLink + } + return false +} + +// GetPrivateLink returns the value of the 'private_link' attribute and +// a flag indicating if the attribute has a value. +// +// Sets cluster to be inaccessible externally. +func (o *AWS) GetPrivateLink() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.privateLink + } + return +} + +// PrivateLinkConfiguration returns the value of the 'private_link_configuration' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Manages additional configuration for Private Links. +func (o *AWS) PrivateLinkConfiguration() *PrivateLinkClusterConfiguration { + if o != nil && o.bitmap_&32768 != 0 { + return o.privateLinkConfiguration + } + return nil +} + +// GetPrivateLinkConfiguration returns the value of the 'private_link_configuration' attribute and +// a flag indicating if the attribute has a value. +// +// Manages additional configuration for Private Links. +func (o *AWS) GetPrivateLinkConfiguration() (value *PrivateLinkClusterConfiguration, ok bool) { + ok = o != nil && o.bitmap_&32768 != 0 + if ok { + value = o.privateLinkConfiguration + } + return +} + +// SecretAccessKey returns the value of the 'secret_access_key' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS secret access key. +func (o *AWS) SecretAccessKey() string { + if o != nil && o.bitmap_&65536 != 0 { + return o.secretAccessKey + } + return "" +} + +// GetSecretAccessKey returns the value of the 'secret_access_key' attribute and +// a flag indicating if the attribute has a value. +// +// AWS secret access key. +func (o *AWS) GetSecretAccessKey() (value string, ok bool) { + ok = o != nil && o.bitmap_&65536 != 0 + if ok { + value = o.secretAccessKey + } + return +} + +// SubnetIDs returns the value of the 'subnet_IDs' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The subnet ids to be used when installing the cluster. +func (o *AWS) SubnetIDs() []string { + if o != nil && o.bitmap_&131072 != 0 { + return o.subnetIDs + } + return nil +} + +// GetSubnetIDs returns the value of the 'subnet_IDs' attribute and +// a flag indicating if the attribute has a value. +// +// The subnet ids to be used when installing the cluster. +func (o *AWS) GetSubnetIDs() (value []string, ok bool) { + ok = o != nil && o.bitmap_&131072 != 0 + if ok { + value = o.subnetIDs + } + return +} + +// Tags returns the value of the 'tags' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional keys and values that the installer will add as tags to all AWS resources it creates +func (o *AWS) Tags() map[string]string { + if o != nil && o.bitmap_&262144 != 0 { + return o.tags + } + return nil +} + +// GetTags returns the value of the 'tags' attribute and +// a flag indicating if the attribute has a value. +// +// Optional keys and values that the installer will add as tags to all AWS resources it creates +func (o *AWS) GetTags() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&262144 != 0 + if ok { + value = o.tags + } + return +} + +// AWSListKind is the name of the type used to represent list of objects of +// type 'AWS'. +const AWSListKind = "AWSList" + +// AWSListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS'. +const AWSListLinkKind = "AWSListLink" + +// AWSNilKind is the name of the type used to nil lists of objects of +// type 'AWS'. +const AWSListNilKind = "AWSListNil" + +// AWSList is a list of values of the 'AWS' type. +type AWSList struct { + href string + link bool + items []*AWS +} + +// Len returns the length of the list. +func (l *AWSList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSList) Get(i int) *AWS { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSList) Slice() []*AWS { + var slice []*AWS + if l == nil { + slice = make([]*AWS, 0) + } else { + slice = make([]*AWS, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSList) Each(f func(item *AWS) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSList) Range(f func(index int, item *AWS) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_type_json.go b/clustersmgmt/v2alpha1/aws_type_json.go new file mode 100644 index 00000000..d9d37034 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_type_json.go @@ -0,0 +1,350 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWS writes a value of the 'AWS' type to the given writer. +func MarshalAWS(object *AWS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWS(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWS writes a value of the 'AWS' type to the given stream. +func writeAWS(object *AWS, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kms_key_arn") + stream.WriteString(object.kmsKeyArn) + count++ + } + present_ = object.bitmap_&2 != 0 && object.sts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("sts") + writeSTS(object.sts, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("access_key_id") + stream.WriteString(object.accessKeyID) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("account_id") + stream.WriteString(object.accountID) + count++ + } + present_ = object.bitmap_&16 != 0 && object.additionalAllowedPrincipals != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_allowed_principals") + writeStringList(object.additionalAllowedPrincipals, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.additionalComputeSecurityGroupIds != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_compute_security_group_ids") + writeStringList(object.additionalComputeSecurityGroupIds, stream) + count++ + } + present_ = object.bitmap_&64 != 0 && object.additionalControlPlaneSecurityGroupIds != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_control_plane_security_group_ids") + writeStringList(object.additionalControlPlaneSecurityGroupIds, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.additionalInfraSecurityGroupIds != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_infra_security_group_ids") + writeStringList(object.additionalInfraSecurityGroupIds, stream) + count++ + } + present_ = object.bitmap_&256 != 0 && object.auditLog != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("audit_log") + writeAuditLog(object.auditLog, stream) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing_account_id") + stream.WriteString(object.billingAccountID) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ec2_metadata_http_tokens") + stream.WriteString(string(object.ec2MetadataHttpTokens)) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.etcdEncryption != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("etcd_encryption") + writeAwsEtcdEncryption(object.etcdEncryption, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("private_hosted_zone_id") + stream.WriteString(object.privateHostedZoneID) + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("private_hosted_zone_role_arn") + stream.WriteString(object.privateHostedZoneRoleARN) + count++ + } + present_ = object.bitmap_&16384 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("private_link") + stream.WriteBool(object.privateLink) + count++ + } + present_ = object.bitmap_&32768 != 0 && object.privateLinkConfiguration != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("private_link_configuration") + writePrivateLinkClusterConfiguration(object.privateLinkConfiguration, stream) + count++ + } + present_ = object.bitmap_&65536 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("secret_access_key") + stream.WriteString(object.secretAccessKey) + count++ + } + present_ = object.bitmap_&131072 != 0 && object.subnetIDs != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnet_ids") + writeStringList(object.subnetIDs, stream) + count++ + } + present_ = object.bitmap_&262144 != 0 && object.tags != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tags") + if object.tags != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.tags)) + i := 0 + for key := range object.tags { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.tags[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + } + stream.WriteObjectEnd() +} + +// UnmarshalAWS reads a value of the 'AWS' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWS(source interface{}) (object *AWS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWS(iterator) + err = iterator.Error + return +} + +// readAWS reads a value of the 'AWS' type from the given iterator. +func readAWS(iterator *jsoniter.Iterator) *AWS { + object := &AWS{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kms_key_arn": + value := iterator.ReadString() + object.kmsKeyArn = value + object.bitmap_ |= 1 + case "sts": + value := readSTS(iterator) + object.sts = value + object.bitmap_ |= 2 + case "access_key_id": + value := iterator.ReadString() + object.accessKeyID = value + object.bitmap_ |= 4 + case "account_id": + value := iterator.ReadString() + object.accountID = value + object.bitmap_ |= 8 + case "additional_allowed_principals": + value := readStringList(iterator) + object.additionalAllowedPrincipals = value + object.bitmap_ |= 16 + case "additional_compute_security_group_ids": + value := readStringList(iterator) + object.additionalComputeSecurityGroupIds = value + object.bitmap_ |= 32 + case "additional_control_plane_security_group_ids": + value := readStringList(iterator) + object.additionalControlPlaneSecurityGroupIds = value + object.bitmap_ |= 64 + case "additional_infra_security_group_ids": + value := readStringList(iterator) + object.additionalInfraSecurityGroupIds = value + object.bitmap_ |= 128 + case "audit_log": + value := readAuditLog(iterator) + object.auditLog = value + object.bitmap_ |= 256 + case "billing_account_id": + value := iterator.ReadString() + object.billingAccountID = value + object.bitmap_ |= 512 + case "ec2_metadata_http_tokens": + text := iterator.ReadString() + value := Ec2MetadataHttpTokens(text) + object.ec2MetadataHttpTokens = value + object.bitmap_ |= 1024 + case "etcd_encryption": + value := readAwsEtcdEncryption(iterator) + object.etcdEncryption = value + object.bitmap_ |= 2048 + case "private_hosted_zone_id": + value := iterator.ReadString() + object.privateHostedZoneID = value + object.bitmap_ |= 4096 + case "private_hosted_zone_role_arn": + value := iterator.ReadString() + object.privateHostedZoneRoleARN = value + object.bitmap_ |= 8192 + case "private_link": + value := iterator.ReadBool() + object.privateLink = value + object.bitmap_ |= 16384 + case "private_link_configuration": + value := readPrivateLinkClusterConfiguration(iterator) + object.privateLinkConfiguration = value + object.bitmap_ |= 32768 + case "secret_access_key": + value := iterator.ReadString() + object.secretAccessKey = value + object.bitmap_ |= 65536 + case "subnet_ids": + value := readStringList(iterator) + object.subnetIDs = value + object.bitmap_ |= 131072 + case "tags": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.tags = value + object.bitmap_ |= 262144 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/aws_validate_credentials_client.go b/clustersmgmt/v2alpha1/aws_validate_credentials_client.go new file mode 100644 index 00000000..1ce914f5 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_validate_credentials_client.go @@ -0,0 +1,209 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AwsValidateCredentialsClient is the client of the 'aws_validate_credentials' resource. +// +// Manages aws creds validation +type AwsValidateCredentialsClient struct { + transport http.RoundTripper + path string +} + +// NewAwsValidateCredentialsClient creates a new client for the 'aws_validate_credentials' +// resource using the given transport to send the requests and receive the +// responses. +func NewAwsValidateCredentialsClient(transport http.RoundTripper, path string) *AwsValidateCredentialsClient { + return &AwsValidateCredentialsClient{ + transport: transport, + path: path, + } +} + +// Post creates a request for the 'post' method. +// +// Manages aws creds validation. +func (c *AwsValidateCredentialsClient) Post() *AwsValidateCredentialsPostRequest { + return &AwsValidateCredentialsPostRequest{ + transport: c.transport, + path: c.path, + } +} + +// AwsValidateCredentialsPostRequest is the request for the 'post' method. +type AwsValidateCredentialsPostRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData +} + +// Parameter adds a query parameter. +func (r *AwsValidateCredentialsPostRequest) Parameter(name string, value interface{}) *AwsValidateCredentialsPostRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AwsValidateCredentialsPostRequest) Header(name string, value interface{}) *AwsValidateCredentialsPostRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AwsValidateCredentialsPostRequest) Impersonate(user string) *AwsValidateCredentialsPostRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry. +func (r *AwsValidateCredentialsPostRequest) Body(value *CloudProviderData) *AwsValidateCredentialsPostRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AwsValidateCredentialsPostRequest) Send() (result *AwsValidateCredentialsPostResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AwsValidateCredentialsPostRequest) SendContext(ctx context.Context) (result *AwsValidateCredentialsPostResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAwsValidateCredentialsPostRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AwsValidateCredentialsPostResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAwsValidateCredentialsPostResponse(result, reader) + if err != nil { + return + } + return +} + +// AwsValidateCredentialsPostResponse is the response for the 'post' method. +type AwsValidateCredentialsPostResponse struct { + status int + header http.Header + err *errors.Error + body *CloudProviderData +} + +// Status returns the response status code. +func (r *AwsValidateCredentialsPostResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AwsValidateCredentialsPostResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AwsValidateCredentialsPostResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry. +func (r *AwsValidateCredentialsPostResponse) Body() *CloudProviderData { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Cloud provider data needed for the inquiry. +func (r *AwsValidateCredentialsPostResponse) GetBody() (value *CloudProviderData, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/aws_validate_credentials_resource_json.go b/clustersmgmt/v2alpha1/aws_validate_credentials_resource_json.go new file mode 100644 index 00000000..3badff62 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_validate_credentials_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeAwsValidateCredentialsPostRequest(request *AwsValidateCredentialsPostRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readAwsValidateCredentialsPostResponse(response *AwsValidateCredentialsPostResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCloudProviderData(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/aws_volume_builder.go b/clustersmgmt/v2alpha1/aws_volume_builder.go new file mode 100644 index 00000000..e7dd0e4c --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_volume_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSVolumeBuilder contains the data and logic needed to build 'AWS_volume' objects. +// +// Holds settings for an AWS storage volume. +type AWSVolumeBuilder struct { + bitmap_ uint32 + iops int + size int +} + +// NewAWSVolume creates a new builder of 'AWS_volume' objects. +func NewAWSVolume() *AWSVolumeBuilder { + return &AWSVolumeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSVolumeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// IOPS sets the value of the 'IOPS' attribute to the given value. +func (b *AWSVolumeBuilder) IOPS(value int) *AWSVolumeBuilder { + b.iops = value + b.bitmap_ |= 1 + return b +} + +// Size sets the value of the 'size' attribute to the given value. +func (b *AWSVolumeBuilder) Size(value int) *AWSVolumeBuilder { + b.size = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSVolumeBuilder) Copy(object *AWSVolume) *AWSVolumeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.iops = object.iops + b.size = object.size + return b +} + +// Build creates a 'AWS_volume' object using the configuration stored in the builder. +func (b *AWSVolumeBuilder) Build() (object *AWSVolume, err error) { + object = new(AWSVolume) + object.bitmap_ = b.bitmap_ + object.iops = b.iops + object.size = b.size + return +} diff --git a/clustersmgmt/v2alpha1/aws_volume_list_builder.go b/clustersmgmt/v2alpha1/aws_volume_list_builder.go new file mode 100644 index 00000000..fc846009 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_volume_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSVolumeListBuilder contains the data and logic needed to build +// 'AWS_volume' objects. +type AWSVolumeListBuilder struct { + items []*AWSVolumeBuilder +} + +// NewAWSVolumeList creates a new builder of 'AWS_volume' objects. +func NewAWSVolumeList() *AWSVolumeListBuilder { + return new(AWSVolumeListBuilder) +} + +// Items sets the items of the list. +func (b *AWSVolumeListBuilder) Items(values ...*AWSVolumeBuilder) *AWSVolumeListBuilder { + b.items = make([]*AWSVolumeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSVolumeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSVolumeListBuilder) Copy(list *AWSVolumeList) *AWSVolumeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSVolumeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSVolume().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWS_volume' objects using the +// configuration stored in the builder. +func (b *AWSVolumeListBuilder) Build() (list *AWSVolumeList, err error) { + items := make([]*AWSVolume, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSVolumeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/aws_volume_list_type_json.go b/clustersmgmt/v2alpha1/aws_volume_list_type_json.go new file mode 100644 index 00000000..63bff8f8 --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_volume_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSVolumeList writes a list of values of the 'AWS_volume' type to +// the given writer. +func MarshalAWSVolumeList(list []*AWSVolume, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSVolumeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSVolumeList writes a list of value of the 'AWS_volume' type to +// the given stream. +func writeAWSVolumeList(list []*AWSVolume, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSVolume(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSVolumeList reads a list of values of the 'AWS_volume' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSVolumeList(source interface{}) (items []*AWSVolume, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSVolumeList(iterator) + err = iterator.Error + return +} + +// readAWSVolumeList reads list of values of the ”AWS_volume' type from +// the given iterator. +func readAWSVolumeList(iterator *jsoniter.Iterator) []*AWSVolume { + list := []*AWSVolume{} + for iterator.ReadArray() { + item := readAWSVolume(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/aws_volume_type.go b/clustersmgmt/v2alpha1/aws_volume_type.go new file mode 100644 index 00000000..f3e4daad --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_volume_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSVolume represents the values of the 'AWS_volume' type. +// +// Holds settings for an AWS storage volume. +type AWSVolume struct { + bitmap_ uint32 + iops int + size int +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSVolume) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// IOPS returns the value of the 'IOPS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Volume provisioned IOPS. +func (o *AWSVolume) IOPS() int { + if o != nil && o.bitmap_&1 != 0 { + return o.iops + } + return 0 +} + +// GetIOPS returns the value of the 'IOPS' attribute and +// a flag indicating if the attribute has a value. +// +// Volume provisioned IOPS. +func (o *AWSVolume) GetIOPS() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.iops + } + return +} + +// Size returns the value of the 'size' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Volume size in Gib. +func (o *AWSVolume) Size() int { + if o != nil && o.bitmap_&2 != 0 { + return o.size + } + return 0 +} + +// GetSize returns the value of the 'size' attribute and +// a flag indicating if the attribute has a value. +// +// Volume size in Gib. +func (o *AWSVolume) GetSize() (value int, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.size + } + return +} + +// AWSVolumeListKind is the name of the type used to represent list of objects of +// type 'AWS_volume'. +const AWSVolumeListKind = "AWSVolumeList" + +// AWSVolumeListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWS_volume'. +const AWSVolumeListLinkKind = "AWSVolumeListLink" + +// AWSVolumeNilKind is the name of the type used to nil lists of objects of +// type 'AWS_volume'. +const AWSVolumeListNilKind = "AWSVolumeListNil" + +// AWSVolumeList is a list of values of the 'AWS_volume' type. +type AWSVolumeList struct { + href string + link bool + items []*AWSVolume +} + +// Len returns the length of the list. +func (l *AWSVolumeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSVolumeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSVolumeList) Get(i int) *AWSVolume { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSVolumeList) Slice() []*AWSVolume { + var slice []*AWSVolume + if l == nil { + slice = make([]*AWSVolume, 0) + } else { + slice = make([]*AWSVolume, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSVolumeList) Each(f func(item *AWSVolume) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSVolumeList) Range(f func(index int, item *AWSVolume) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/aws_volume_type_json.go b/clustersmgmt/v2alpha1/aws_volume_type_json.go new file mode 100644 index 00000000..37959e2d --- /dev/null +++ b/clustersmgmt/v2alpha1/aws_volume_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSVolume writes a value of the 'AWS_volume' type to the given writer. +func MarshalAWSVolume(object *AWSVolume, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSVolume(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSVolume writes a value of the 'AWS_volume' type to the given stream. +func writeAWSVolume(object *AWSVolume, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("iops") + stream.WriteInt(object.iops) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("size") + stream.WriteInt(object.size) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSVolume reads a value of the 'AWS_volume' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSVolume(source interface{}) (object *AWSVolume, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSVolume(iterator) + err = iterator.Error + return +} + +// readAWSVolume reads a value of the 'AWS_volume' type from the given iterator. +func readAWSVolume(iterator *jsoniter.Iterator) *AWSVolume { + object := &AWSVolume{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "iops": + value := iterator.ReadInt() + object.iops = value + object.bitmap_ |= 1 + case "size": + value := iterator.ReadInt() + object.size = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/awssts_account_role_builder.go b/clustersmgmt/v2alpha1/awssts_account_role_builder.go new file mode 100644 index 00000000..8910a5a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_role_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSAccountRoleBuilder contains the data and logic needed to build 'AWSSTS_account_role' objects. +// +// Representation of an sts account role for a rosa cluster +type AWSSTSAccountRoleBuilder struct { + bitmap_ uint32 + items []*AWSSTSRoleBuilder + prefix string +} + +// NewAWSSTSAccountRole creates a new builder of 'AWSSTS_account_role' objects. +func NewAWSSTSAccountRole() *AWSSTSAccountRoleBuilder { + return &AWSSTSAccountRoleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSSTSAccountRoleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Items sets the value of the 'items' attribute to the given values. +func (b *AWSSTSAccountRoleBuilder) Items(values ...*AWSSTSRoleBuilder) *AWSSTSAccountRoleBuilder { + b.items = make([]*AWSSTSRoleBuilder, len(values)) + copy(b.items, values) + b.bitmap_ |= 1 + return b +} + +// Prefix sets the value of the 'prefix' attribute to the given value. +func (b *AWSSTSAccountRoleBuilder) Prefix(value string) *AWSSTSAccountRoleBuilder { + b.prefix = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSSTSAccountRoleBuilder) Copy(object *AWSSTSAccountRole) *AWSSTSAccountRoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.items != nil { + b.items = make([]*AWSSTSRoleBuilder, len(object.items)) + for i, v := range object.items { + b.items[i] = NewAWSSTSRole().Copy(v) + } + } else { + b.items = nil + } + b.prefix = object.prefix + return b +} + +// Build creates a 'AWSSTS_account_role' object using the configuration stored in the builder. +func (b *AWSSTSAccountRoleBuilder) Build() (object *AWSSTSAccountRole, err error) { + object = new(AWSSTSAccountRole) + object.bitmap_ = b.bitmap_ + if b.items != nil { + object.items = make([]*AWSSTSRole, len(b.items)) + for i, v := range b.items { + object.items[i], err = v.Build() + if err != nil { + return + } + } + } + object.prefix = b.prefix + return +} diff --git a/clustersmgmt/v2alpha1/awssts_account_role_list_builder.go b/clustersmgmt/v2alpha1/awssts_account_role_list_builder.go new file mode 100644 index 00000000..5d75d2d5 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_role_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSAccountRoleListBuilder contains the data and logic needed to build +// 'AWSSTS_account_role' objects. +type AWSSTSAccountRoleListBuilder struct { + items []*AWSSTSAccountRoleBuilder +} + +// NewAWSSTSAccountRoleList creates a new builder of 'AWSSTS_account_role' objects. +func NewAWSSTSAccountRoleList() *AWSSTSAccountRoleListBuilder { + return new(AWSSTSAccountRoleListBuilder) +} + +// Items sets the items of the list. +func (b *AWSSTSAccountRoleListBuilder) Items(values ...*AWSSTSAccountRoleBuilder) *AWSSTSAccountRoleListBuilder { + b.items = make([]*AWSSTSAccountRoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSSTSAccountRoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSSTSAccountRoleListBuilder) Copy(list *AWSSTSAccountRoleList) *AWSSTSAccountRoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSSTSAccountRoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSSTSAccountRole().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWSSTS_account_role' objects using the +// configuration stored in the builder. +func (b *AWSSTSAccountRoleListBuilder) Build() (list *AWSSTSAccountRoleList, err error) { + items := make([]*AWSSTSAccountRole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSSTSAccountRoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/awssts_account_role_list_type_json.go b/clustersmgmt/v2alpha1/awssts_account_role_list_type_json.go new file mode 100644 index 00000000..d198071e --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_role_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSTSAccountRoleList writes a list of values of the 'AWSSTS_account_role' type to +// the given writer. +func MarshalAWSSTSAccountRoleList(list []*AWSSTSAccountRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSTSAccountRoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSTSAccountRoleList writes a list of value of the 'AWSSTS_account_role' type to +// the given stream. +func writeAWSSTSAccountRoleList(list []*AWSSTSAccountRole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSSTSAccountRole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSSTSAccountRoleList reads a list of values of the 'AWSSTS_account_role' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSSTSAccountRoleList(source interface{}) (items []*AWSSTSAccountRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSSTSAccountRoleList(iterator) + err = iterator.Error + return +} + +// readAWSSTSAccountRoleList reads list of values of the ”AWSSTS_account_role' type from +// the given iterator. +func readAWSSTSAccountRoleList(iterator *jsoniter.Iterator) []*AWSSTSAccountRole { + list := []*AWSSTSAccountRole{} + for iterator.ReadArray() { + item := readAWSSTSAccountRole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/awssts_account_role_type.go b/clustersmgmt/v2alpha1/awssts_account_role_type.go new file mode 100644 index 00000000..6c7c2723 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_role_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSAccountRole represents the values of the 'AWSSTS_account_role' type. +// +// Representation of an sts account role for a rosa cluster +type AWSSTSAccountRole struct { + bitmap_ uint32 + items []*AWSSTSRole + prefix string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSSTSAccountRole) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Items returns the value of the 'items' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The list of STS Roles for this Account Role +func (o *AWSSTSAccountRole) Items() []*AWSSTSRole { + if o != nil && o.bitmap_&1 != 0 { + return o.items + } + return nil +} + +// GetItems returns the value of the 'items' attribute and +// a flag indicating if the attribute has a value. +// +// The list of STS Roles for this Account Role +func (o *AWSSTSAccountRole) GetItems() (value []*AWSSTSRole, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.items + } + return +} + +// Prefix returns the value of the 'prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The Prefix for this Account Role +func (o *AWSSTSAccountRole) Prefix() string { + if o != nil && o.bitmap_&2 != 0 { + return o.prefix + } + return "" +} + +// GetPrefix returns the value of the 'prefix' attribute and +// a flag indicating if the attribute has a value. +// +// The Prefix for this Account Role +func (o *AWSSTSAccountRole) GetPrefix() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.prefix + } + return +} + +// AWSSTSAccountRoleListKind is the name of the type used to represent list of objects of +// type 'AWSSTS_account_role'. +const AWSSTSAccountRoleListKind = "AWSSTSAccountRoleList" + +// AWSSTSAccountRoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWSSTS_account_role'. +const AWSSTSAccountRoleListLinkKind = "AWSSTSAccountRoleListLink" + +// AWSSTSAccountRoleNilKind is the name of the type used to nil lists of objects of +// type 'AWSSTS_account_role'. +const AWSSTSAccountRoleListNilKind = "AWSSTSAccountRoleListNil" + +// AWSSTSAccountRoleList is a list of values of the 'AWSSTS_account_role' type. +type AWSSTSAccountRoleList struct { + href string + link bool + items []*AWSSTSAccountRole +} + +// Len returns the length of the list. +func (l *AWSSTSAccountRoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSSTSAccountRoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSSTSAccountRoleList) Get(i int) *AWSSTSAccountRole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSSTSAccountRoleList) Slice() []*AWSSTSAccountRole { + var slice []*AWSSTSAccountRole + if l == nil { + slice = make([]*AWSSTSAccountRole, 0) + } else { + slice = make([]*AWSSTSAccountRole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSSTSAccountRoleList) Each(f func(item *AWSSTSAccountRole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSSTSAccountRoleList) Range(f func(index int, item *AWSSTSAccountRole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/awssts_account_role_type_json.go b/clustersmgmt/v2alpha1/awssts_account_role_type_json.go new file mode 100644 index 00000000..44975d2a --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_role_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSTSAccountRole writes a value of the 'AWSSTS_account_role' type to the given writer. +func MarshalAWSSTSAccountRole(object *AWSSTSAccountRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSTSAccountRole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSTSAccountRole writes a value of the 'AWSSTS_account_role' type to the given stream. +func writeAWSSTSAccountRole(object *AWSSTSAccountRole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.items != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("items") + writeAWSSTSRoleList(object.items, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("prefix") + stream.WriteString(object.prefix) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSSTSAccountRole reads a value of the 'AWSSTS_account_role' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSSTSAccountRole(source interface{}) (object *AWSSTSAccountRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSSTSAccountRole(iterator) + err = iterator.Error + return +} + +// readAWSSTSAccountRole reads a value of the 'AWSSTS_account_role' type from the given iterator. +func readAWSSTSAccountRole(iterator *jsoniter.Iterator) *AWSSTSAccountRole { + object := &AWSSTSAccountRole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "items": + value := readAWSSTSRoleList(iterator) + object.items = value + object.bitmap_ |= 1 + case "prefix": + value := iterator.ReadString() + object.prefix = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/awssts_account_roles_inquiry_client.go b/clustersmgmt/v2alpha1/awssts_account_roles_inquiry_client.go new file mode 100644 index 00000000..6715a003 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_roles_inquiry_client.go @@ -0,0 +1,336 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSSTSAccountRolesInquiryClient is the client of the 'AWSSTS_account_roles_inquiry' resource. +// +// Manages STS Roles +type AWSSTSAccountRolesInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewAWSSTSAccountRolesInquiryClient creates a new client for the 'AWSSTS_account_roles_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSSTSAccountRolesInquiryClient(transport http.RoundTripper, path string) *AWSSTSAccountRolesInquiryClient { + return &AWSSTSAccountRolesInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +func (c *AWSSTSAccountRolesInquiryClient) Search() *AWSSTSAccountRolesInquirySearchRequest { + return &AWSSTSAccountRolesInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSSTSAccountRolesInquirySearchRequest is the request for the 'search' method. +type AWSSTSAccountRolesInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *AWS + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *AWSSTSAccountRolesInquirySearchRequest) Parameter(name string, value interface{}) *AWSSTSAccountRolesInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSSTSAccountRolesInquirySearchRequest) Header(name string, value interface{}) *AWSSTSAccountRolesInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSSTSAccountRolesInquirySearchRequest) Impersonate(user string) *AWSSTSAccountRolesInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// AWS Account Details required for the inquiry +func (r *AWSSTSAccountRolesInquirySearchRequest) Body(value *AWS) *AWSSTSAccountRolesInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AWSSTSAccountRolesInquirySearchRequest) Page(value int) *AWSSTSAccountRolesInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// be the total number of STS account roles. +func (r *AWSSTSAccountRolesInquirySearchRequest) Size(value int) *AWSSTSAccountRolesInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSSTSAccountRolesInquirySearchRequest) Send() (result *AWSSTSAccountRolesInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSSTSAccountRolesInquirySearchRequest) SendContext(ctx context.Context) (result *AWSSTSAccountRolesInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeAWSSTSAccountRolesInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSSTSAccountRolesInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSSTSAccountRolesInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSSTSAccountRolesInquirySearchResponse is the response for the 'search' method. +type AWSSTSAccountRolesInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + awsAccountId *string + items *AWSSTSAccountRoleList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AWSSTSAccountRolesInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSSTSAccountRolesInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSSTSAccountRolesInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// AwsAccountId returns the value of the 'aws_account_id' parameter. +// +// The AWS Account Id for the STS Account Roles +func (r *AWSSTSAccountRolesInquirySearchResponse) AwsAccountId() string { + if r != nil && r.awsAccountId != nil { + return *r.awsAccountId + } + return "" +} + +// GetAwsAccountId returns the value of the 'aws_account_id' parameter and +// a flag indicating if the parameter has a value. +// +// The AWS Account Id for the STS Account Roles +func (r *AWSSTSAccountRolesInquirySearchResponse) GetAwsAccountId() (value string, ok bool) { + ok = r != nil && r.awsAccountId != nil + if ok { + value = *r.awsAccountId + } + return +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of STS Account Roles +func (r *AWSSTSAccountRolesInquirySearchResponse) Items() *AWSSTSAccountRoleList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of STS Account Roles +func (r *AWSSTSAccountRolesInquirySearchResponse) GetItems() (value *AWSSTSAccountRoleList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AWSSTSAccountRolesInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *AWSSTSAccountRolesInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// be the total number of STS account roles. +func (r *AWSSTSAccountRolesInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// be the total number of STS account roles. +func (r *AWSSTSAccountRolesInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of STS account roles +func (r *AWSSTSAccountRolesInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of STS account roles +func (r *AWSSTSAccountRolesInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/awssts_account_roles_inquiry_resource_json.go b/clustersmgmt/v2alpha1/awssts_account_roles_inquiry_resource_json.go new file mode 100644 index 00000000..62567779 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_account_roles_inquiry_resource_json.go @@ -0,0 +1,64 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAWSSTSAccountRolesInquirySearchRequest(request *AWSSTSAccountRolesInquirySearchRequest, writer io.Writer) error { + return MarshalAWS(request.body, writer) +} +func readAWSSTSAccountRolesInquirySearchResponse(response *AWSSTSAccountRolesInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "aws_acccount_id": + value := iterator.ReadString() + response.awsAccountId = &value + case "items": + items := readAWSSTSAccountRoleList(iterator) + response.items = &AWSSTSAccountRoleList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/awssts_policies_inquiry_client.go b/clustersmgmt/v2alpha1/awssts_policies_inquiry_client.go new file mode 100644 index 00000000..02f618df --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policies_inquiry_client.go @@ -0,0 +1,337 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// AWSSTSPoliciesInquiryClient is the client of the 'AWSSTS_policies_inquiry' resource. +// +// Manages STS policies +type AWSSTSPoliciesInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewAWSSTSPoliciesInquiryClient creates a new client for the 'AWSSTS_policies_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewAWSSTSPoliciesInquiryClient(transport http.RoundTripper, path string) *AWSSTSPoliciesInquiryClient { + return &AWSSTSPoliciesInquiryClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of policies. +func (c *AWSSTSPoliciesInquiryClient) List() *AWSSTSPoliciesInquiryListRequest { + return &AWSSTSPoliciesInquiryListRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSSTSPoliciesInquiryListRequest is the request for the 'list' method. +type AWSSTSPoliciesInquiryListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *AWSSTSPoliciesInquiryListRequest) Parameter(name string, value interface{}) *AWSSTSPoliciesInquiryListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *AWSSTSPoliciesInquiryListRequest) Header(name string, value interface{}) *AWSSTSPoliciesInquiryListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *AWSSTSPoliciesInquiryListRequest) Impersonate(user string) *AWSSTSPoliciesInquiryListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the awsstspolicies instead of +// the names of the columns of a table. For example, in order to sort the policies +// descending by operator type identifier the value should be: +// +// ```sql +// orderBy id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *AWSSTSPoliciesInquiryListRequest) Order(value string) *AWSSTSPoliciesInquiryListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSSTSPoliciesInquiryListRequest) Page(value int) *AWSSTSPoliciesInquiryListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the awsstspolicies instead of +// the names of the columns of a table. For example, in order to retrieve all the +// policies of type `operatorrole` +// should be: +// +// ```sql +// policy_type like 'OperatorRole%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// policies will be returned. +func (r *AWSSTSPoliciesInquiryListRequest) Search(value string) *AWSSTSPoliciesInquiryListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSSTSPoliciesInquiryListRequest) Size(value int) *AWSSTSPoliciesInquiryListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *AWSSTSPoliciesInquiryListRequest) Send() (result *AWSSTSPoliciesInquiryListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *AWSSTSPoliciesInquiryListRequest) SendContext(ctx context.Context) (result *AWSSTSPoliciesInquiryListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &AWSSTSPoliciesInquiryListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readAWSSTSPoliciesInquiryListResponse(result, reader) + if err != nil { + return + } + return +} + +// AWSSTSPoliciesInquiryListResponse is the response for the 'list' method. +type AWSSTSPoliciesInquiryListResponse struct { + status int + header http.Header + err *errors.Error + items *AWSSTSPolicyList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *AWSSTSPoliciesInquiryListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *AWSSTSPoliciesInquiryListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *AWSSTSPoliciesInquiryListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of policies. +func (r *AWSSTSPoliciesInquiryListResponse) Items() *AWSSTSPolicyList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of policies. +func (r *AWSSTSPoliciesInquiryListResponse) GetItems() (value *AWSSTSPolicyList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSSTSPoliciesInquiryListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *AWSSTSPoliciesInquiryListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSSTSPoliciesInquiryListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *AWSSTSPoliciesInquiryListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSSTSPoliciesInquiryListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *AWSSTSPoliciesInquiryListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/awssts_policies_inquiry_resource_json.go b/clustersmgmt/v2alpha1/awssts_policies_inquiry_resource_json.go new file mode 100644 index 00000000..1e19d4fb --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policies_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeAWSSTSPoliciesInquiryListRequest(request *AWSSTSPoliciesInquiryListRequest, writer io.Writer) error { + return nil +} +func readAWSSTSPoliciesInquiryListResponse(response *AWSSTSPoliciesInquiryListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readAWSSTSPolicyList(iterator) + response.items = &AWSSTSPolicyList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/awssts_policy_builder.go b/clustersmgmt/v2alpha1/awssts_policy_builder.go new file mode 100644 index 00000000..a091d5a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policy_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSPolicyBuilder contains the data and logic needed to build 'AWSSTS_policy' objects. +// +// Representation of an sts policies for rosa cluster +type AWSSTSPolicyBuilder struct { + bitmap_ uint32 + arn string + id string + details string + type_ string +} + +// NewAWSSTSPolicy creates a new builder of 'AWSSTS_policy' objects. +func NewAWSSTSPolicy() *AWSSTSPolicyBuilder { + return &AWSSTSPolicyBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSSTSPolicyBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ARN sets the value of the 'ARN' attribute to the given value. +func (b *AWSSTSPolicyBuilder) ARN(value string) *AWSSTSPolicyBuilder { + b.arn = value + b.bitmap_ |= 1 + return b +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *AWSSTSPolicyBuilder) ID(value string) *AWSSTSPolicyBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// Details sets the value of the 'details' attribute to the given value. +func (b *AWSSTSPolicyBuilder) Details(value string) *AWSSTSPolicyBuilder { + b.details = value + b.bitmap_ |= 4 + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *AWSSTSPolicyBuilder) Type(value string) *AWSSTSPolicyBuilder { + b.type_ = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSSTSPolicyBuilder) Copy(object *AWSSTSPolicy) *AWSSTSPolicyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.arn = object.arn + b.id = object.id + b.details = object.details + b.type_ = object.type_ + return b +} + +// Build creates a 'AWSSTS_policy' object using the configuration stored in the builder. +func (b *AWSSTSPolicyBuilder) Build() (object *AWSSTSPolicy, err error) { + object = new(AWSSTSPolicy) + object.bitmap_ = b.bitmap_ + object.arn = b.arn + object.id = b.id + object.details = b.details + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/awssts_policy_list_builder.go b/clustersmgmt/v2alpha1/awssts_policy_list_builder.go new file mode 100644 index 00000000..75c7bd14 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSPolicyListBuilder contains the data and logic needed to build +// 'AWSSTS_policy' objects. +type AWSSTSPolicyListBuilder struct { + items []*AWSSTSPolicyBuilder +} + +// NewAWSSTSPolicyList creates a new builder of 'AWSSTS_policy' objects. +func NewAWSSTSPolicyList() *AWSSTSPolicyListBuilder { + return new(AWSSTSPolicyListBuilder) +} + +// Items sets the items of the list. +func (b *AWSSTSPolicyListBuilder) Items(values ...*AWSSTSPolicyBuilder) *AWSSTSPolicyListBuilder { + b.items = make([]*AWSSTSPolicyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSSTSPolicyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSSTSPolicyListBuilder) Copy(list *AWSSTSPolicyList) *AWSSTSPolicyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSSTSPolicyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSSTSPolicy().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWSSTS_policy' objects using the +// configuration stored in the builder. +func (b *AWSSTSPolicyListBuilder) Build() (list *AWSSTSPolicyList, err error) { + items := make([]*AWSSTSPolicy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSSTSPolicyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/awssts_policy_list_type_json.go b/clustersmgmt/v2alpha1/awssts_policy_list_type_json.go new file mode 100644 index 00000000..f89434f1 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSTSPolicyList writes a list of values of the 'AWSSTS_policy' type to +// the given writer. +func MarshalAWSSTSPolicyList(list []*AWSSTSPolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSTSPolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSTSPolicyList writes a list of value of the 'AWSSTS_policy' type to +// the given stream. +func writeAWSSTSPolicyList(list []*AWSSTSPolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSSTSPolicy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSSTSPolicyList reads a list of values of the 'AWSSTS_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSSTSPolicyList(source interface{}) (items []*AWSSTSPolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSSTSPolicyList(iterator) + err = iterator.Error + return +} + +// readAWSSTSPolicyList reads list of values of the ”AWSSTS_policy' type from +// the given iterator. +func readAWSSTSPolicyList(iterator *jsoniter.Iterator) []*AWSSTSPolicy { + list := []*AWSSTSPolicy{} + for iterator.ReadArray() { + item := readAWSSTSPolicy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/awssts_policy_type.go b/clustersmgmt/v2alpha1/awssts_policy_type.go new file mode 100644 index 00000000..e850abb8 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policy_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSPolicy represents the values of the 'AWSSTS_policy' type. +// +// Representation of an sts policies for rosa cluster +type AWSSTSPolicy struct { + bitmap_ uint32 + arn string + id string + details string + type_ string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSSTSPolicy) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ARN returns the value of the 'ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The ARN of the managed policy +func (o *AWSSTSPolicy) ARN() string { + if o != nil && o.bitmap_&1 != 0 { + return o.arn + } + return "" +} + +// GetARN returns the value of the 'ARN' attribute and +// a flag indicating if the attribute has a value. +// +// The ARN of the managed policy +func (o *AWSSTSPolicy) GetARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.arn + } + return +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Policy ID +func (o *AWSSTSPolicy) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// Policy ID +func (o *AWSSTSPolicy) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// Details returns the value of the 'details' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Policy Details +func (o *AWSSTSPolicy) Details() string { + if o != nil && o.bitmap_&4 != 0 { + return o.details + } + return "" +} + +// GetDetails returns the value of the 'details' attribute and +// a flag indicating if the attribute has a value. +// +// Policy Details +func (o *AWSSTSPolicy) GetDetails() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.details + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Type of policy operator/account role +func (o *AWSSTSPolicy) Type() string { + if o != nil && o.bitmap_&8 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// Type of policy operator/account role +func (o *AWSSTSPolicy) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.type_ + } + return +} + +// AWSSTSPolicyListKind is the name of the type used to represent list of objects of +// type 'AWSSTS_policy'. +const AWSSTSPolicyListKind = "AWSSTSPolicyList" + +// AWSSTSPolicyListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWSSTS_policy'. +const AWSSTSPolicyListLinkKind = "AWSSTSPolicyListLink" + +// AWSSTSPolicyNilKind is the name of the type used to nil lists of objects of +// type 'AWSSTS_policy'. +const AWSSTSPolicyListNilKind = "AWSSTSPolicyListNil" + +// AWSSTSPolicyList is a list of values of the 'AWSSTS_policy' type. +type AWSSTSPolicyList struct { + href string + link bool + items []*AWSSTSPolicy +} + +// Len returns the length of the list. +func (l *AWSSTSPolicyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSSTSPolicyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSSTSPolicyList) Get(i int) *AWSSTSPolicy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSSTSPolicyList) Slice() []*AWSSTSPolicy { + var slice []*AWSSTSPolicy + if l == nil { + slice = make([]*AWSSTSPolicy, 0) + } else { + slice = make([]*AWSSTSPolicy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSSTSPolicyList) Each(f func(item *AWSSTSPolicy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSSTSPolicyList) Range(f func(index int, item *AWSSTSPolicy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/awssts_policy_type_json.go b/clustersmgmt/v2alpha1/awssts_policy_type_json.go new file mode 100644 index 00000000..2dee736b --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_policy_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSTSPolicy writes a value of the 'AWSSTS_policy' type to the given writer. +func MarshalAWSSTSPolicy(object *AWSSTSPolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSTSPolicy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSTSPolicy writes a value of the 'AWSSTS_policy' type to the given stream. +func writeAWSSTSPolicy(object *AWSSTSPolicy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("arn") + stream.WriteString(object.arn) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("details") + stream.WriteString(object.details) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSSTSPolicy reads a value of the 'AWSSTS_policy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSSTSPolicy(source interface{}) (object *AWSSTSPolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSSTSPolicy(iterator) + err = iterator.Error + return +} + +// readAWSSTSPolicy reads a value of the 'AWSSTS_policy' type from the given iterator. +func readAWSSTSPolicy(iterator *jsoniter.Iterator) *AWSSTSPolicy { + object := &AWSSTSPolicy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "arn": + value := iterator.ReadString() + object.arn = value + object.bitmap_ |= 1 + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 2 + case "details": + value := iterator.ReadString() + object.details = value + object.bitmap_ |= 4 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/awssts_role_builder.go b/clustersmgmt/v2alpha1/awssts_role_builder.go new file mode 100644 index 00000000..4549c408 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_role_builder.go @@ -0,0 +1,113 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSRoleBuilder contains the data and logic needed to build 'AWSSTS_role' objects. +// +// Representation of an sts role for a rosa cluster +type AWSSTSRoleBuilder struct { + bitmap_ uint32 + roleARN string + roleType string + roleVersion string + hcpManagedPolicies bool + isAdmin bool + managedPolicies bool +} + +// NewAWSSTSRole creates a new builder of 'AWSSTS_role' objects. +func NewAWSSTSRole() *AWSSTSRoleBuilder { + return &AWSSTSRoleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AWSSTSRoleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// HcpManagedPolicies sets the value of the 'hcp_managed_policies' attribute to the given value. +func (b *AWSSTSRoleBuilder) HcpManagedPolicies(value bool) *AWSSTSRoleBuilder { + b.hcpManagedPolicies = value + b.bitmap_ |= 1 + return b +} + +// IsAdmin sets the value of the 'is_admin' attribute to the given value. +func (b *AWSSTSRoleBuilder) IsAdmin(value bool) *AWSSTSRoleBuilder { + b.isAdmin = value + b.bitmap_ |= 2 + return b +} + +// ManagedPolicies sets the value of the 'managed_policies' attribute to the given value. +func (b *AWSSTSRoleBuilder) ManagedPolicies(value bool) *AWSSTSRoleBuilder { + b.managedPolicies = value + b.bitmap_ |= 4 + return b +} + +// RoleARN sets the value of the 'role_ARN' attribute to the given value. +func (b *AWSSTSRoleBuilder) RoleARN(value string) *AWSSTSRoleBuilder { + b.roleARN = value + b.bitmap_ |= 8 + return b +} + +// RoleType sets the value of the 'role_type' attribute to the given value. +func (b *AWSSTSRoleBuilder) RoleType(value string) *AWSSTSRoleBuilder { + b.roleType = value + b.bitmap_ |= 16 + return b +} + +// RoleVersion sets the value of the 'role_version' attribute to the given value. +func (b *AWSSTSRoleBuilder) RoleVersion(value string) *AWSSTSRoleBuilder { + b.roleVersion = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AWSSTSRoleBuilder) Copy(object *AWSSTSRole) *AWSSTSRoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.hcpManagedPolicies = object.hcpManagedPolicies + b.isAdmin = object.isAdmin + b.managedPolicies = object.managedPolicies + b.roleARN = object.roleARN + b.roleType = object.roleType + b.roleVersion = object.roleVersion + return b +} + +// Build creates a 'AWSSTS_role' object using the configuration stored in the builder. +func (b *AWSSTSRoleBuilder) Build() (object *AWSSTSRole, err error) { + object = new(AWSSTSRole) + object.bitmap_ = b.bitmap_ + object.hcpManagedPolicies = b.hcpManagedPolicies + object.isAdmin = b.isAdmin + object.managedPolicies = b.managedPolicies + object.roleARN = b.roleARN + object.roleType = b.roleType + object.roleVersion = b.roleVersion + return +} diff --git a/clustersmgmt/v2alpha1/awssts_role_list_builder.go b/clustersmgmt/v2alpha1/awssts_role_list_builder.go new file mode 100644 index 00000000..584cdd1e --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_role_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSRoleListBuilder contains the data and logic needed to build +// 'AWSSTS_role' objects. +type AWSSTSRoleListBuilder struct { + items []*AWSSTSRoleBuilder +} + +// NewAWSSTSRoleList creates a new builder of 'AWSSTS_role' objects. +func NewAWSSTSRoleList() *AWSSTSRoleListBuilder { + return new(AWSSTSRoleListBuilder) +} + +// Items sets the items of the list. +func (b *AWSSTSRoleListBuilder) Items(values ...*AWSSTSRoleBuilder) *AWSSTSRoleListBuilder { + b.items = make([]*AWSSTSRoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AWSSTSRoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AWSSTSRoleListBuilder) Copy(list *AWSSTSRoleList) *AWSSTSRoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AWSSTSRoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAWSSTSRole().Copy(v) + } + } + return b +} + +// Build creates a list of 'AWSSTS_role' objects using the +// configuration stored in the builder. +func (b *AWSSTSRoleListBuilder) Build() (list *AWSSTSRoleList, err error) { + items := make([]*AWSSTSRole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AWSSTSRoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/awssts_role_list_type_json.go b/clustersmgmt/v2alpha1/awssts_role_list_type_json.go new file mode 100644 index 00000000..02f2a5c6 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_role_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSTSRoleList writes a list of values of the 'AWSSTS_role' type to +// the given writer. +func MarshalAWSSTSRoleList(list []*AWSSTSRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSTSRoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSTSRoleList writes a list of value of the 'AWSSTS_role' type to +// the given stream. +func writeAWSSTSRoleList(list []*AWSSTSRole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAWSSTSRole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAWSSTSRoleList reads a list of values of the 'AWSSTS_role' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAWSSTSRoleList(source interface{}) (items []*AWSSTSRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAWSSTSRoleList(iterator) + err = iterator.Error + return +} + +// readAWSSTSRoleList reads list of values of the ”AWSSTS_role' type from +// the given iterator. +func readAWSSTSRoleList(iterator *jsoniter.Iterator) []*AWSSTSRole { + list := []*AWSSTSRole{} + for iterator.ReadArray() { + item := readAWSSTSRole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/awssts_role_type.go b/clustersmgmt/v2alpha1/awssts_role_type.go new file mode 100644 index 00000000..3198b567 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_role_type.go @@ -0,0 +1,262 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AWSSTSRole represents the values of the 'AWSSTS_role' type. +// +// Representation of an sts role for a rosa cluster +type AWSSTSRole struct { + bitmap_ uint32 + roleARN string + roleType string + roleVersion string + hcpManagedPolicies bool + isAdmin bool + managedPolicies bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AWSSTSRole) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// HcpManagedPolicies returns the value of the 'hcp_managed_policies' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Does this Role have HCP Managed Policies? +func (o *AWSSTSRole) HcpManagedPolicies() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.hcpManagedPolicies + } + return false +} + +// GetHcpManagedPolicies returns the value of the 'hcp_managed_policies' attribute and +// a flag indicating if the attribute has a value. +// +// Does this Role have HCP Managed Policies? +func (o *AWSSTSRole) GetHcpManagedPolicies() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.hcpManagedPolicies + } + return +} + +// IsAdmin returns the value of the 'is_admin' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Does this role have Admin permission? +func (o *AWSSTSRole) IsAdmin() bool { + if o != nil && o.bitmap_&2 != 0 { + return o.isAdmin + } + return false +} + +// GetIsAdmin returns the value of the 'is_admin' attribute and +// a flag indicating if the attribute has a value. +// +// Does this role have Admin permission? +func (o *AWSSTSRole) GetIsAdmin() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.isAdmin + } + return +} + +// ManagedPolicies returns the value of the 'managed_policies' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Does this Role have Managed Policies? +func (o *AWSSTSRole) ManagedPolicies() bool { + if o != nil && o.bitmap_&4 != 0 { + return o.managedPolicies + } + return false +} + +// GetManagedPolicies returns the value of the 'managed_policies' attribute and +// a flag indicating if the attribute has a value. +// +// Does this Role have Managed Policies? +func (o *AWSSTSRole) GetManagedPolicies() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.managedPolicies + } + return +} + +// RoleARN returns the value of the 'role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The AWS ARN for this Role +func (o *AWSSTSRole) RoleARN() string { + if o != nil && o.bitmap_&8 != 0 { + return o.roleARN + } + return "" +} + +// GetRoleARN returns the value of the 'role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// The AWS ARN for this Role +func (o *AWSSTSRole) GetRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.roleARN + } + return +} + +// RoleType returns the value of the 'role_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The type of this Role +func (o *AWSSTSRole) RoleType() string { + if o != nil && o.bitmap_&16 != 0 { + return o.roleType + } + return "" +} + +// GetRoleType returns the value of the 'role_type' attribute and +// a flag indicating if the attribute has a value. +// +// The type of this Role +func (o *AWSSTSRole) GetRoleType() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.roleType + } + return +} + +// RoleVersion returns the value of the 'role_version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The Openshift Version for this Role +func (o *AWSSTSRole) RoleVersion() string { + if o != nil && o.bitmap_&32 != 0 { + return o.roleVersion + } + return "" +} + +// GetRoleVersion returns the value of the 'role_version' attribute and +// a flag indicating if the attribute has a value. +// +// The Openshift Version for this Role +func (o *AWSSTSRole) GetRoleVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.roleVersion + } + return +} + +// AWSSTSRoleListKind is the name of the type used to represent list of objects of +// type 'AWSSTS_role'. +const AWSSTSRoleListKind = "AWSSTSRoleList" + +// AWSSTSRoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'AWSSTS_role'. +const AWSSTSRoleListLinkKind = "AWSSTSRoleListLink" + +// AWSSTSRoleNilKind is the name of the type used to nil lists of objects of +// type 'AWSSTS_role'. +const AWSSTSRoleListNilKind = "AWSSTSRoleListNil" + +// AWSSTSRoleList is a list of values of the 'AWSSTS_role' type. +type AWSSTSRoleList struct { + href string + link bool + items []*AWSSTSRole +} + +// Len returns the length of the list. +func (l *AWSSTSRoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AWSSTSRoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AWSSTSRoleList) Get(i int) *AWSSTSRole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AWSSTSRoleList) Slice() []*AWSSTSRole { + var slice []*AWSSTSRole + if l == nil { + slice = make([]*AWSSTSRole, 0) + } else { + slice = make([]*AWSSTSRole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AWSSTSRoleList) Each(f func(item *AWSSTSRole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AWSSTSRoleList) Range(f func(index int, item *AWSSTSRole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/awssts_role_type_json.go b/clustersmgmt/v2alpha1/awssts_role_type_json.go new file mode 100644 index 00000000..28337e79 --- /dev/null +++ b/clustersmgmt/v2alpha1/awssts_role_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAWSSTSRole writes a value of the 'AWSSTS_role' type to the given writer. +func MarshalAWSSTSRole(object *AWSSTSRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAWSSTSRole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAWSSTSRole writes a value of the 'AWSSTS_role' type to the given stream. +func writeAWSSTSRole(object *AWSSTSRole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hcpManagedPolicies") + stream.WriteBool(object.hcpManagedPolicies) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("isAdmin") + stream.WriteBool(object.isAdmin) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managedPolicies") + stream.WriteBool(object.managedPolicies) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("arn") + stream.WriteString(object.roleARN) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.roleType) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("roleVersion") + stream.WriteString(object.roleVersion) + } + stream.WriteObjectEnd() +} + +// UnmarshalAWSSTSRole reads a value of the 'AWSSTS_role' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAWSSTSRole(source interface{}) (object *AWSSTSRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAWSSTSRole(iterator) + err = iterator.Error + return +} + +// readAWSSTSRole reads a value of the 'AWSSTS_role' type from the given iterator. +func readAWSSTSRole(iterator *jsoniter.Iterator) *AWSSTSRole { + object := &AWSSTSRole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "hcpManagedPolicies": + value := iterator.ReadBool() + object.hcpManagedPolicies = value + object.bitmap_ |= 1 + case "isAdmin": + value := iterator.ReadBool() + object.isAdmin = value + object.bitmap_ |= 2 + case "managedPolicies": + value := iterator.ReadBool() + object.managedPolicies = value + object.bitmap_ |= 4 + case "arn": + value := iterator.ReadString() + object.roleARN = value + object.bitmap_ |= 8 + case "type": + value := iterator.ReadString() + object.roleType = value + object.bitmap_ |= 16 + case "roleVersion": + value := iterator.ReadString() + object.roleVersion = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/azure_builder.go b/clustersmgmt/v2alpha1/azure_builder.go new file mode 100644 index 00000000..8cec217e --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_builder.go @@ -0,0 +1,123 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AzureBuilder contains the data and logic needed to build 'azure' objects. +// +// Microsoft Azure settings of a cluster. +type AzureBuilder struct { + bitmap_ uint32 + managedResourceGroupName string + networkSecurityGroupResourceID string + resourceGroupName string + resourceName string + subnetResourceID string + subscriptionID string + tenantID string +} + +// NewAzure creates a new builder of 'azure' objects. +func NewAzure() *AzureBuilder { + return &AzureBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AzureBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ManagedResourceGroupName sets the value of the 'managed_resource_group_name' attribute to the given value. +func (b *AzureBuilder) ManagedResourceGroupName(value string) *AzureBuilder { + b.managedResourceGroupName = value + b.bitmap_ |= 1 + return b +} + +// NetworkSecurityGroupResourceID sets the value of the 'network_security_group_resource_ID' attribute to the given value. +func (b *AzureBuilder) NetworkSecurityGroupResourceID(value string) *AzureBuilder { + b.networkSecurityGroupResourceID = value + b.bitmap_ |= 2 + return b +} + +// ResourceGroupName sets the value of the 'resource_group_name' attribute to the given value. +func (b *AzureBuilder) ResourceGroupName(value string) *AzureBuilder { + b.resourceGroupName = value + b.bitmap_ |= 4 + return b +} + +// ResourceName sets the value of the 'resource_name' attribute to the given value. +func (b *AzureBuilder) ResourceName(value string) *AzureBuilder { + b.resourceName = value + b.bitmap_ |= 8 + return b +} + +// SubnetResourceID sets the value of the 'subnet_resource_ID' attribute to the given value. +func (b *AzureBuilder) SubnetResourceID(value string) *AzureBuilder { + b.subnetResourceID = value + b.bitmap_ |= 16 + return b +} + +// SubscriptionID sets the value of the 'subscription_ID' attribute to the given value. +func (b *AzureBuilder) SubscriptionID(value string) *AzureBuilder { + b.subscriptionID = value + b.bitmap_ |= 32 + return b +} + +// TenantID sets the value of the 'tenant_ID' attribute to the given value. +func (b *AzureBuilder) TenantID(value string) *AzureBuilder { + b.tenantID = value + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AzureBuilder) Copy(object *Azure) *AzureBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.managedResourceGroupName = object.managedResourceGroupName + b.networkSecurityGroupResourceID = object.networkSecurityGroupResourceID + b.resourceGroupName = object.resourceGroupName + b.resourceName = object.resourceName + b.subnetResourceID = object.subnetResourceID + b.subscriptionID = object.subscriptionID + b.tenantID = object.tenantID + return b +} + +// Build creates a 'azure' object using the configuration stored in the builder. +func (b *AzureBuilder) Build() (object *Azure, err error) { + object = new(Azure) + object.bitmap_ = b.bitmap_ + object.managedResourceGroupName = b.managedResourceGroupName + object.networkSecurityGroupResourceID = b.networkSecurityGroupResourceID + object.resourceGroupName = b.resourceGroupName + object.resourceName = b.resourceName + object.subnetResourceID = b.subnetResourceID + object.subscriptionID = b.subscriptionID + object.tenantID = b.tenantID + return +} diff --git a/clustersmgmt/v2alpha1/azure_list_builder.go b/clustersmgmt/v2alpha1/azure_list_builder.go new file mode 100644 index 00000000..93798c8f --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AzureListBuilder contains the data and logic needed to build +// 'azure' objects. +type AzureListBuilder struct { + items []*AzureBuilder +} + +// NewAzureList creates a new builder of 'azure' objects. +func NewAzureList() *AzureListBuilder { + return new(AzureListBuilder) +} + +// Items sets the items of the list. +func (b *AzureListBuilder) Items(values ...*AzureBuilder) *AzureListBuilder { + b.items = make([]*AzureBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AzureListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AzureListBuilder) Copy(list *AzureList) *AzureListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AzureBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAzure().Copy(v) + } + } + return b +} + +// Build creates a list of 'azure' objects using the +// configuration stored in the builder. +func (b *AzureListBuilder) Build() (list *AzureList, err error) { + items := make([]*Azure, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AzureList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/azure_list_type_json.go b/clustersmgmt/v2alpha1/azure_list_type_json.go new file mode 100644 index 00000000..e6732dfe --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAzureList writes a list of values of the 'azure' type to +// the given writer. +func MarshalAzureList(list []*Azure, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAzureList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAzureList writes a list of value of the 'azure' type to +// the given stream. +func writeAzureList(list []*Azure, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAzure(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAzureList reads a list of values of the 'azure' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAzureList(source interface{}) (items []*Azure, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAzureList(iterator) + err = iterator.Error + return +} + +// readAzureList reads list of values of the ”azure' type from +// the given iterator. +func readAzureList(iterator *jsoniter.Iterator) []*Azure { + list := []*Azure{} + for iterator.ReadArray() { + item := readAzure(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/azure_node_pool_builder.go b/clustersmgmt/v2alpha1/azure_node_pool_builder.go new file mode 100644 index 00000000..82dce69d --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_node_pool_builder.go @@ -0,0 +1,103 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AzureNodePoolBuilder contains the data and logic needed to build 'azure_node_pool' objects. +// +// Representation of azure node pool specific parameters. +type AzureNodePoolBuilder struct { + bitmap_ uint32 + osDiskSizeGibibytes int + osDiskStorageAccountType string + vmSize string + resourceName string + ephemeralOSDiskEnabled bool +} + +// NewAzureNodePool creates a new builder of 'azure_node_pool' objects. +func NewAzureNodePool() *AzureNodePoolBuilder { + return &AzureNodePoolBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *AzureNodePoolBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// OSDiskSizeGibibytes sets the value of the 'OS_disk_size_gibibytes' attribute to the given value. +func (b *AzureNodePoolBuilder) OSDiskSizeGibibytes(value int) *AzureNodePoolBuilder { + b.osDiskSizeGibibytes = value + b.bitmap_ |= 1 + return b +} + +// OSDiskStorageAccountType sets the value of the 'OS_disk_storage_account_type' attribute to the given value. +func (b *AzureNodePoolBuilder) OSDiskStorageAccountType(value string) *AzureNodePoolBuilder { + b.osDiskStorageAccountType = value + b.bitmap_ |= 2 + return b +} + +// VMSize sets the value of the 'VM_size' attribute to the given value. +func (b *AzureNodePoolBuilder) VMSize(value string) *AzureNodePoolBuilder { + b.vmSize = value + b.bitmap_ |= 4 + return b +} + +// EphemeralOSDiskEnabled sets the value of the 'ephemeral_OS_disk_enabled' attribute to the given value. +func (b *AzureNodePoolBuilder) EphemeralOSDiskEnabled(value bool) *AzureNodePoolBuilder { + b.ephemeralOSDiskEnabled = value + b.bitmap_ |= 8 + return b +} + +// ResourceName sets the value of the 'resource_name' attribute to the given value. +func (b *AzureNodePoolBuilder) ResourceName(value string) *AzureNodePoolBuilder { + b.resourceName = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *AzureNodePoolBuilder) Copy(object *AzureNodePool) *AzureNodePoolBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.osDiskSizeGibibytes = object.osDiskSizeGibibytes + b.osDiskStorageAccountType = object.osDiskStorageAccountType + b.vmSize = object.vmSize + b.ephemeralOSDiskEnabled = object.ephemeralOSDiskEnabled + b.resourceName = object.resourceName + return b +} + +// Build creates a 'azure_node_pool' object using the configuration stored in the builder. +func (b *AzureNodePoolBuilder) Build() (object *AzureNodePool, err error) { + object = new(AzureNodePool) + object.bitmap_ = b.bitmap_ + object.osDiskSizeGibibytes = b.osDiskSizeGibibytes + object.osDiskStorageAccountType = b.osDiskStorageAccountType + object.vmSize = b.vmSize + object.ephemeralOSDiskEnabled = b.ephemeralOSDiskEnabled + object.resourceName = b.resourceName + return +} diff --git a/clustersmgmt/v2alpha1/azure_node_pool_list_builder.go b/clustersmgmt/v2alpha1/azure_node_pool_list_builder.go new file mode 100644 index 00000000..b5940516 --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_node_pool_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AzureNodePoolListBuilder contains the data and logic needed to build +// 'azure_node_pool' objects. +type AzureNodePoolListBuilder struct { + items []*AzureNodePoolBuilder +} + +// NewAzureNodePoolList creates a new builder of 'azure_node_pool' objects. +func NewAzureNodePoolList() *AzureNodePoolListBuilder { + return new(AzureNodePoolListBuilder) +} + +// Items sets the items of the list. +func (b *AzureNodePoolListBuilder) Items(values ...*AzureNodePoolBuilder) *AzureNodePoolListBuilder { + b.items = make([]*AzureNodePoolBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *AzureNodePoolListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *AzureNodePoolListBuilder) Copy(list *AzureNodePoolList) *AzureNodePoolListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*AzureNodePoolBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewAzureNodePool().Copy(v) + } + } + return b +} + +// Build creates a list of 'azure_node_pool' objects using the +// configuration stored in the builder. +func (b *AzureNodePoolListBuilder) Build() (list *AzureNodePoolList, err error) { + items := make([]*AzureNodePool, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(AzureNodePoolList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/azure_node_pool_list_type_json.go b/clustersmgmt/v2alpha1/azure_node_pool_list_type_json.go new file mode 100644 index 00000000..e2978049 --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_node_pool_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAzureNodePoolList writes a list of values of the 'azure_node_pool' type to +// the given writer. +func MarshalAzureNodePoolList(list []*AzureNodePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAzureNodePoolList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAzureNodePoolList writes a list of value of the 'azure_node_pool' type to +// the given stream. +func writeAzureNodePoolList(list []*AzureNodePool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeAzureNodePool(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalAzureNodePoolList reads a list of values of the 'azure_node_pool' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalAzureNodePoolList(source interface{}) (items []*AzureNodePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readAzureNodePoolList(iterator) + err = iterator.Error + return +} + +// readAzureNodePoolList reads list of values of the ”azure_node_pool' type from +// the given iterator. +func readAzureNodePoolList(iterator *jsoniter.Iterator) []*AzureNodePool { + list := []*AzureNodePool{} + for iterator.ReadArray() { + item := readAzureNodePool(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/azure_node_pool_type.go b/clustersmgmt/v2alpha1/azure_node_pool_type.go new file mode 100644 index 00000000..5679274a --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_node_pool_type.go @@ -0,0 +1,288 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// AzureNodePool represents the values of the 'azure_node_pool' type. +// +// Representation of azure node pool specific parameters. +type AzureNodePool struct { + bitmap_ uint32 + osDiskSizeGibibytes int + osDiskStorageAccountType string + vmSize string + resourceName string + ephemeralOSDiskEnabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *AzureNodePool) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// OSDiskSizeGibibytes returns the value of the 'OS_disk_size_gibibytes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The size in GiB to assign to the OS disks of the +// Nodes in the Node Pool. The property +// is the number of bytes x 1024^3. +// If not specified, OS disk size is 30 GiB. +func (o *AzureNodePool) OSDiskSizeGibibytes() int { + if o != nil && o.bitmap_&1 != 0 { + return o.osDiskSizeGibibytes + } + return 0 +} + +// GetOSDiskSizeGibibytes returns the value of the 'OS_disk_size_gibibytes' attribute and +// a flag indicating if the attribute has a value. +// +// The size in GiB to assign to the OS disks of the +// Nodes in the Node Pool. The property +// is the number of bytes x 1024^3. +// If not specified, OS disk size is 30 GiB. +func (o *AzureNodePool) GetOSDiskSizeGibibytes() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.osDiskSizeGibibytes + } + return +} + +// OSDiskStorageAccountType returns the value of the 'OS_disk_storage_account_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The disk storage account type to use for the OS disks of the Nodes in the +// Node Pool. Valid values are: +// * Standard_LRS: HDD +// * StandardSSD_LRS: Standard SSD +// * Premium_LRS: Premium SDD +// * UltraSSD_LRS: Ultra SDD +// +// If not specified, `Premium_LRS` is used. +func (o *AzureNodePool) OSDiskStorageAccountType() string { + if o != nil && o.bitmap_&2 != 0 { + return o.osDiskStorageAccountType + } + return "" +} + +// GetOSDiskStorageAccountType returns the value of the 'OS_disk_storage_account_type' attribute and +// a flag indicating if the attribute has a value. +// +// The disk storage account type to use for the OS disks of the Nodes in the +// Node Pool. Valid values are: +// * Standard_LRS: HDD +// * StandardSSD_LRS: Standard SSD +// * Premium_LRS: Premium SDD +// * UltraSSD_LRS: Ultra SDD +// +// If not specified, `Premium_LRS` is used. +func (o *AzureNodePool) GetOSDiskStorageAccountType() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.osDiskStorageAccountType + } + return +} + +// VMSize returns the value of the 'VM_size' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The Azure Virtual Machine size identifier used for the +// Nodes of the Node Pool. +// Availability of VM sizes are dependent on the Azure Location +// of the parent Cluster. +// Required during creation. +func (o *AzureNodePool) VMSize() string { + if o != nil && o.bitmap_&4 != 0 { + return o.vmSize + } + return "" +} + +// GetVMSize returns the value of the 'VM_size' attribute and +// a flag indicating if the attribute has a value. +// +// The Azure Virtual Machine size identifier used for the +// Nodes of the Node Pool. +// Availability of VM sizes are dependent on the Azure Location +// of the parent Cluster. +// Required during creation. +func (o *AzureNodePool) GetVMSize() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.vmSize + } + return +} + +// EphemeralOSDiskEnabled returns the value of the 'ephemeral_OS_disk_enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Enables Ephemeral OS Disks for the Nodes in the Node Pool. +// If not specified, no Ephemeral OS Disks are used. +func (o *AzureNodePool) EphemeralOSDiskEnabled() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.ephemeralOSDiskEnabled + } + return false +} + +// GetEphemeralOSDiskEnabled returns the value of the 'ephemeral_OS_disk_enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Enables Ephemeral OS Disks for the Nodes in the Node Pool. +// If not specified, no Ephemeral OS Disks are used. +func (o *AzureNodePool) GetEphemeralOSDiskEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.ephemeralOSDiskEnabled + } + return +} + +// ResourceName returns the value of the 'resource_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ResourceName is the Azure Resource Name of the NodePool. +// ResourceName must be within the Azure Resource Group Name of the parent +// Cluster it belongs to. +// ResourceName must be located in the same Azure Location as the parent +// Cluster it belongs to. +// ResourceName must be located in the same Azure Subscription as the parent +// Cluster it belongs to. +// ResourceName must belong to the same Microsoft Entra Tenant ID as the parent +// Cluster it belongs to. +// Required during creation. +// Immutable. +func (o *AzureNodePool) ResourceName() string { + if o != nil && o.bitmap_&16 != 0 { + return o.resourceName + } + return "" +} + +// GetResourceName returns the value of the 'resource_name' attribute and +// a flag indicating if the attribute has a value. +// +// ResourceName is the Azure Resource Name of the NodePool. +// ResourceName must be within the Azure Resource Group Name of the parent +// Cluster it belongs to. +// ResourceName must be located in the same Azure Location as the parent +// Cluster it belongs to. +// ResourceName must be located in the same Azure Subscription as the parent +// Cluster it belongs to. +// ResourceName must belong to the same Microsoft Entra Tenant ID as the parent +// Cluster it belongs to. +// Required during creation. +// Immutable. +func (o *AzureNodePool) GetResourceName() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.resourceName + } + return +} + +// AzureNodePoolListKind is the name of the type used to represent list of objects of +// type 'azure_node_pool'. +const AzureNodePoolListKind = "AzureNodePoolList" + +// AzureNodePoolListLinkKind is the name of the type used to represent links to list +// of objects of type 'azure_node_pool'. +const AzureNodePoolListLinkKind = "AzureNodePoolListLink" + +// AzureNodePoolNilKind is the name of the type used to nil lists of objects of +// type 'azure_node_pool'. +const AzureNodePoolListNilKind = "AzureNodePoolListNil" + +// AzureNodePoolList is a list of values of the 'azure_node_pool' type. +type AzureNodePoolList struct { + href string + link bool + items []*AzureNodePool +} + +// Len returns the length of the list. +func (l *AzureNodePoolList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AzureNodePoolList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AzureNodePoolList) Get(i int) *AzureNodePool { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AzureNodePoolList) Slice() []*AzureNodePool { + var slice []*AzureNodePool + if l == nil { + slice = make([]*AzureNodePool, 0) + } else { + slice = make([]*AzureNodePool, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AzureNodePoolList) Each(f func(item *AzureNodePool) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AzureNodePoolList) Range(f func(index int, item *AzureNodePool) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/azure_node_pool_type_json.go b/clustersmgmt/v2alpha1/azure_node_pool_type_json.go new file mode 100644 index 00000000..9749ed5f --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_node_pool_type_json.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAzureNodePool writes a value of the 'azure_node_pool' type to the given writer. +func MarshalAzureNodePool(object *AzureNodePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAzureNodePool(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAzureNodePool writes a value of the 'azure_node_pool' type to the given stream. +func writeAzureNodePool(object *AzureNodePool, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("os_disk_size_gibibytes") + stream.WriteInt(object.osDiskSizeGibibytes) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("os_disk_storage_account_type") + stream.WriteString(object.osDiskStorageAccountType) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("vm_size") + stream.WriteString(object.vmSize) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ephemeral_os_disk_enabled") + stream.WriteBool(object.ephemeralOSDiskEnabled) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource_name") + stream.WriteString(object.resourceName) + } + stream.WriteObjectEnd() +} + +// UnmarshalAzureNodePool reads a value of the 'azure_node_pool' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAzureNodePool(source interface{}) (object *AzureNodePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAzureNodePool(iterator) + err = iterator.Error + return +} + +// readAzureNodePool reads a value of the 'azure_node_pool' type from the given iterator. +func readAzureNodePool(iterator *jsoniter.Iterator) *AzureNodePool { + object := &AzureNodePool{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "os_disk_size_gibibytes": + value := iterator.ReadInt() + object.osDiskSizeGibibytes = value + object.bitmap_ |= 1 + case "os_disk_storage_account_type": + value := iterator.ReadString() + object.osDiskStorageAccountType = value + object.bitmap_ |= 2 + case "vm_size": + value := iterator.ReadString() + object.vmSize = value + object.bitmap_ |= 4 + case "ephemeral_os_disk_enabled": + value := iterator.ReadBool() + object.ephemeralOSDiskEnabled = value + object.bitmap_ |= 8 + case "resource_name": + value := iterator.ReadString() + object.resourceName = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/azure_type.go b/clustersmgmt/v2alpha1/azure_type.go new file mode 100644 index 00000000..d83143a1 --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_type.go @@ -0,0 +1,376 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Azure represents the values of the 'azure' type. +// +// Microsoft Azure settings of a cluster. +type Azure struct { + bitmap_ uint32 + managedResourceGroupName string + networkSecurityGroupResourceID string + resourceGroupName string + resourceName string + subnetResourceID string + subscriptionID string + tenantID string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Azure) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ManagedResourceGroupName returns the value of the 'managed_resource_group_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The name of the Azure Resource Group where the Azure Resources related +// to the cluster are created. The Azure Resource Group is created with the given +// value, within the Azure Subscription `subscription_id` of the cluster. +// `managed_resource_group_name` cannot be equal to the value of `managed_resource_group`. +// `managed_resource_group_name` is located in the same Azure location as the +// cluster's region. +// Not to be confused with `resource_group_name`, which is the Azure Resource Group Name +// where the own Azure Resource associated to the cluster resides. +func (o *Azure) ManagedResourceGroupName() string { + if o != nil && o.bitmap_&1 != 0 { + return o.managedResourceGroupName + } + return "" +} + +// GetManagedResourceGroupName returns the value of the 'managed_resource_group_name' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The name of the Azure Resource Group where the Azure Resources related +// to the cluster are created. The Azure Resource Group is created with the given +// value, within the Azure Subscription `subscription_id` of the cluster. +// `managed_resource_group_name` cannot be equal to the value of `managed_resource_group`. +// `managed_resource_group_name` is located in the same Azure location as the +// cluster's region. +// Not to be confused with `resource_group_name`, which is the Azure Resource Group Name +// where the own Azure Resource associated to the cluster resides. +func (o *Azure) GetManagedResourceGroupName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.managedResourceGroupName + } + return +} + +// NetworkSecurityGroupResourceID returns the value of the 'network_security_group_resource_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The Azure Resource ID of a pre-existing +// Azure Network Security Group. +// The Network Security Group specified in network_security_group_resource_id +// must already be associated to the Azure Subnet `subnet_resource_id`. +// It is the Azure Network Security Group associated to the cluster's subnet +// specified in `subnet_resource_id`. +// `network_security_group_resource_id` must be located in the same Azure +// location as the cluster's region. +// The Azure Subscription specified as part of +// `network_security_group_resource_id` must be located in the same Azure +// Subscription as `subscription_id`. +// The Azure Resource Group Name specified as part of `network_security_group_resource_id` +// must belong to the Azure Subscription `subscription_id`, and in the same +// Azure location as the cluster's region. +// The Azure Resource Group Name specified as part of `network_security_group_resource_id` +// must be a different Resource Group Name than the one specified in +// `managed_resource_group_name`. +// The Azure Resource Group Name specified as part of `network_security_group_resource_id` +// can be the same, or a different one than the one specified in +// `resource_group_name`. +func (o *Azure) NetworkSecurityGroupResourceID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.networkSecurityGroupResourceID + } + return "" +} + +// GetNetworkSecurityGroupResourceID returns the value of the 'network_security_group_resource_ID' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The Azure Resource ID of a pre-existing +// Azure Network Security Group. +// The Network Security Group specified in network_security_group_resource_id +// must already be associated to the Azure Subnet `subnet_resource_id`. +// It is the Azure Network Security Group associated to the cluster's subnet +// specified in `subnet_resource_id`. +// `network_security_group_resource_id` must be located in the same Azure +// location as the cluster's region. +// The Azure Subscription specified as part of +// `network_security_group_resource_id` must be located in the same Azure +// Subscription as `subscription_id`. +// The Azure Resource Group Name specified as part of `network_security_group_resource_id` +// must belong to the Azure Subscription `subscription_id`, and in the same +// Azure location as the cluster's region. +// The Azure Resource Group Name specified as part of `network_security_group_resource_id` +// must be a different Resource Group Name than the one specified in +// `managed_resource_group_name`. +// The Azure Resource Group Name specified as part of `network_security_group_resource_id` +// can be the same, or a different one than the one specified in +// `resource_group_name`. +func (o *Azure) GetNetworkSecurityGroupResourceID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.networkSecurityGroupResourceID + } + return +} + +// ResourceGroupName returns the value of the 'resource_group_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The Azure Resource Group Name of the cluster. It must be within `subscription_id` +// of the cluster. `resource_group_name` is located in the same Azure location +// as the cluster's region. +func (o *Azure) ResourceGroupName() string { + if o != nil && o.bitmap_&4 != 0 { + return o.resourceGroupName + } + return "" +} + +// GetResourceGroupName returns the value of the 'resource_group_name' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The Azure Resource Group Name of the cluster. It must be within `subscription_id` +// of the cluster. `resource_group_name` is located in the same Azure location +// as the cluster's region. +func (o *Azure) GetResourceGroupName() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.resourceGroupName + } + return +} + +// ResourceName returns the value of the 'resource_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The Azure Resource Name of the cluster. It must be within the +// Azure Resource Group Name `resource_group_name`. +// `resource_name` is located in the same Azure location as the cluster's region. +func (o *Azure) ResourceName() string { + if o != nil && o.bitmap_&8 != 0 { + return o.resourceName + } + return "" +} + +// GetResourceName returns the value of the 'resource_name' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The Azure Resource Name of the cluster. It must be within the +// Azure Resource Group Name `resource_group_name`. +// `resource_name` is located in the same Azure location as the cluster's region. +func (o *Azure) GetResourceName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.resourceName + } + return +} + +// SubnetResourceID returns the value of the 'subnet_resource_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The Azure Resource ID of a pre-existing Azure +// Subnet. It is an Azure Subnet used for the Data Plane of the cluster. +// `subnet_resource_id` must be located in the same Azure location as the +// cluster's region. +// The Azure Subscription specified as part of the `subnet_resource_id` +// must be located in the same Azure Subscription as `subscription_id`. +// The Azure Resource Group Name specified as part of `subnet_resource_id` +// must belong to the Azure Subscription `subscription_id`, and in the same +// Azure location as the cluster's region. +// The Azure Resource Group Name specified as part of `subnet_resource_id` +// must be a different Resource Group Name than the one specified in +// `managed_resource_group_name`. +// The Azure Resource Group Name specified as part of the `subnet_resource_id` +// can be the same, or a different one than the one specified in +// `resource_group_name`. +func (o *Azure) SubnetResourceID() string { + if o != nil && o.bitmap_&16 != 0 { + return o.subnetResourceID + } + return "" +} + +// GetSubnetResourceID returns the value of the 'subnet_resource_ID' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The Azure Resource ID of a pre-existing Azure +// Subnet. It is an Azure Subnet used for the Data Plane of the cluster. +// `subnet_resource_id` must be located in the same Azure location as the +// cluster's region. +// The Azure Subscription specified as part of the `subnet_resource_id` +// must be located in the same Azure Subscription as `subscription_id`. +// The Azure Resource Group Name specified as part of `subnet_resource_id` +// must belong to the Azure Subscription `subscription_id`, and in the same +// Azure location as the cluster's region. +// The Azure Resource Group Name specified as part of `subnet_resource_id` +// must be a different Resource Group Name than the one specified in +// `managed_resource_group_name`. +// The Azure Resource Group Name specified as part of the `subnet_resource_id` +// can be the same, or a different one than the one specified in +// `resource_group_name`. +func (o *Azure) GetSubnetResourceID() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.subnetResourceID + } + return +} + +// SubscriptionID returns the value of the 'subscription_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The Azure Subscription ID associated with the cluster. It must belong to +// the Microsoft Entra Tenant ID `tenant_id`. +func (o *Azure) SubscriptionID() string { + if o != nil && o.bitmap_&32 != 0 { + return o.subscriptionID + } + return "" +} + +// GetSubscriptionID returns the value of the 'subscription_ID' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The Azure Subscription ID associated with the cluster. It must belong to +// the Microsoft Entra Tenant ID `tenant_id`. +func (o *Azure) GetSubscriptionID() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.subscriptionID + } + return +} + +// TenantID returns the value of the 'tenant_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// [Required] The Microsoft Entra Tenant ID where the cluster belongs. +func (o *Azure) TenantID() string { + if o != nil && o.bitmap_&64 != 0 { + return o.tenantID + } + return "" +} + +// GetTenantID returns the value of the 'tenant_ID' attribute and +// a flag indicating if the attribute has a value. +// +// [Required] The Microsoft Entra Tenant ID where the cluster belongs. +func (o *Azure) GetTenantID() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.tenantID + } + return +} + +// AzureListKind is the name of the type used to represent list of objects of +// type 'azure'. +const AzureListKind = "AzureList" + +// AzureListLinkKind is the name of the type used to represent links to list +// of objects of type 'azure'. +const AzureListLinkKind = "AzureListLink" + +// AzureNilKind is the name of the type used to nil lists of objects of +// type 'azure'. +const AzureListNilKind = "AzureListNil" + +// AzureList is a list of values of the 'azure' type. +type AzureList struct { + href string + link bool + items []*Azure +} + +// Len returns the length of the list. +func (l *AzureList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *AzureList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *AzureList) Get(i int) *Azure { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *AzureList) Slice() []*Azure { + var slice []*Azure + if l == nil { + slice = make([]*Azure, 0) + } else { + slice = make([]*Azure, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *AzureList) Each(f func(item *Azure) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *AzureList) Range(f func(index int, item *Azure) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/azure_type_json.go b/clustersmgmt/v2alpha1/azure_type_json.go new file mode 100644 index 00000000..c3133b6f --- /dev/null +++ b/clustersmgmt/v2alpha1/azure_type_json.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalAzure writes a value of the 'azure' type to the given writer. +func MarshalAzure(object *Azure, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeAzure(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeAzure writes a value of the 'azure' type to the given stream. +func writeAzure(object *Azure, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managed_resource_group_name") + stream.WriteString(object.managedResourceGroupName) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("network_security_group_resource_id") + stream.WriteString(object.networkSecurityGroupResourceID) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource_group_name") + stream.WriteString(object.resourceGroupName) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource_name") + stream.WriteString(object.resourceName) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnet_resource_id") + stream.WriteString(object.subnetResourceID) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subscription_id") + stream.WriteString(object.subscriptionID) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tenant_id") + stream.WriteString(object.tenantID) + } + stream.WriteObjectEnd() +} + +// UnmarshalAzure reads a value of the 'azure' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalAzure(source interface{}) (object *Azure, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readAzure(iterator) + err = iterator.Error + return +} + +// readAzure reads a value of the 'azure' type from the given iterator. +func readAzure(iterator *jsoniter.Iterator) *Azure { + object := &Azure{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "managed_resource_group_name": + value := iterator.ReadString() + object.managedResourceGroupName = value + object.bitmap_ |= 1 + case "network_security_group_resource_id": + value := iterator.ReadString() + object.networkSecurityGroupResourceID = value + object.bitmap_ |= 2 + case "resource_group_name": + value := iterator.ReadString() + object.resourceGroupName = value + object.bitmap_ |= 4 + case "resource_name": + value := iterator.ReadString() + object.resourceName = value + object.bitmap_ |= 8 + case "subnet_resource_id": + value := iterator.ReadString() + object.subnetResourceID = value + object.bitmap_ |= 16 + case "subscription_id": + value := iterator.ReadString() + object.subscriptionID = value + object.bitmap_ |= 32 + case "tenant_id": + value := iterator.ReadString() + object.tenantID = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/billing_model_item_builder.go b/clustersmgmt/v2alpha1/billing_model_item_builder.go new file mode 100644 index 00000000..6b5cb372 --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_item_builder.go @@ -0,0 +1,119 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// BillingModelItemBuilder contains the data and logic needed to build 'billing_model_item' objects. +// +// BillingModelItem represents a billing model +type BillingModelItemBuilder struct { + bitmap_ uint32 + id string + href string + billingModelType string + description string + displayName string + marketplace string +} + +// NewBillingModelItem creates a new builder of 'billing_model_item' objects. +func NewBillingModelItem() *BillingModelItemBuilder { + return &BillingModelItemBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *BillingModelItemBuilder) Link(value bool) *BillingModelItemBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *BillingModelItemBuilder) ID(value string) *BillingModelItemBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *BillingModelItemBuilder) HREF(value string) *BillingModelItemBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *BillingModelItemBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// BillingModelType sets the value of the 'billing_model_type' attribute to the given value. +func (b *BillingModelItemBuilder) BillingModelType(value string) *BillingModelItemBuilder { + b.billingModelType = value + b.bitmap_ |= 8 + return b +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *BillingModelItemBuilder) Description(value string) *BillingModelItemBuilder { + b.description = value + b.bitmap_ |= 16 + return b +} + +// DisplayName sets the value of the 'display_name' attribute to the given value. +func (b *BillingModelItemBuilder) DisplayName(value string) *BillingModelItemBuilder { + b.displayName = value + b.bitmap_ |= 32 + return b +} + +// Marketplace sets the value of the 'marketplace' attribute to the given value. +func (b *BillingModelItemBuilder) Marketplace(value string) *BillingModelItemBuilder { + b.marketplace = value + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *BillingModelItemBuilder) Copy(object *BillingModelItem) *BillingModelItemBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.billingModelType = object.billingModelType + b.description = object.description + b.displayName = object.displayName + b.marketplace = object.marketplace + return b +} + +// Build creates a 'billing_model_item' object using the configuration stored in the builder. +func (b *BillingModelItemBuilder) Build() (object *BillingModelItem, err error) { + object = new(BillingModelItem) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.billingModelType = b.billingModelType + object.description = b.description + object.displayName = b.displayName + object.marketplace = b.marketplace + return +} diff --git a/clustersmgmt/v2alpha1/billing_model_item_list_builder.go b/clustersmgmt/v2alpha1/billing_model_item_list_builder.go new file mode 100644 index 00000000..7f742017 --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_item_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// BillingModelItemListBuilder contains the data and logic needed to build +// 'billing_model_item' objects. +type BillingModelItemListBuilder struct { + items []*BillingModelItemBuilder +} + +// NewBillingModelItemList creates a new builder of 'billing_model_item' objects. +func NewBillingModelItemList() *BillingModelItemListBuilder { + return new(BillingModelItemListBuilder) +} + +// Items sets the items of the list. +func (b *BillingModelItemListBuilder) Items(values ...*BillingModelItemBuilder) *BillingModelItemListBuilder { + b.items = make([]*BillingModelItemBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *BillingModelItemListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *BillingModelItemListBuilder) Copy(list *BillingModelItemList) *BillingModelItemListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*BillingModelItemBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewBillingModelItem().Copy(v) + } + } + return b +} + +// Build creates a list of 'billing_model_item' objects using the +// configuration stored in the builder. +func (b *BillingModelItemListBuilder) Build() (list *BillingModelItemList, err error) { + items := make([]*BillingModelItem, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(BillingModelItemList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/billing_model_item_list_type_json.go b/clustersmgmt/v2alpha1/billing_model_item_list_type_json.go new file mode 100644 index 00000000..a085e61c --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_item_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBillingModelItemList writes a list of values of the 'billing_model_item' type to +// the given writer. +func MarshalBillingModelItemList(list []*BillingModelItem, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBillingModelItemList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBillingModelItemList writes a list of value of the 'billing_model_item' type to +// the given stream. +func writeBillingModelItemList(list []*BillingModelItem, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeBillingModelItem(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalBillingModelItemList reads a list of values of the 'billing_model_item' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalBillingModelItemList(source interface{}) (items []*BillingModelItem, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readBillingModelItemList(iterator) + err = iterator.Error + return +} + +// readBillingModelItemList reads list of values of the ”billing_model_item' type from +// the given iterator. +func readBillingModelItemList(iterator *jsoniter.Iterator) []*BillingModelItem { + list := []*BillingModelItem{} + for iterator.ReadArray() { + item := readBillingModelItem(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/billing_model_item_type.go b/clustersmgmt/v2alpha1/billing_model_item_type.go new file mode 100644 index 00000000..3b1f645e --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_item_type.go @@ -0,0 +1,314 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// BillingModelItemKind is the name of the type used to represent objects +// of type 'billing_model_item'. +const BillingModelItemKind = "BillingModelItem" + +// BillingModelItemLinkKind is the name of the type used to represent links +// to objects of type 'billing_model_item'. +const BillingModelItemLinkKind = "BillingModelItemLink" + +// BillingModelItemNilKind is the name of the type used to nil references +// to objects of type 'billing_model_item'. +const BillingModelItemNilKind = "BillingModelItemNil" + +// BillingModelItem represents the values of the 'billing_model_item' type. +// +// BillingModelItem represents a billing model +type BillingModelItem struct { + bitmap_ uint32 + id string + href string + billingModelType string + description string + displayName string + marketplace string +} + +// Kind returns the name of the type of the object. +func (o *BillingModelItem) Kind() string { + if o == nil { + return BillingModelItemNilKind + } + if o.bitmap_&1 != 0 { + return BillingModelItemLinkKind + } + return BillingModelItemKind +} + +// Link returns true iif this is a link. +func (o *BillingModelItem) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *BillingModelItem) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *BillingModelItem) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *BillingModelItem) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *BillingModelItem) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *BillingModelItem) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// BillingModelType returns the value of the 'billing_model_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// BillingModelType is the type of the BillingModel. e.g. standard, marketplace. +func (o *BillingModelItem) BillingModelType() string { + if o != nil && o.bitmap_&8 != 0 { + return o.billingModelType + } + return "" +} + +// GetBillingModelType returns the value of the 'billing_model_type' attribute and +// a flag indicating if the attribute has a value. +// +// BillingModelType is the type of the BillingModel. e.g. standard, marketplace. +func (o *BillingModelItem) GetBillingModelType() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.billingModelType + } + return +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Single line description of the billing model. +func (o *BillingModelItem) Description() string { + if o != nil && o.bitmap_&16 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Single line description of the billing model. +func (o *BillingModelItem) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.description + } + return +} + +// DisplayName returns the value of the 'display_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// User friendly display name of the billing model. +func (o *BillingModelItem) DisplayName() string { + if o != nil && o.bitmap_&32 != 0 { + return o.displayName + } + return "" +} + +// GetDisplayName returns the value of the 'display_name' attribute and +// a flag indicating if the attribute has a value. +// +// User friendly display name of the billing model. +func (o *BillingModelItem) GetDisplayName() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.displayName + } + return +} + +// Marketplace returns the value of the 'marketplace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates the marketplace of the billing model. e.g. gcp, aws, etc. +func (o *BillingModelItem) Marketplace() string { + if o != nil && o.bitmap_&64 != 0 { + return o.marketplace + } + return "" +} + +// GetMarketplace returns the value of the 'marketplace' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates the marketplace of the billing model. e.g. gcp, aws, etc. +func (o *BillingModelItem) GetMarketplace() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.marketplace + } + return +} + +// BillingModelItemListKind is the name of the type used to represent list of objects of +// type 'billing_model_item'. +const BillingModelItemListKind = "BillingModelItemList" + +// BillingModelItemListLinkKind is the name of the type used to represent links to list +// of objects of type 'billing_model_item'. +const BillingModelItemListLinkKind = "BillingModelItemListLink" + +// BillingModelItemNilKind is the name of the type used to nil lists of objects of +// type 'billing_model_item'. +const BillingModelItemListNilKind = "BillingModelItemListNil" + +// BillingModelItemList is a list of values of the 'billing_model_item' type. +type BillingModelItemList struct { + href string + link bool + items []*BillingModelItem +} + +// Kind returns the name of the type of the object. +func (l *BillingModelItemList) Kind() string { + if l == nil { + return BillingModelItemListNilKind + } + if l.link { + return BillingModelItemListLinkKind + } + return BillingModelItemListKind +} + +// Link returns true iif this is a link. +func (l *BillingModelItemList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *BillingModelItemList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *BillingModelItemList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *BillingModelItemList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *BillingModelItemList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *BillingModelItemList) Get(i int) *BillingModelItem { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *BillingModelItemList) Slice() []*BillingModelItem { + var slice []*BillingModelItem + if l == nil { + slice = make([]*BillingModelItem, 0) + } else { + slice = make([]*BillingModelItem, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *BillingModelItemList) Each(f func(item *BillingModelItem) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *BillingModelItemList) Range(f func(index int, item *BillingModelItem) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/billing_model_item_type_json.go b/clustersmgmt/v2alpha1/billing_model_item_type_json.go new file mode 100644 index 00000000..68ad72d9 --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_item_type_json.go @@ -0,0 +1,159 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBillingModelItem writes a value of the 'billing_model_item' type to the given writer. +func MarshalBillingModelItem(object *BillingModelItem, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBillingModelItem(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBillingModelItem writes a value of the 'billing_model_item' type to the given stream. +func writeBillingModelItem(object *BillingModelItem, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(BillingModelItemLinkKind) + } else { + stream.WriteString(BillingModelItemKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing_model_type") + stream.WriteString(object.billingModelType) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("display_name") + stream.WriteString(object.displayName) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("marketplace") + stream.WriteString(object.marketplace) + } + stream.WriteObjectEnd() +} + +// UnmarshalBillingModelItem reads a value of the 'billing_model_item' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalBillingModelItem(source interface{}) (object *BillingModelItem, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readBillingModelItem(iterator) + err = iterator.Error + return +} + +// readBillingModelItem reads a value of the 'billing_model_item' type from the given iterator. +func readBillingModelItem(iterator *jsoniter.Iterator) *BillingModelItem { + object := &BillingModelItem{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == BillingModelItemLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "billing_model_type": + value := iterator.ReadString() + object.billingModelType = value + object.bitmap_ |= 8 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 16 + case "display_name": + value := iterator.ReadString() + object.displayName = value + object.bitmap_ |= 32 + case "marketplace": + value := iterator.ReadString() + object.marketplace = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/billing_model_list_type_json.go b/clustersmgmt/v2alpha1/billing_model_list_type_json.go new file mode 100644 index 00000000..82288dc4 --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBillingModelList writes a list of values of the 'billing_model' type to +// the given writer. +func MarshalBillingModelList(list []BillingModel, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBillingModelList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBillingModelList writes a list of value of the 'billing_model' type to +// the given stream. +func writeBillingModelList(list []BillingModel, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalBillingModelList reads a list of values of the 'billing_model' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalBillingModelList(source interface{}) (items []BillingModel, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readBillingModelList(iterator) + err = iterator.Error + return +} + +// readBillingModelList reads list of values of the ”billing_model' type from +// the given iterator. +func readBillingModelList(iterator *jsoniter.Iterator) []BillingModel { + list := []BillingModel{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := BillingModel(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/billing_model_type.go b/clustersmgmt/v2alpha1/billing_model_type.go new file mode 100644 index 00000000..26b3caa4 --- /dev/null +++ b/clustersmgmt/v2alpha1/billing_model_type.go @@ -0,0 +1,38 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// BillingModel represents the values of the 'billing_model' enumerated type. +type BillingModel string + +const ( + // BillingModel Marketplace Legacy Marketplace billing model. Currently only used for tests. Use cloud-provider specific billing models instead. + BillingModelMarketplace BillingModel = "marketplace" + // AWS Marketplace billing model. + BillingModelMarketplaceAWS BillingModel = "marketplace-aws" + // GCP Marketplace billing model. + BillingModelMarketplaceGCP BillingModel = "marketplace-gcp" + // RH Marketplace billing model. + BillingModelMarketplaceRHM BillingModel = "marketplace-rhm" + // Azure Marketplace billing model. + BillingModelMarketplaceAzure BillingModel = "marketplace-azure" + // Standard. This is the default billing model + BillingModelStandard BillingModel = "standard" +) diff --git a/clustersmgmt/v2alpha1/boolean_list_type_json.go b/clustersmgmt/v2alpha1/boolean_list_type_json.go new file mode 100644 index 00000000..333da3c1 --- /dev/null +++ b/clustersmgmt/v2alpha1/boolean_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBooleanList writes a list of values of the 'boolean' type to +// the given writer. +func MarshalBooleanList(list []bool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBooleanList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBooleanList writes a list of value of the 'boolean' type to +// the given stream. +func writeBooleanList(list []bool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteBool(value) + } + stream.WriteArrayEnd() +} + +// UnmarshalBooleanList reads a list of values of the 'boolean' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalBooleanList(source interface{}) (items []bool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readBooleanList(iterator) + err = iterator.Error + return +} + +// readBooleanList reads list of values of the ”boolean' type from +// the given iterator. +func readBooleanList(iterator *jsoniter.Iterator) []bool { + list := []bool{} + for iterator.ReadArray() { + item := iterator.ReadBool() + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_builder.go b/clustersmgmt/v2alpha1/break_glass_credential_builder.go new file mode 100644 index 00000000..f30d5aa9 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_builder.go @@ -0,0 +1,135 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// BreakGlassCredentialBuilder contains the data and logic needed to build 'break_glass_credential' objects. +// +// Representation of a break glass credential. +type BreakGlassCredentialBuilder struct { + bitmap_ uint32 + id string + href string + expirationTimestamp time.Time + kubeconfig string + revocationTimestamp time.Time + status BreakGlassCredentialStatus + username string +} + +// NewBreakGlassCredential creates a new builder of 'break_glass_credential' objects. +func NewBreakGlassCredential() *BreakGlassCredentialBuilder { + return &BreakGlassCredentialBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *BreakGlassCredentialBuilder) Link(value bool) *BreakGlassCredentialBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *BreakGlassCredentialBuilder) ID(value string) *BreakGlassCredentialBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *BreakGlassCredentialBuilder) HREF(value string) *BreakGlassCredentialBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *BreakGlassCredentialBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ExpirationTimestamp sets the value of the 'expiration_timestamp' attribute to the given value. +func (b *BreakGlassCredentialBuilder) ExpirationTimestamp(value time.Time) *BreakGlassCredentialBuilder { + b.expirationTimestamp = value + b.bitmap_ |= 8 + return b +} + +// Kubeconfig sets the value of the 'kubeconfig' attribute to the given value. +func (b *BreakGlassCredentialBuilder) Kubeconfig(value string) *BreakGlassCredentialBuilder { + b.kubeconfig = value + b.bitmap_ |= 16 + return b +} + +// RevocationTimestamp sets the value of the 'revocation_timestamp' attribute to the given value. +func (b *BreakGlassCredentialBuilder) RevocationTimestamp(value time.Time) *BreakGlassCredentialBuilder { + b.revocationTimestamp = value + b.bitmap_ |= 32 + return b +} + +// Status sets the value of the 'status' attribute to the given value. +// +// Status of the break glass credential. +func (b *BreakGlassCredentialBuilder) Status(value BreakGlassCredentialStatus) *BreakGlassCredentialBuilder { + b.status = value + b.bitmap_ |= 64 + return b +} + +// Username sets the value of the 'username' attribute to the given value. +func (b *BreakGlassCredentialBuilder) Username(value string) *BreakGlassCredentialBuilder { + b.username = value + b.bitmap_ |= 128 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *BreakGlassCredentialBuilder) Copy(object *BreakGlassCredential) *BreakGlassCredentialBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.expirationTimestamp = object.expirationTimestamp + b.kubeconfig = object.kubeconfig + b.revocationTimestamp = object.revocationTimestamp + b.status = object.status + b.username = object.username + return b +} + +// Build creates a 'break_glass_credential' object using the configuration stored in the builder. +func (b *BreakGlassCredentialBuilder) Build() (object *BreakGlassCredential, err error) { + object = new(BreakGlassCredential) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.expirationTimestamp = b.expirationTimestamp + object.kubeconfig = b.kubeconfig + object.revocationTimestamp = b.revocationTimestamp + object.status = b.status + object.username = b.username + return +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_client.go b/clustersmgmt/v2alpha1/break_glass_credential_client.go new file mode 100644 index 00000000..62aae3d3 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// BreakGlassCredentialClient is the client of the 'break_glass_credential' resource. +// +// Manages a specific break glass credential. +type BreakGlassCredentialClient struct { + transport http.RoundTripper + path string +} + +// NewBreakGlassCredentialClient creates a new client for the 'break_glass_credential' +// resource using the given transport to send the requests and receive the +// responses. +func NewBreakGlassCredentialClient(transport http.RoundTripper, path string) *BreakGlassCredentialClient { + return &BreakGlassCredentialClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the break glass credential. +func (c *BreakGlassCredentialClient) Get() *BreakGlassCredentialGetRequest { + return &BreakGlassCredentialGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// BreakGlassCredentialPollRequest is the request for the Poll method. +type BreakGlassCredentialPollRequest struct { + request *BreakGlassCredentialGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *BreakGlassCredentialPollRequest) Parameter(name string, value interface{}) *BreakGlassCredentialPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *BreakGlassCredentialPollRequest) Header(name string, value interface{}) *BreakGlassCredentialPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *BreakGlassCredentialPollRequest) Interval(value time.Duration) *BreakGlassCredentialPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *BreakGlassCredentialPollRequest) Status(value int) *BreakGlassCredentialPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *BreakGlassCredentialPollRequest) Predicate(value func(*BreakGlassCredentialGetResponse) bool) *BreakGlassCredentialPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*BreakGlassCredentialGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *BreakGlassCredentialPollRequest) StartContext(ctx context.Context) (response *BreakGlassCredentialPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &BreakGlassCredentialPollResponse{ + response: result.(*BreakGlassCredentialGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *BreakGlassCredentialPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// BreakGlassCredentialPollResponse is the response for the Poll method. +type BreakGlassCredentialPollResponse struct { + response *BreakGlassCredentialGetResponse +} + +// Status returns the response status code. +func (r *BreakGlassCredentialPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *BreakGlassCredentialPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *BreakGlassCredentialPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *BreakGlassCredentialPollResponse) Body() *BreakGlassCredential { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *BreakGlassCredentialPollResponse) GetBody() (value *BreakGlassCredential, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *BreakGlassCredentialClient) Poll() *BreakGlassCredentialPollRequest { + return &BreakGlassCredentialPollRequest{ + request: c.Get(), + } +} + +// BreakGlassCredentialGetRequest is the request for the 'get' method. +type BreakGlassCredentialGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *BreakGlassCredentialGetRequest) Parameter(name string, value interface{}) *BreakGlassCredentialGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *BreakGlassCredentialGetRequest) Header(name string, value interface{}) *BreakGlassCredentialGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *BreakGlassCredentialGetRequest) Impersonate(user string) *BreakGlassCredentialGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *BreakGlassCredentialGetRequest) Send() (result *BreakGlassCredentialGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *BreakGlassCredentialGetRequest) SendContext(ctx context.Context) (result *BreakGlassCredentialGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &BreakGlassCredentialGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readBreakGlassCredentialGetResponse(result, reader) + if err != nil { + return + } + return +} + +// BreakGlassCredentialGetResponse is the response for the 'get' method. +type BreakGlassCredentialGetResponse struct { + status int + header http.Header + err *errors.Error + body *BreakGlassCredential +} + +// Status returns the response status code. +func (r *BreakGlassCredentialGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *BreakGlassCredentialGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *BreakGlassCredentialGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *BreakGlassCredentialGetResponse) Body() *BreakGlassCredential { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *BreakGlassCredentialGetResponse) GetBody() (value *BreakGlassCredential, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_list_builder.go b/clustersmgmt/v2alpha1/break_glass_credential_list_builder.go new file mode 100644 index 00000000..799d97f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// BreakGlassCredentialListBuilder contains the data and logic needed to build +// 'break_glass_credential' objects. +type BreakGlassCredentialListBuilder struct { + items []*BreakGlassCredentialBuilder +} + +// NewBreakGlassCredentialList creates a new builder of 'break_glass_credential' objects. +func NewBreakGlassCredentialList() *BreakGlassCredentialListBuilder { + return new(BreakGlassCredentialListBuilder) +} + +// Items sets the items of the list. +func (b *BreakGlassCredentialListBuilder) Items(values ...*BreakGlassCredentialBuilder) *BreakGlassCredentialListBuilder { + b.items = make([]*BreakGlassCredentialBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *BreakGlassCredentialListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *BreakGlassCredentialListBuilder) Copy(list *BreakGlassCredentialList) *BreakGlassCredentialListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*BreakGlassCredentialBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewBreakGlassCredential().Copy(v) + } + } + return b +} + +// Build creates a list of 'break_glass_credential' objects using the +// configuration stored in the builder. +func (b *BreakGlassCredentialListBuilder) Build() (list *BreakGlassCredentialList, err error) { + items := make([]*BreakGlassCredential, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(BreakGlassCredentialList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_list_type_json.go b/clustersmgmt/v2alpha1/break_glass_credential_list_type_json.go new file mode 100644 index 00000000..d3f640fc --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBreakGlassCredentialList writes a list of values of the 'break_glass_credential' type to +// the given writer. +func MarshalBreakGlassCredentialList(list []*BreakGlassCredential, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBreakGlassCredentialList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBreakGlassCredentialList writes a list of value of the 'break_glass_credential' type to +// the given stream. +func writeBreakGlassCredentialList(list []*BreakGlassCredential, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeBreakGlassCredential(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalBreakGlassCredentialList reads a list of values of the 'break_glass_credential' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalBreakGlassCredentialList(source interface{}) (items []*BreakGlassCredential, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readBreakGlassCredentialList(iterator) + err = iterator.Error + return +} + +// readBreakGlassCredentialList reads list of values of the ”break_glass_credential' type from +// the given iterator. +func readBreakGlassCredentialList(iterator *jsoniter.Iterator) []*BreakGlassCredential { + list := []*BreakGlassCredential{} + for iterator.ReadArray() { + item := readBreakGlassCredential(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_resource_json.go b/clustersmgmt/v2alpha1/break_glass_credential_resource_json.go new file mode 100644 index 00000000..a93ca17f --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeBreakGlassCredentialGetRequest(request *BreakGlassCredentialGetRequest, writer io.Writer) error { + return nil +} +func readBreakGlassCredentialGetResponse(response *BreakGlassCredentialGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalBreakGlassCredential(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_status_list_type_json.go b/clustersmgmt/v2alpha1/break_glass_credential_status_list_type_json.go new file mode 100644 index 00000000..22ebea04 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_status_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBreakGlassCredentialStatusList writes a list of values of the 'break_glass_credential_status' type to +// the given writer. +func MarshalBreakGlassCredentialStatusList(list []BreakGlassCredentialStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBreakGlassCredentialStatusList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBreakGlassCredentialStatusList writes a list of value of the 'break_glass_credential_status' type to +// the given stream. +func writeBreakGlassCredentialStatusList(list []BreakGlassCredentialStatus, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalBreakGlassCredentialStatusList reads a list of values of the 'break_glass_credential_status' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalBreakGlassCredentialStatusList(source interface{}) (items []BreakGlassCredentialStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readBreakGlassCredentialStatusList(iterator) + err = iterator.Error + return +} + +// readBreakGlassCredentialStatusList reads list of values of the ”break_glass_credential_status' type from +// the given iterator. +func readBreakGlassCredentialStatusList(iterator *jsoniter.Iterator) []BreakGlassCredentialStatus { + list := []BreakGlassCredentialStatus{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := BreakGlassCredentialStatus(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_status_type.go b/clustersmgmt/v2alpha1/break_glass_credential_status_type.go new file mode 100644 index 00000000..b9a3d096 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_status_type.go @@ -0,0 +1,38 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// BreakGlassCredentialStatus represents the values of the 'break_glass_credential_status' enumerated type. +type BreakGlassCredentialStatus string + +const ( + // + BreakGlassCredentialStatusAwaitingRevocation BreakGlassCredentialStatus = "awaiting_revocation" + // + BreakGlassCredentialStatusCreated BreakGlassCredentialStatus = "created" + // + BreakGlassCredentialStatusExpired BreakGlassCredentialStatus = "expired" + // + BreakGlassCredentialStatusFailed BreakGlassCredentialStatus = "failed" + // + BreakGlassCredentialStatusIssued BreakGlassCredentialStatus = "issued" + // + BreakGlassCredentialStatusRevoked BreakGlassCredentialStatus = "revoked" +) diff --git a/clustersmgmt/v2alpha1/break_glass_credential_type.go b/clustersmgmt/v2alpha1/break_glass_credential_type.go new file mode 100644 index 00000000..ba00dd3f --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_type.go @@ -0,0 +1,342 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// BreakGlassCredentialKind is the name of the type used to represent objects +// of type 'break_glass_credential'. +const BreakGlassCredentialKind = "BreakGlassCredential" + +// BreakGlassCredentialLinkKind is the name of the type used to represent links +// to objects of type 'break_glass_credential'. +const BreakGlassCredentialLinkKind = "BreakGlassCredentialLink" + +// BreakGlassCredentialNilKind is the name of the type used to nil references +// to objects of type 'break_glass_credential'. +const BreakGlassCredentialNilKind = "BreakGlassCredentialNil" + +// BreakGlassCredential represents the values of the 'break_glass_credential' type. +// +// Representation of a break glass credential. +type BreakGlassCredential struct { + bitmap_ uint32 + id string + href string + expirationTimestamp time.Time + kubeconfig string + revocationTimestamp time.Time + status BreakGlassCredentialStatus + username string +} + +// Kind returns the name of the type of the object. +func (o *BreakGlassCredential) Kind() string { + if o == nil { + return BreakGlassCredentialNilKind + } + if o.bitmap_&1 != 0 { + return BreakGlassCredentialLinkKind + } + return BreakGlassCredentialKind +} + +// Link returns true iif this is a link. +func (o *BreakGlassCredential) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *BreakGlassCredential) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *BreakGlassCredential) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *BreakGlassCredential) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *BreakGlassCredential) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *BreakGlassCredential) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ExpirationTimestamp returns the value of the 'expiration_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ExpirationTimestamp is the date and time when the credential will expire. +func (o *BreakGlassCredential) ExpirationTimestamp() time.Time { + if o != nil && o.bitmap_&8 != 0 { + return o.expirationTimestamp + } + return time.Time{} +} + +// GetExpirationTimestamp returns the value of the 'expiration_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// ExpirationTimestamp is the date and time when the credential will expire. +func (o *BreakGlassCredential) GetExpirationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.expirationTimestamp + } + return +} + +// Kubeconfig returns the value of the 'kubeconfig' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Kubeconfig is the generated kubeconfig for this credential. It is only stored in memory +func (o *BreakGlassCredential) Kubeconfig() string { + if o != nil && o.bitmap_&16 != 0 { + return o.kubeconfig + } + return "" +} + +// GetKubeconfig returns the value of the 'kubeconfig' attribute and +// a flag indicating if the attribute has a value. +// +// Kubeconfig is the generated kubeconfig for this credential. It is only stored in memory +func (o *BreakGlassCredential) GetKubeconfig() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.kubeconfig + } + return +} + +// RevocationTimestamp returns the value of the 'revocation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// RevocationTimestamp is the date and time when the credential has been revoked. +func (o *BreakGlassCredential) RevocationTimestamp() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.revocationTimestamp + } + return time.Time{} +} + +// GetRevocationTimestamp returns the value of the 'revocation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// RevocationTimestamp is the date and time when the credential has been revoked. +func (o *BreakGlassCredential) GetRevocationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.revocationTimestamp + } + return +} + +// Status returns the value of the 'status' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Status is the status of this credential +func (o *BreakGlassCredential) Status() BreakGlassCredentialStatus { + if o != nil && o.bitmap_&64 != 0 { + return o.status + } + return BreakGlassCredentialStatus("") +} + +// GetStatus returns the value of the 'status' attribute and +// a flag indicating if the attribute has a value. +// +// Status is the status of this credential +func (o *BreakGlassCredential) GetStatus() (value BreakGlassCredentialStatus, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.status + } + return +} + +// Username returns the value of the 'username' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Username is the user which will be used for this credential. +func (o *BreakGlassCredential) Username() string { + if o != nil && o.bitmap_&128 != 0 { + return o.username + } + return "" +} + +// GetUsername returns the value of the 'username' attribute and +// a flag indicating if the attribute has a value. +// +// Username is the user which will be used for this credential. +func (o *BreakGlassCredential) GetUsername() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.username + } + return +} + +// BreakGlassCredentialListKind is the name of the type used to represent list of objects of +// type 'break_glass_credential'. +const BreakGlassCredentialListKind = "BreakGlassCredentialList" + +// BreakGlassCredentialListLinkKind is the name of the type used to represent links to list +// of objects of type 'break_glass_credential'. +const BreakGlassCredentialListLinkKind = "BreakGlassCredentialListLink" + +// BreakGlassCredentialNilKind is the name of the type used to nil lists of objects of +// type 'break_glass_credential'. +const BreakGlassCredentialListNilKind = "BreakGlassCredentialListNil" + +// BreakGlassCredentialList is a list of values of the 'break_glass_credential' type. +type BreakGlassCredentialList struct { + href string + link bool + items []*BreakGlassCredential +} + +// Kind returns the name of the type of the object. +func (l *BreakGlassCredentialList) Kind() string { + if l == nil { + return BreakGlassCredentialListNilKind + } + if l.link { + return BreakGlassCredentialListLinkKind + } + return BreakGlassCredentialListKind +} + +// Link returns true iif this is a link. +func (l *BreakGlassCredentialList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *BreakGlassCredentialList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *BreakGlassCredentialList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *BreakGlassCredentialList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *BreakGlassCredentialList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *BreakGlassCredentialList) Get(i int) *BreakGlassCredential { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *BreakGlassCredentialList) Slice() []*BreakGlassCredential { + var slice []*BreakGlassCredential + if l == nil { + slice = make([]*BreakGlassCredential, 0) + } else { + slice = make([]*BreakGlassCredential, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *BreakGlassCredentialList) Each(f func(item *BreakGlassCredential) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *BreakGlassCredentialList) Range(f func(index int, item *BreakGlassCredential) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/break_glass_credential_type_json.go b/clustersmgmt/v2alpha1/break_glass_credential_type_json.go new file mode 100644 index 00000000..7dedabb8 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credential_type_json.go @@ -0,0 +1,182 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalBreakGlassCredential writes a value of the 'break_glass_credential' type to the given writer. +func MarshalBreakGlassCredential(object *BreakGlassCredential, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeBreakGlassCredential(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeBreakGlassCredential writes a value of the 'break_glass_credential' type to the given stream. +func writeBreakGlassCredential(object *BreakGlassCredential, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(BreakGlassCredentialLinkKind) + } else { + stream.WriteString(BreakGlassCredentialKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("expiration_timestamp") + stream.WriteString((object.expirationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kubeconfig") + stream.WriteString(object.kubeconfig) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("revocation_timestamp") + stream.WriteString((object.revocationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("status") + stream.WriteString(string(object.status)) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("username") + stream.WriteString(object.username) + } + stream.WriteObjectEnd() +} + +// UnmarshalBreakGlassCredential reads a value of the 'break_glass_credential' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalBreakGlassCredential(source interface{}) (object *BreakGlassCredential, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readBreakGlassCredential(iterator) + err = iterator.Error + return +} + +// readBreakGlassCredential reads a value of the 'break_glass_credential' type from the given iterator. +func readBreakGlassCredential(iterator *jsoniter.Iterator) *BreakGlassCredential { + object := &BreakGlassCredential{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == BreakGlassCredentialLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "expiration_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.expirationTimestamp = value + object.bitmap_ |= 8 + case "kubeconfig": + value := iterator.ReadString() + object.kubeconfig = value + object.bitmap_ |= 16 + case "revocation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.revocationTimestamp = value + object.bitmap_ |= 32 + case "status": + text := iterator.ReadString() + value := BreakGlassCredentialStatus(text) + object.status = value + object.bitmap_ |= 64 + case "username": + value := iterator.ReadString() + object.username = value + object.bitmap_ |= 128 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/break_glass_credentials_client.go b/clustersmgmt/v2alpha1/break_glass_credentials_client.go new file mode 100644 index 00000000..e0fe9ba4 --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credentials_client.go @@ -0,0 +1,622 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// BreakGlassCredentialsClient is the client of the 'break_glass_credentials' resource. +// +// Manages the break glass credentials of a cluster. +type BreakGlassCredentialsClient struct { + transport http.RoundTripper + path string +} + +// NewBreakGlassCredentialsClient creates a new client for the 'break_glass_credentials' +// resource using the given transport to send the requests and receive the +// responses. +func NewBreakGlassCredentialsClient(transport http.RoundTripper, path string) *BreakGlassCredentialsClient { + return &BreakGlassCredentialsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new break glass credential to the cluster. +func (c *BreakGlassCredentialsClient) Add() *BreakGlassCredentialsAddRequest { + return &BreakGlassCredentialsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Revokes all the break glass certificates signed by a specific signer. +func (c *BreakGlassCredentialsClient) Delete() *BreakGlassCredentialsDeleteRequest { + return &BreakGlassCredentialsDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of break glass credentials. +func (c *BreakGlassCredentialsClient) List() *BreakGlassCredentialsListRequest { + return &BreakGlassCredentialsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// BreakGlassCredential returns the target 'break_glass_credential' resource for the given identifier. +// +// Reference to the service that manages a specific break glass credential. +func (c *BreakGlassCredentialsClient) BreakGlassCredential(id string) *BreakGlassCredentialClient { + return NewBreakGlassCredentialClient( + c.transport, + path.Join(c.path, id), + ) +} + +// BreakGlassCredentialsAddRequest is the request for the 'add' method. +type BreakGlassCredentialsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *BreakGlassCredential +} + +// Parameter adds a query parameter. +func (r *BreakGlassCredentialsAddRequest) Parameter(name string, value interface{}) *BreakGlassCredentialsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *BreakGlassCredentialsAddRequest) Header(name string, value interface{}) *BreakGlassCredentialsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *BreakGlassCredentialsAddRequest) Impersonate(user string) *BreakGlassCredentialsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the break glass credential. +func (r *BreakGlassCredentialsAddRequest) Body(value *BreakGlassCredential) *BreakGlassCredentialsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *BreakGlassCredentialsAddRequest) Send() (result *BreakGlassCredentialsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *BreakGlassCredentialsAddRequest) SendContext(ctx context.Context) (result *BreakGlassCredentialsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeBreakGlassCredentialsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &BreakGlassCredentialsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readBreakGlassCredentialsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// BreakGlassCredentialsAddResponse is the response for the 'add' method. +type BreakGlassCredentialsAddResponse struct { + status int + header http.Header + err *errors.Error + body *BreakGlassCredential +} + +// Status returns the response status code. +func (r *BreakGlassCredentialsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *BreakGlassCredentialsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *BreakGlassCredentialsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the break glass credential. +func (r *BreakGlassCredentialsAddResponse) Body() *BreakGlassCredential { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the break glass credential. +func (r *BreakGlassCredentialsAddResponse) GetBody() (value *BreakGlassCredential, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// BreakGlassCredentialsDeleteRequest is the request for the 'delete' method. +type BreakGlassCredentialsDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *BreakGlassCredentialsDeleteRequest) Parameter(name string, value interface{}) *BreakGlassCredentialsDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *BreakGlassCredentialsDeleteRequest) Header(name string, value interface{}) *BreakGlassCredentialsDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *BreakGlassCredentialsDeleteRequest) Impersonate(user string) *BreakGlassCredentialsDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *BreakGlassCredentialsDeleteRequest) Send() (result *BreakGlassCredentialsDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *BreakGlassCredentialsDeleteRequest) SendContext(ctx context.Context) (result *BreakGlassCredentialsDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &BreakGlassCredentialsDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// BreakGlassCredentialsDeleteResponse is the response for the 'delete' method. +type BreakGlassCredentialsDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *BreakGlassCredentialsDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *BreakGlassCredentialsDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *BreakGlassCredentialsDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// BreakGlassCredentialsListRequest is the request for the 'list' method. +type BreakGlassCredentialsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *BreakGlassCredentialsListRequest) Parameter(name string, value interface{}) *BreakGlassCredentialsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *BreakGlassCredentialsListRequest) Header(name string, value interface{}) *BreakGlassCredentialsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *BreakGlassCredentialsListRequest) Impersonate(user string) *BreakGlassCredentialsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the break glass credentials +// instead of the the names of the columns of a table. For example, in order to sort the +// credentials descending by identifier the value should be: +// +// ```sql +// id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *BreakGlassCredentialsListRequest) Order(value string) *BreakGlassCredentialsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *BreakGlassCredentialsListRequest) Page(value int) *BreakGlassCredentialsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the break glass credentials +// instead of the names of the columns of a table. For example, in order to retrieve all +// the credentials with a specific username and status the following is required: +// +// ```sql +// username='user1' AND status='expired' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// break glass credentials that the user has permission to see will be returned. +func (r *BreakGlassCredentialsListRequest) Search(value string) *BreakGlassCredentialsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *BreakGlassCredentialsListRequest) Size(value int) *BreakGlassCredentialsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *BreakGlassCredentialsListRequest) Send() (result *BreakGlassCredentialsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *BreakGlassCredentialsListRequest) SendContext(ctx context.Context) (result *BreakGlassCredentialsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &BreakGlassCredentialsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readBreakGlassCredentialsListResponse(result, reader) + if err != nil { + return + } + return +} + +// BreakGlassCredentialsListResponse is the response for the 'list' method. +type BreakGlassCredentialsListResponse struct { + status int + header http.Header + err *errors.Error + items *BreakGlassCredentialList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *BreakGlassCredentialsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *BreakGlassCredentialsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *BreakGlassCredentialsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of break glass credentials. +func (r *BreakGlassCredentialsListResponse) Items() *BreakGlassCredentialList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of break glass credentials. +func (r *BreakGlassCredentialsListResponse) GetItems() (value *BreakGlassCredentialList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *BreakGlassCredentialsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *BreakGlassCredentialsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *BreakGlassCredentialsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *BreakGlassCredentialsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *BreakGlassCredentialsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *BreakGlassCredentialsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/break_glass_credentials_resource_json.go b/clustersmgmt/v2alpha1/break_glass_credentials_resource_json.go new file mode 100644 index 00000000..513b106c --- /dev/null +++ b/clustersmgmt/v2alpha1/break_glass_credentials_resource_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeBreakGlassCredentialsAddRequest(request *BreakGlassCredentialsAddRequest, writer io.Writer) error { + return MarshalBreakGlassCredential(request.body, writer) +} +func readBreakGlassCredentialsAddResponse(response *BreakGlassCredentialsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalBreakGlassCredential(reader) + return err +} +func writeBreakGlassCredentialsDeleteRequest(request *BreakGlassCredentialsDeleteRequest, writer io.Writer) error { + return nil +} +func readBreakGlassCredentialsDeleteResponse(response *BreakGlassCredentialsDeleteResponse, reader io.Reader) error { + return nil +} +func writeBreakGlassCredentialsListRequest(request *BreakGlassCredentialsListRequest, writer io.Writer) error { + return nil +} +func readBreakGlassCredentialsListResponse(response *BreakGlassCredentialsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readBreakGlassCredentialList(iterator) + response.items = &BreakGlassCredentialList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/byo_oidc_builder.go b/clustersmgmt/v2alpha1/byo_oidc_builder.go new file mode 100644 index 00000000..0366f711 --- /dev/null +++ b/clustersmgmt/v2alpha1/byo_oidc_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ByoOidcBuilder contains the data and logic needed to build 'byo_oidc' objects. +// +// ByoOidc configuration. +type ByoOidcBuilder struct { + bitmap_ uint32 + enabled bool +} + +// NewByoOidc creates a new builder of 'byo_oidc' objects. +func NewByoOidc() *ByoOidcBuilder { + return &ByoOidcBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ByoOidcBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *ByoOidcBuilder) Enabled(value bool) *ByoOidcBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ByoOidcBuilder) Copy(object *ByoOidc) *ByoOidcBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + return b +} + +// Build creates a 'byo_oidc' object using the configuration stored in the builder. +func (b *ByoOidcBuilder) Build() (object *ByoOidc, err error) { + object = new(ByoOidc) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + return +} diff --git a/clustersmgmt/v2alpha1/byo_oidc_list_builder.go b/clustersmgmt/v2alpha1/byo_oidc_list_builder.go new file mode 100644 index 00000000..474c4aec --- /dev/null +++ b/clustersmgmt/v2alpha1/byo_oidc_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ByoOidcListBuilder contains the data and logic needed to build +// 'byo_oidc' objects. +type ByoOidcListBuilder struct { + items []*ByoOidcBuilder +} + +// NewByoOidcList creates a new builder of 'byo_oidc' objects. +func NewByoOidcList() *ByoOidcListBuilder { + return new(ByoOidcListBuilder) +} + +// Items sets the items of the list. +func (b *ByoOidcListBuilder) Items(values ...*ByoOidcBuilder) *ByoOidcListBuilder { + b.items = make([]*ByoOidcBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ByoOidcListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ByoOidcListBuilder) Copy(list *ByoOidcList) *ByoOidcListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ByoOidcBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewByoOidc().Copy(v) + } + } + return b +} + +// Build creates a list of 'byo_oidc' objects using the +// configuration stored in the builder. +func (b *ByoOidcListBuilder) Build() (list *ByoOidcList, err error) { + items := make([]*ByoOidc, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ByoOidcList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/byo_oidc_list_type_json.go b/clustersmgmt/v2alpha1/byo_oidc_list_type_json.go new file mode 100644 index 00000000..e5ce23cd --- /dev/null +++ b/clustersmgmt/v2alpha1/byo_oidc_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalByoOidcList writes a list of values of the 'byo_oidc' type to +// the given writer. +func MarshalByoOidcList(list []*ByoOidc, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeByoOidcList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeByoOidcList writes a list of value of the 'byo_oidc' type to +// the given stream. +func writeByoOidcList(list []*ByoOidc, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeByoOidc(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalByoOidcList reads a list of values of the 'byo_oidc' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalByoOidcList(source interface{}) (items []*ByoOidc, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readByoOidcList(iterator) + err = iterator.Error + return +} + +// readByoOidcList reads list of values of the ”byo_oidc' type from +// the given iterator. +func readByoOidcList(iterator *jsoniter.Iterator) []*ByoOidc { + list := []*ByoOidc{} + for iterator.ReadArray() { + item := readByoOidc(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/byo_oidc_type.go b/clustersmgmt/v2alpha1/byo_oidc_type.go new file mode 100644 index 00000000..8719236f --- /dev/null +++ b/clustersmgmt/v2alpha1/byo_oidc_type.go @@ -0,0 +1,152 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ByoOidc represents the values of the 'byo_oidc' type. +// +// ByoOidc configuration. +type ByoOidc struct { + bitmap_ uint32 + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ByoOidc) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Boolean flag indicating if the cluster should be creating using _ByoOidc_. +// +// By default this is `false`. +// +// To enable it the cluster needs to be ROSA cluster and the organization of the user needs +// to have the `byo-oidc` feature toggle enabled. +func (o *ByoOidc) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Boolean flag indicating if the cluster should be creating using _ByoOidc_. +// +// By default this is `false`. +// +// To enable it the cluster needs to be ROSA cluster and the organization of the user needs +// to have the `byo-oidc` feature toggle enabled. +func (o *ByoOidc) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// ByoOidcListKind is the name of the type used to represent list of objects of +// type 'byo_oidc'. +const ByoOidcListKind = "ByoOidcList" + +// ByoOidcListLinkKind is the name of the type used to represent links to list +// of objects of type 'byo_oidc'. +const ByoOidcListLinkKind = "ByoOidcListLink" + +// ByoOidcNilKind is the name of the type used to nil lists of objects of +// type 'byo_oidc'. +const ByoOidcListNilKind = "ByoOidcListNil" + +// ByoOidcList is a list of values of the 'byo_oidc' type. +type ByoOidcList struct { + href string + link bool + items []*ByoOidc +} + +// Len returns the length of the list. +func (l *ByoOidcList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ByoOidcList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ByoOidcList) Get(i int) *ByoOidc { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ByoOidcList) Slice() []*ByoOidc { + var slice []*ByoOidc + if l == nil { + slice = make([]*ByoOidc, 0) + } else { + slice = make([]*ByoOidc, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ByoOidcList) Each(f func(item *ByoOidc) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ByoOidcList) Range(f func(index int, item *ByoOidc) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/byo_oidc_type_json.go b/clustersmgmt/v2alpha1/byo_oidc_type_json.go new file mode 100644 index 00000000..bb493250 --- /dev/null +++ b/clustersmgmt/v2alpha1/byo_oidc_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalByoOidc writes a value of the 'byo_oidc' type to the given writer. +func MarshalByoOidc(object *ByoOidc, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeByoOidc(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeByoOidc writes a value of the 'byo_oidc' type to the given stream. +func writeByoOidc(object *ByoOidc, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + } + stream.WriteObjectEnd() +} + +// UnmarshalByoOidc reads a value of the 'byo_oidc' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalByoOidc(source interface{}) (object *ByoOidc, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readByoOidc(iterator) + err = iterator.Error + return +} + +// readByoOidc reads a value of the 'byo_oidc' type from the given iterator. +func readByoOidc(iterator *jsoniter.Iterator) *ByoOidc { + object := &ByoOidc{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/ccs_builder.go b/clustersmgmt/v2alpha1/ccs_builder.go new file mode 100644 index 00000000..bee8004d --- /dev/null +++ b/clustersmgmt/v2alpha1/ccs_builder.go @@ -0,0 +1,97 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CCSBuilder contains the data and logic needed to build 'CCS' objects. +type CCSBuilder struct { + bitmap_ uint32 + id string + href string + disableSCPChecks bool + enabled bool +} + +// NewCCS creates a new builder of 'CCS' objects. +func NewCCS() *CCSBuilder { + return &CCSBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *CCSBuilder) Link(value bool) *CCSBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *CCSBuilder) ID(value string) *CCSBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *CCSBuilder) HREF(value string) *CCSBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CCSBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// DisableSCPChecks sets the value of the 'disable_SCP_checks' attribute to the given value. +func (b *CCSBuilder) DisableSCPChecks(value bool) *CCSBuilder { + b.disableSCPChecks = value + b.bitmap_ |= 8 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *CCSBuilder) Enabled(value bool) *CCSBuilder { + b.enabled = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CCSBuilder) Copy(object *CCS) *CCSBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.disableSCPChecks = object.disableSCPChecks + b.enabled = object.enabled + return b +} + +// Build creates a 'CCS' object using the configuration stored in the builder. +func (b *CCSBuilder) Build() (object *CCS, err error) { + object = new(CCS) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.disableSCPChecks = b.disableSCPChecks + object.enabled = b.enabled + return +} diff --git a/clustersmgmt/v2alpha1/ccs_list_builder.go b/clustersmgmt/v2alpha1/ccs_list_builder.go new file mode 100644 index 00000000..da29d38a --- /dev/null +++ b/clustersmgmt/v2alpha1/ccs_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CCSListBuilder contains the data and logic needed to build +// 'CCS' objects. +type CCSListBuilder struct { + items []*CCSBuilder +} + +// NewCCSList creates a new builder of 'CCS' objects. +func NewCCSList() *CCSListBuilder { + return new(CCSListBuilder) +} + +// Items sets the items of the list. +func (b *CCSListBuilder) Items(values ...*CCSBuilder) *CCSListBuilder { + b.items = make([]*CCSBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CCSListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CCSListBuilder) Copy(list *CCSList) *CCSListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CCSBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCCS().Copy(v) + } + } + return b +} + +// Build creates a list of 'CCS' objects using the +// configuration stored in the builder. +func (b *CCSListBuilder) Build() (list *CCSList, err error) { + items := make([]*CCS, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CCSList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ccs_list_type_json.go b/clustersmgmt/v2alpha1/ccs_list_type_json.go new file mode 100644 index 00000000..e4503c3a --- /dev/null +++ b/clustersmgmt/v2alpha1/ccs_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCCSList writes a list of values of the 'CCS' type to +// the given writer. +func MarshalCCSList(list []*CCS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCCSList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCCSList writes a list of value of the 'CCS' type to +// the given stream. +func writeCCSList(list []*CCS, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCCS(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCCSList reads a list of values of the 'CCS' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCCSList(source interface{}) (items []*CCS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCCSList(iterator) + err = iterator.Error + return +} + +// readCCSList reads list of values of the ”CCS' type from +// the given iterator. +func readCCSList(iterator *jsoniter.Iterator) []*CCS { + list := []*CCS{} + for iterator.ReadArray() { + item := readCCS(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ccs_type.go b/clustersmgmt/v2alpha1/ccs_type.go new file mode 100644 index 00000000..73538c55 --- /dev/null +++ b/clustersmgmt/v2alpha1/ccs_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CCSKind is the name of the type used to represent objects +// of type 'CCS'. +const CCSKind = "CCS" + +// CCSLinkKind is the name of the type used to represent links +// to objects of type 'CCS'. +const CCSLinkKind = "CCSLink" + +// CCSNilKind is the name of the type used to nil references +// to objects of type 'CCS'. +const CCSNilKind = "CCSNil" + +// CCS represents the values of the 'CCS' type. +type CCS struct { + bitmap_ uint32 + id string + href string + disableSCPChecks bool + enabled bool +} + +// Kind returns the name of the type of the object. +func (o *CCS) Kind() string { + if o == nil { + return CCSNilKind + } + if o.bitmap_&1 != 0 { + return CCSLinkKind + } + return CCSKind +} + +// Link returns true iif this is a link. +func (o *CCS) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *CCS) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *CCS) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *CCS) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *CCS) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CCS) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// DisableSCPChecks returns the value of the 'disable_SCP_checks' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if cloud permissions checks are disabled, +// when attempting installation of the cluster. +func (o *CCS) DisableSCPChecks() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.disableSCPChecks + } + return false +} + +// GetDisableSCPChecks returns the value of the 'disable_SCP_checks' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if cloud permissions checks are disabled, +// when attempting installation of the cluster. +func (o *CCS) GetDisableSCPChecks() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.disableSCPChecks + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if Customer Cloud Subscription is enabled on the cluster. +func (o *CCS) Enabled() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if Customer Cloud Subscription is enabled on the cluster. +func (o *CCS) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.enabled + } + return +} + +// CCSListKind is the name of the type used to represent list of objects of +// type 'CCS'. +const CCSListKind = "CCSList" + +// CCSListLinkKind is the name of the type used to represent links to list +// of objects of type 'CCS'. +const CCSListLinkKind = "CCSListLink" + +// CCSNilKind is the name of the type used to nil lists of objects of +// type 'CCS'. +const CCSListNilKind = "CCSListNil" + +// CCSList is a list of values of the 'CCS' type. +type CCSList struct { + href string + link bool + items []*CCS +} + +// Kind returns the name of the type of the object. +func (l *CCSList) Kind() string { + if l == nil { + return CCSListNilKind + } + if l.link { + return CCSListLinkKind + } + return CCSListKind +} + +// Link returns true iif this is a link. +func (l *CCSList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *CCSList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *CCSList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *CCSList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CCSList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CCSList) Get(i int) *CCS { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CCSList) Slice() []*CCS { + var slice []*CCS + if l == nil { + slice = make([]*CCS, 0) + } else { + slice = make([]*CCS, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CCSList) Each(f func(item *CCS) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CCSList) Range(f func(index int, item *CCS) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ccs_type_json.go b/clustersmgmt/v2alpha1/ccs_type_json.go new file mode 100644 index 00000000..a7c0b317 --- /dev/null +++ b/clustersmgmt/v2alpha1/ccs_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCCS writes a value of the 'CCS' type to the given writer. +func MarshalCCS(object *CCS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCCS(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCCS writes a value of the 'CCS' type to the given stream. +func writeCCS(object *CCS, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(CCSLinkKind) + } else { + stream.WriteString(CCSKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("disable_scp_checks") + stream.WriteBool(object.disableSCPChecks) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + } + stream.WriteObjectEnd() +} + +// UnmarshalCCS reads a value of the 'CCS' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCCS(source interface{}) (object *CCS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCCS(iterator) + err = iterator.Error + return +} + +// readCCS reads a value of the 'CCS' type from the given iterator. +func readCCS(iterator *jsoniter.Iterator) *CCS { + object := &CCS{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == CCSLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "disable_scp_checks": + value := iterator.ReadBool() + object.disableSCPChecks = value + object.bitmap_ |= 8 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/client_component_builder.go b/clustersmgmt/v2alpha1/client_component_builder.go new file mode 100644 index 00000000..c30f674a --- /dev/null +++ b/clustersmgmt/v2alpha1/client_component_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClientComponentBuilder contains the data and logic needed to build 'client_component' objects. +// +// The reference of a component that will consume the client configuration. +type ClientComponentBuilder struct { + bitmap_ uint32 + name string + namespace string +} + +// NewClientComponent creates a new builder of 'client_component' objects. +func NewClientComponent() *ClientComponentBuilder { + return &ClientComponentBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClientComponentBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *ClientComponentBuilder) Name(value string) *ClientComponentBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Namespace sets the value of the 'namespace' attribute to the given value. +func (b *ClientComponentBuilder) Namespace(value string) *ClientComponentBuilder { + b.namespace = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClientComponentBuilder) Copy(object *ClientComponent) *ClientComponentBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + b.namespace = object.namespace + return b +} + +// Build creates a 'client_component' object using the configuration stored in the builder. +func (b *ClientComponentBuilder) Build() (object *ClientComponent, err error) { + object = new(ClientComponent) + object.bitmap_ = b.bitmap_ + object.name = b.name + object.namespace = b.namespace + return +} diff --git a/clustersmgmt/v2alpha1/client_component_list_builder.go b/clustersmgmt/v2alpha1/client_component_list_builder.go new file mode 100644 index 00000000..44c068c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/client_component_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClientComponentListBuilder contains the data and logic needed to build +// 'client_component' objects. +type ClientComponentListBuilder struct { + items []*ClientComponentBuilder +} + +// NewClientComponentList creates a new builder of 'client_component' objects. +func NewClientComponentList() *ClientComponentListBuilder { + return new(ClientComponentListBuilder) +} + +// Items sets the items of the list. +func (b *ClientComponentListBuilder) Items(values ...*ClientComponentBuilder) *ClientComponentListBuilder { + b.items = make([]*ClientComponentBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClientComponentListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClientComponentListBuilder) Copy(list *ClientComponentList) *ClientComponentListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClientComponentBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClientComponent().Copy(v) + } + } + return b +} + +// Build creates a list of 'client_component' objects using the +// configuration stored in the builder. +func (b *ClientComponentListBuilder) Build() (list *ClientComponentList, err error) { + items := make([]*ClientComponent, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClientComponentList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/client_component_list_type_json.go b/clustersmgmt/v2alpha1/client_component_list_type_json.go new file mode 100644 index 00000000..ec156298 --- /dev/null +++ b/clustersmgmt/v2alpha1/client_component_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClientComponentList writes a list of values of the 'client_component' type to +// the given writer. +func MarshalClientComponentList(list []*ClientComponent, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClientComponentList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClientComponentList writes a list of value of the 'client_component' type to +// the given stream. +func writeClientComponentList(list []*ClientComponent, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClientComponent(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClientComponentList reads a list of values of the 'client_component' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClientComponentList(source interface{}) (items []*ClientComponent, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClientComponentList(iterator) + err = iterator.Error + return +} + +// readClientComponentList reads list of values of the ”client_component' type from +// the given iterator. +func readClientComponentList(iterator *jsoniter.Iterator) []*ClientComponent { + list := []*ClientComponent{} + for iterator.ReadArray() { + item := readClientComponent(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/client_component_type.go b/clustersmgmt/v2alpha1/client_component_type.go new file mode 100644 index 00000000..0ab8c3bb --- /dev/null +++ b/clustersmgmt/v2alpha1/client_component_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClientComponent represents the values of the 'client_component' type. +// +// The reference of a component that will consume the client configuration. +type ClientComponent struct { + bitmap_ uint32 + name string + namespace string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClientComponent) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The name of the component. +func (o *ClientComponent) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// The name of the component. +func (o *ClientComponent) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Namespace returns the value of the 'namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The namespace of the component. +func (o *ClientComponent) Namespace() string { + if o != nil && o.bitmap_&2 != 0 { + return o.namespace + } + return "" +} + +// GetNamespace returns the value of the 'namespace' attribute and +// a flag indicating if the attribute has a value. +// +// The namespace of the component. +func (o *ClientComponent) GetNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.namespace + } + return +} + +// ClientComponentListKind is the name of the type used to represent list of objects of +// type 'client_component'. +const ClientComponentListKind = "ClientComponentList" + +// ClientComponentListLinkKind is the name of the type used to represent links to list +// of objects of type 'client_component'. +const ClientComponentListLinkKind = "ClientComponentListLink" + +// ClientComponentNilKind is the name of the type used to nil lists of objects of +// type 'client_component'. +const ClientComponentListNilKind = "ClientComponentListNil" + +// ClientComponentList is a list of values of the 'client_component' type. +type ClientComponentList struct { + href string + link bool + items []*ClientComponent +} + +// Len returns the length of the list. +func (l *ClientComponentList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClientComponentList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClientComponentList) Get(i int) *ClientComponent { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClientComponentList) Slice() []*ClientComponent { + var slice []*ClientComponent + if l == nil { + slice = make([]*ClientComponent, 0) + } else { + slice = make([]*ClientComponent, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClientComponentList) Each(f func(item *ClientComponent) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClientComponentList) Range(f func(index int, item *ClientComponent) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/client_component_type_json.go b/clustersmgmt/v2alpha1/client_component_type_json.go new file mode 100644 index 00000000..8a0bd53c --- /dev/null +++ b/clustersmgmt/v2alpha1/client_component_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClientComponent writes a value of the 'client_component' type to the given writer. +func MarshalClientComponent(object *ClientComponent, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClientComponent(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClientComponent writes a value of the 'client_component' type to the given stream. +func writeClientComponent(object *ClientComponent, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("namespace") + stream.WriteString(object.namespace) + } + stream.WriteObjectEnd() +} + +// UnmarshalClientComponent reads a value of the 'client_component' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClientComponent(source interface{}) (object *ClientComponent, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClientComponent(iterator) + err = iterator.Error + return +} + +// readClientComponent reads a value of the 'client_component' type from the given iterator. +func readClientComponent(iterator *jsoniter.Iterator) *ClientComponent { + object := &ClientComponent{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "namespace": + value := iterator.ReadString() + object.namespace = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_builder.go b/clustersmgmt/v2alpha1/cloud_provider_builder.go new file mode 100644 index 00000000..763edbea --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_builder.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudProviderBuilder contains the data and logic needed to build 'cloud_provider' objects. +// +// Cloud provider. +type CloudProviderBuilder struct { + bitmap_ uint32 + id string + href string + displayName string + name string + regions []*CloudRegionBuilder +} + +// NewCloudProvider creates a new builder of 'cloud_provider' objects. +func NewCloudProvider() *CloudProviderBuilder { + return &CloudProviderBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *CloudProviderBuilder) Link(value bool) *CloudProviderBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *CloudProviderBuilder) ID(value string) *CloudProviderBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *CloudProviderBuilder) HREF(value string) *CloudProviderBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CloudProviderBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// DisplayName sets the value of the 'display_name' attribute to the given value. +func (b *CloudProviderBuilder) DisplayName(value string) *CloudProviderBuilder { + b.displayName = value + b.bitmap_ |= 8 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *CloudProviderBuilder) Name(value string) *CloudProviderBuilder { + b.name = value + b.bitmap_ |= 16 + return b +} + +// Regions sets the value of the 'regions' attribute to the given values. +func (b *CloudProviderBuilder) Regions(values ...*CloudRegionBuilder) *CloudProviderBuilder { + b.regions = make([]*CloudRegionBuilder, len(values)) + copy(b.regions, values) + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CloudProviderBuilder) Copy(object *CloudProvider) *CloudProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.displayName = object.displayName + b.name = object.name + if object.regions != nil { + b.regions = make([]*CloudRegionBuilder, len(object.regions)) + for i, v := range object.regions { + b.regions[i] = NewCloudRegion().Copy(v) + } + } else { + b.regions = nil + } + return b +} + +// Build creates a 'cloud_provider' object using the configuration stored in the builder. +func (b *CloudProviderBuilder) Build() (object *CloudProvider, err error) { + object = new(CloudProvider) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.displayName = b.displayName + object.name = b.name + if b.regions != nil { + object.regions = make([]*CloudRegion, len(b.regions)) + for i, v := range b.regions { + object.regions[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_client.go b/clustersmgmt/v2alpha1/cloud_provider_client.go new file mode 100644 index 00000000..15b5e1be --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_client.go @@ -0,0 +1,330 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// CloudProviderClient is the client of the 'cloud_provider' resource. +// +// Manages a specific cloud provider. +type CloudProviderClient struct { + transport http.RoundTripper + path string +} + +// NewCloudProviderClient creates a new client for the 'cloud_provider' +// resource using the given transport to send the requests and receive the +// responses. +func NewCloudProviderClient(transport http.RoundTripper, path string) *CloudProviderClient { + return &CloudProviderClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the cloud provider. +func (c *CloudProviderClient) Get() *CloudProviderGetRequest { + return &CloudProviderGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// AvailableRegions returns the target 'available_regions' resource. +// +// Reference to the resource that manages the collection of available regions for +// this cloud provider. +func (c *CloudProviderClient) AvailableRegions() *AvailableRegionsClient { + return NewAvailableRegionsClient( + c.transport, + path.Join(c.path, "available_regions"), + ) +} + +// Regions returns the target 'cloud_regions' resource. +// +// Reference to the resource that manages the collection of regions for +// this cloud provider. +func (c *CloudProviderClient) Regions() *CloudRegionsClient { + return NewCloudRegionsClient( + c.transport, + path.Join(c.path, "regions"), + ) +} + +// CloudProviderPollRequest is the request for the Poll method. +type CloudProviderPollRequest struct { + request *CloudProviderGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *CloudProviderPollRequest) Parameter(name string, value interface{}) *CloudProviderPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *CloudProviderPollRequest) Header(name string, value interface{}) *CloudProviderPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *CloudProviderPollRequest) Interval(value time.Duration) *CloudProviderPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *CloudProviderPollRequest) Status(value int) *CloudProviderPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *CloudProviderPollRequest) Predicate(value func(*CloudProviderGetResponse) bool) *CloudProviderPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*CloudProviderGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *CloudProviderPollRequest) StartContext(ctx context.Context) (response *CloudProviderPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &CloudProviderPollResponse{ + response: result.(*CloudProviderGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *CloudProviderPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// CloudProviderPollResponse is the response for the Poll method. +type CloudProviderPollResponse struct { + response *CloudProviderGetResponse +} + +// Status returns the response status code. +func (r *CloudProviderPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *CloudProviderPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *CloudProviderPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *CloudProviderPollResponse) Body() *CloudProvider { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CloudProviderPollResponse) GetBody() (value *CloudProvider, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *CloudProviderClient) Poll() *CloudProviderPollRequest { + return &CloudProviderPollRequest{ + request: c.Get(), + } +} + +// CloudProviderGetRequest is the request for the 'get' method. +type CloudProviderGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *CloudProviderGetRequest) Parameter(name string, value interface{}) *CloudProviderGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudProviderGetRequest) Header(name string, value interface{}) *CloudProviderGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudProviderGetRequest) Impersonate(user string) *CloudProviderGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudProviderGetRequest) Send() (result *CloudProviderGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudProviderGetRequest) SendContext(ctx context.Context) (result *CloudProviderGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudProviderGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCloudProviderGetResponse(result, reader) + if err != nil { + return + } + return +} + +// CloudProviderGetResponse is the response for the 'get' method. +type CloudProviderGetResponse struct { + status int + header http.Header + err *errors.Error + body *CloudProvider +} + +// Status returns the response status code. +func (r *CloudProviderGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudProviderGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudProviderGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *CloudProviderGetResponse) Body() *CloudProvider { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CloudProviderGetResponse) GetBody() (value *CloudProvider, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_data_builder.go b/clustersmgmt/v2alpha1/cloud_provider_data_builder.go new file mode 100644 index 00000000..53406401 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_data_builder.go @@ -0,0 +1,230 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudProviderDataBuilder contains the data and logic needed to build 'cloud_provider_data' objects. +// +// Description of a cloud provider data used for cloud provider inquiries. +type CloudProviderDataBuilder struct { + bitmap_ uint32 + aws *AWSBuilder + gcp *GCPBuilder + availabilityZones []string + keyLocation string + keyRingName string + region *CloudRegionBuilder + subnets []string + version *VersionBuilder + vpcIds []string +} + +// NewCloudProviderData creates a new builder of 'cloud_provider_data' objects. +func NewCloudProviderData() *CloudProviderDataBuilder { + return &CloudProviderDataBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CloudProviderDataBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AWS sets the value of the 'AWS' attribute to the given value. +// +// _Amazon Web Services_ specific settings of a cluster. +func (b *CloudProviderDataBuilder) AWS(value *AWSBuilder) *CloudProviderDataBuilder { + b.aws = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// GCP sets the value of the 'GCP' attribute to the given value. +// +// Google cloud platform settings of a cluster. +func (b *CloudProviderDataBuilder) GCP(value *GCPBuilder) *CloudProviderDataBuilder { + b.gcp = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// AvailabilityZones sets the value of the 'availability_zones' attribute to the given values. +func (b *CloudProviderDataBuilder) AvailabilityZones(values ...string) *CloudProviderDataBuilder { + b.availabilityZones = make([]string, len(values)) + copy(b.availabilityZones, values) + b.bitmap_ |= 4 + return b +} + +// KeyLocation sets the value of the 'key_location' attribute to the given value. +func (b *CloudProviderDataBuilder) KeyLocation(value string) *CloudProviderDataBuilder { + b.keyLocation = value + b.bitmap_ |= 8 + return b +} + +// KeyRingName sets the value of the 'key_ring_name' attribute to the given value. +func (b *CloudProviderDataBuilder) KeyRingName(value string) *CloudProviderDataBuilder { + b.keyRingName = value + b.bitmap_ |= 16 + return b +} + +// Region sets the value of the 'region' attribute to the given value. +// +// Description of a region of a cloud provider. +func (b *CloudProviderDataBuilder) Region(value *CloudRegionBuilder) *CloudProviderDataBuilder { + b.region = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Subnets sets the value of the 'subnets' attribute to the given values. +func (b *CloudProviderDataBuilder) Subnets(values ...string) *CloudProviderDataBuilder { + b.subnets = make([]string, len(values)) + copy(b.subnets, values) + b.bitmap_ |= 64 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +// +// Representation of an _OpenShift_ version. +func (b *CloudProviderDataBuilder) Version(value *VersionBuilder) *CloudProviderDataBuilder { + b.version = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// VpcIds sets the value of the 'vpc_ids' attribute to the given values. +func (b *CloudProviderDataBuilder) VpcIds(values ...string) *CloudProviderDataBuilder { + b.vpcIds = make([]string, len(values)) + copy(b.vpcIds, values) + b.bitmap_ |= 256 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CloudProviderDataBuilder) Copy(object *CloudProviderData) *CloudProviderDataBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.aws != nil { + b.aws = NewAWS().Copy(object.aws) + } else { + b.aws = nil + } + if object.gcp != nil { + b.gcp = NewGCP().Copy(object.gcp) + } else { + b.gcp = nil + } + if object.availabilityZones != nil { + b.availabilityZones = make([]string, len(object.availabilityZones)) + copy(b.availabilityZones, object.availabilityZones) + } else { + b.availabilityZones = nil + } + b.keyLocation = object.keyLocation + b.keyRingName = object.keyRingName + if object.region != nil { + b.region = NewCloudRegion().Copy(object.region) + } else { + b.region = nil + } + if object.subnets != nil { + b.subnets = make([]string, len(object.subnets)) + copy(b.subnets, object.subnets) + } else { + b.subnets = nil + } + if object.version != nil { + b.version = NewVersion().Copy(object.version) + } else { + b.version = nil + } + if object.vpcIds != nil { + b.vpcIds = make([]string, len(object.vpcIds)) + copy(b.vpcIds, object.vpcIds) + } else { + b.vpcIds = nil + } + return b +} + +// Build creates a 'cloud_provider_data' object using the configuration stored in the builder. +func (b *CloudProviderDataBuilder) Build() (object *CloudProviderData, err error) { + object = new(CloudProviderData) + object.bitmap_ = b.bitmap_ + if b.aws != nil { + object.aws, err = b.aws.Build() + if err != nil { + return + } + } + if b.gcp != nil { + object.gcp, err = b.gcp.Build() + if err != nil { + return + } + } + if b.availabilityZones != nil { + object.availabilityZones = make([]string, len(b.availabilityZones)) + copy(object.availabilityZones, b.availabilityZones) + } + object.keyLocation = b.keyLocation + object.keyRingName = b.keyRingName + if b.region != nil { + object.region, err = b.region.Build() + if err != nil { + return + } + } + if b.subnets != nil { + object.subnets = make([]string, len(b.subnets)) + copy(object.subnets, b.subnets) + } + if b.version != nil { + object.version, err = b.version.Build() + if err != nil { + return + } + } + if b.vpcIds != nil { + object.vpcIds = make([]string, len(b.vpcIds)) + copy(object.vpcIds, b.vpcIds) + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_data_list_builder.go b/clustersmgmt/v2alpha1/cloud_provider_data_list_builder.go new file mode 100644 index 00000000..266c191d --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_data_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudProviderDataListBuilder contains the data and logic needed to build +// 'cloud_provider_data' objects. +type CloudProviderDataListBuilder struct { + items []*CloudProviderDataBuilder +} + +// NewCloudProviderDataList creates a new builder of 'cloud_provider_data' objects. +func NewCloudProviderDataList() *CloudProviderDataListBuilder { + return new(CloudProviderDataListBuilder) +} + +// Items sets the items of the list. +func (b *CloudProviderDataListBuilder) Items(values ...*CloudProviderDataBuilder) *CloudProviderDataListBuilder { + b.items = make([]*CloudProviderDataBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CloudProviderDataListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CloudProviderDataListBuilder) Copy(list *CloudProviderDataList) *CloudProviderDataListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CloudProviderDataBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCloudProviderData().Copy(v) + } + } + return b +} + +// Build creates a list of 'cloud_provider_data' objects using the +// configuration stored in the builder. +func (b *CloudProviderDataListBuilder) Build() (list *CloudProviderDataList, err error) { + items := make([]*CloudProviderData, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CloudProviderDataList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_data_list_type_json.go b/clustersmgmt/v2alpha1/cloud_provider_data_list_type_json.go new file mode 100644 index 00000000..32651e83 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_data_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudProviderDataList writes a list of values of the 'cloud_provider_data' type to +// the given writer. +func MarshalCloudProviderDataList(list []*CloudProviderData, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudProviderDataList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudProviderDataList writes a list of value of the 'cloud_provider_data' type to +// the given stream. +func writeCloudProviderDataList(list []*CloudProviderData, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCloudProviderData(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCloudProviderDataList reads a list of values of the 'cloud_provider_data' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCloudProviderDataList(source interface{}) (items []*CloudProviderData, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCloudProviderDataList(iterator) + err = iterator.Error + return +} + +// readCloudProviderDataList reads list of values of the ”cloud_provider_data' type from +// the given iterator. +func readCloudProviderDataList(iterator *jsoniter.Iterator) []*CloudProviderData { + list := []*CloudProviderData{} + for iterator.ReadArray() { + item := readCloudProviderData(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_data_type.go b/clustersmgmt/v2alpha1/cloud_provider_data_type.go new file mode 100644 index 00000000..83ae96ec --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_data_type.go @@ -0,0 +1,334 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudProviderData represents the values of the 'cloud_provider_data' type. +// +// Description of a cloud provider data used for cloud provider inquiries. +type CloudProviderData struct { + bitmap_ uint32 + aws *AWS + gcp *GCP + availabilityZones []string + keyLocation string + keyRingName string + region *CloudRegion + subnets []string + version *Version + vpcIds []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CloudProviderData) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AWS returns the value of the 'AWS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Amazon Web Services settings. +func (o *CloudProviderData) AWS() *AWS { + if o != nil && o.bitmap_&1 != 0 { + return o.aws + } + return nil +} + +// GetAWS returns the value of the 'AWS' attribute and +// a flag indicating if the attribute has a value. +// +// Amazon Web Services settings. +func (o *CloudProviderData) GetAWS() (value *AWS, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.aws + } + return +} + +// GCP returns the value of the 'GCP' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Google cloud platform settings. +func (o *CloudProviderData) GCP() *GCP { + if o != nil && o.bitmap_&2 != 0 { + return o.gcp + } + return nil +} + +// GetGCP returns the value of the 'GCP' attribute and +// a flag indicating if the attribute has a value. +// +// Google cloud platform settings. +func (o *CloudProviderData) GetGCP() (value *GCP, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.gcp + } + return +} + +// AvailabilityZones returns the value of the 'availability_zones' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Availability zone +func (o *CloudProviderData) AvailabilityZones() []string { + if o != nil && o.bitmap_&4 != 0 { + return o.availabilityZones + } + return nil +} + +// GetAvailabilityZones returns the value of the 'availability_zones' attribute and +// a flag indicating if the attribute has a value. +// +// Availability zone +func (o *CloudProviderData) GetAvailabilityZones() (value []string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.availabilityZones + } + return +} + +// KeyLocation returns the value of the 'key_location' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Key location +func (o *CloudProviderData) KeyLocation() string { + if o != nil && o.bitmap_&8 != 0 { + return o.keyLocation + } + return "" +} + +// GetKeyLocation returns the value of the 'key_location' attribute and +// a flag indicating if the attribute has a value. +// +// Key location +func (o *CloudProviderData) GetKeyLocation() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.keyLocation + } + return +} + +// KeyRingName returns the value of the 'key_ring_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Key ring name +func (o *CloudProviderData) KeyRingName() string { + if o != nil && o.bitmap_&16 != 0 { + return o.keyRingName + } + return "" +} + +// GetKeyRingName returns the value of the 'key_ring_name' attribute and +// a flag indicating if the attribute has a value. +// +// Key ring name +func (o *CloudProviderData) GetKeyRingName() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.keyRingName + } + return +} + +// Region returns the value of the 'region' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Region +func (o *CloudProviderData) Region() *CloudRegion { + if o != nil && o.bitmap_&32 != 0 { + return o.region + } + return nil +} + +// GetRegion returns the value of the 'region' attribute and +// a flag indicating if the attribute has a value. +// +// Region +func (o *CloudProviderData) GetRegion() (value *CloudRegion, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.region + } + return +} + +// Subnets returns the value of the 'subnets' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Subnets +func (o *CloudProviderData) Subnets() []string { + if o != nil && o.bitmap_&64 != 0 { + return o.subnets + } + return nil +} + +// GetSubnets returns the value of the 'subnets' attribute and +// a flag indicating if the attribute has a value. +// +// Subnets +func (o *CloudProviderData) GetSubnets() (value []string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.subnets + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Openshift version +func (o *CloudProviderData) Version() *Version { + if o != nil && o.bitmap_&128 != 0 { + return o.version + } + return nil +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Openshift version +func (o *CloudProviderData) GetVersion() (value *Version, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.version + } + return +} + +// VpcIds returns the value of the 'vpc_ids' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// VPC ids +func (o *CloudProviderData) VpcIds() []string { + if o != nil && o.bitmap_&256 != 0 { + return o.vpcIds + } + return nil +} + +// GetVpcIds returns the value of the 'vpc_ids' attribute and +// a flag indicating if the attribute has a value. +// +// VPC ids +func (o *CloudProviderData) GetVpcIds() (value []string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.vpcIds + } + return +} + +// CloudProviderDataListKind is the name of the type used to represent list of objects of +// type 'cloud_provider_data'. +const CloudProviderDataListKind = "CloudProviderDataList" + +// CloudProviderDataListLinkKind is the name of the type used to represent links to list +// of objects of type 'cloud_provider_data'. +const CloudProviderDataListLinkKind = "CloudProviderDataListLink" + +// CloudProviderDataNilKind is the name of the type used to nil lists of objects of +// type 'cloud_provider_data'. +const CloudProviderDataListNilKind = "CloudProviderDataListNil" + +// CloudProviderDataList is a list of values of the 'cloud_provider_data' type. +type CloudProviderDataList struct { + href string + link bool + items []*CloudProviderData +} + +// Len returns the length of the list. +func (l *CloudProviderDataList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CloudProviderDataList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CloudProviderDataList) Get(i int) *CloudProviderData { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CloudProviderDataList) Slice() []*CloudProviderData { + var slice []*CloudProviderData + if l == nil { + slice = make([]*CloudProviderData, 0) + } else { + slice = make([]*CloudProviderData, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CloudProviderDataList) Each(f func(item *CloudProviderData) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CloudProviderDataList) Range(f func(index int, item *CloudProviderData) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_data_type_json.go b/clustersmgmt/v2alpha1/cloud_provider_data_type_json.go new file mode 100644 index 00000000..e7b4bf3f --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_data_type_json.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudProviderData writes a value of the 'cloud_provider_data' type to the given writer. +func MarshalCloudProviderData(object *CloudProviderData, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudProviderData(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudProviderData writes a value of the 'cloud_provider_data' type to the given stream. +func writeCloudProviderData(object *CloudProviderData, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.aws != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws") + writeAWS(object.aws, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.gcp != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp") + writeGCP(object.gcp, stream) + count++ + } + present_ = object.bitmap_&4 != 0 && object.availabilityZones != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zones") + writeStringList(object.availabilityZones, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key_location") + stream.WriteString(object.keyLocation) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key_ring_name") + stream.WriteString(object.keyRingName) + count++ + } + present_ = object.bitmap_&32 != 0 && object.region != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("region") + writeCloudRegion(object.region, stream) + count++ + } + present_ = object.bitmap_&64 != 0 && object.subnets != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnets") + writeStringList(object.subnets, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.version != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + writeVersion(object.version, stream) + count++ + } + present_ = object.bitmap_&256 != 0 && object.vpcIds != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("vpc_ids") + writeStringList(object.vpcIds, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalCloudProviderData reads a value of the 'cloud_provider_data' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCloudProviderData(source interface{}) (object *CloudProviderData, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCloudProviderData(iterator) + err = iterator.Error + return +} + +// readCloudProviderData reads a value of the 'cloud_provider_data' type from the given iterator. +func readCloudProviderData(iterator *jsoniter.Iterator) *CloudProviderData { + object := &CloudProviderData{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "aws": + value := readAWS(iterator) + object.aws = value + object.bitmap_ |= 1 + case "gcp": + value := readGCP(iterator) + object.gcp = value + object.bitmap_ |= 2 + case "availability_zones": + value := readStringList(iterator) + object.availabilityZones = value + object.bitmap_ |= 4 + case "key_location": + value := iterator.ReadString() + object.keyLocation = value + object.bitmap_ |= 8 + case "key_ring_name": + value := iterator.ReadString() + object.keyRingName = value + object.bitmap_ |= 16 + case "region": + value := readCloudRegion(iterator) + object.region = value + object.bitmap_ |= 32 + case "subnets": + value := readStringList(iterator) + object.subnets = value + object.bitmap_ |= 64 + case "version": + value := readVersion(iterator) + object.version = value + object.bitmap_ |= 128 + case "vpc_ids": + value := readStringList(iterator) + object.vpcIds = value + object.bitmap_ |= 256 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_list_builder.go b/clustersmgmt/v2alpha1/cloud_provider_list_builder.go new file mode 100644 index 00000000..79cc39b0 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudProviderListBuilder contains the data and logic needed to build +// 'cloud_provider' objects. +type CloudProviderListBuilder struct { + items []*CloudProviderBuilder +} + +// NewCloudProviderList creates a new builder of 'cloud_provider' objects. +func NewCloudProviderList() *CloudProviderListBuilder { + return new(CloudProviderListBuilder) +} + +// Items sets the items of the list. +func (b *CloudProviderListBuilder) Items(values ...*CloudProviderBuilder) *CloudProviderListBuilder { + b.items = make([]*CloudProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CloudProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CloudProviderListBuilder) Copy(list *CloudProviderList) *CloudProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CloudProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCloudProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'cloud_provider' objects using the +// configuration stored in the builder. +func (b *CloudProviderListBuilder) Build() (list *CloudProviderList, err error) { + items := make([]*CloudProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CloudProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_list_type_json.go b/clustersmgmt/v2alpha1/cloud_provider_list_type_json.go new file mode 100644 index 00000000..0b8f5fa1 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudProviderList writes a list of values of the 'cloud_provider' type to +// the given writer. +func MarshalCloudProviderList(list []*CloudProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudProviderList writes a list of value of the 'cloud_provider' type to +// the given stream. +func writeCloudProviderList(list []*CloudProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCloudProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCloudProviderList reads a list of values of the 'cloud_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCloudProviderList(source interface{}) (items []*CloudProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCloudProviderList(iterator) + err = iterator.Error + return +} + +// readCloudProviderList reads list of values of the ”cloud_provider' type from +// the given iterator. +func readCloudProviderList(iterator *jsoniter.Iterator) []*CloudProvider { + list := []*CloudProvider{} + for iterator.ReadArray() { + item := readCloudProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_resource_json.go b/clustersmgmt/v2alpha1/cloud_provider_resource_json.go new file mode 100644 index 00000000..24b71418 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeCloudProviderGetRequest(request *CloudProviderGetRequest, writer io.Writer) error { + return nil +} +func readCloudProviderGetResponse(response *CloudProviderGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCloudProvider(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_type.go b/clustersmgmt/v2alpha1/cloud_provider_type.go new file mode 100644 index 00000000..60a802e6 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_type.go @@ -0,0 +1,292 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudProviderKind is the name of the type used to represent objects +// of type 'cloud_provider'. +const CloudProviderKind = "CloudProvider" + +// CloudProviderLinkKind is the name of the type used to represent links +// to objects of type 'cloud_provider'. +const CloudProviderLinkKind = "CloudProviderLink" + +// CloudProviderNilKind is the name of the type used to nil references +// to objects of type 'cloud_provider'. +const CloudProviderNilKind = "CloudProviderNil" + +// CloudProvider represents the values of the 'cloud_provider' type. +// +// Cloud provider. +type CloudProvider struct { + bitmap_ uint32 + id string + href string + displayName string + name string + regions []*CloudRegion +} + +// Kind returns the name of the type of the object. +func (o *CloudProvider) Kind() string { + if o == nil { + return CloudProviderNilKind + } + if o.bitmap_&1 != 0 { + return CloudProviderLinkKind + } + return CloudProviderKind +} + +// Link returns true iif this is a link. +func (o *CloudProvider) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *CloudProvider) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *CloudProvider) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *CloudProvider) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *CloudProvider) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CloudProvider) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// DisplayName returns the value of the 'display_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the cloud provider for display purposes. It can contain any characters, +// including spaces. +func (o *CloudProvider) DisplayName() string { + if o != nil && o.bitmap_&8 != 0 { + return o.displayName + } + return "" +} + +// GetDisplayName returns the value of the 'display_name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the cloud provider for display purposes. It can contain any characters, +// including spaces. +func (o *CloudProvider) GetDisplayName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.displayName + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Human friendly identifier of the cloud provider, for example `aws`. +func (o *CloudProvider) Name() string { + if o != nil && o.bitmap_&16 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Human friendly identifier of the cloud provider, for example `aws`. +func (o *CloudProvider) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.name + } + return +} + +// Regions returns the value of the 'regions' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// (optional) Provider's regions - only included when listing providers with `fetchRegions=true`. +func (o *CloudProvider) Regions() []*CloudRegion { + if o != nil && o.bitmap_&32 != 0 { + return o.regions + } + return nil +} + +// GetRegions returns the value of the 'regions' attribute and +// a flag indicating if the attribute has a value. +// +// (optional) Provider's regions - only included when listing providers with `fetchRegions=true`. +func (o *CloudProvider) GetRegions() (value []*CloudRegion, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.regions + } + return +} + +// CloudProviderListKind is the name of the type used to represent list of objects of +// type 'cloud_provider'. +const CloudProviderListKind = "CloudProviderList" + +// CloudProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'cloud_provider'. +const CloudProviderListLinkKind = "CloudProviderListLink" + +// CloudProviderNilKind is the name of the type used to nil lists of objects of +// type 'cloud_provider'. +const CloudProviderListNilKind = "CloudProviderListNil" + +// CloudProviderList is a list of values of the 'cloud_provider' type. +type CloudProviderList struct { + href string + link bool + items []*CloudProvider +} + +// Kind returns the name of the type of the object. +func (l *CloudProviderList) Kind() string { + if l == nil { + return CloudProviderListNilKind + } + if l.link { + return CloudProviderListLinkKind + } + return CloudProviderListKind +} + +// Link returns true iif this is a link. +func (l *CloudProviderList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *CloudProviderList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *CloudProviderList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *CloudProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CloudProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CloudProviderList) Get(i int) *CloudProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CloudProviderList) Slice() []*CloudProvider { + var slice []*CloudProvider + if l == nil { + slice = make([]*CloudProvider, 0) + } else { + slice = make([]*CloudProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CloudProviderList) Each(f func(item *CloudProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CloudProviderList) Range(f func(index int, item *CloudProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cloud_provider_type_json.go b/clustersmgmt/v2alpha1/cloud_provider_type_json.go new file mode 100644 index 00000000..9cf48730 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_provider_type_json.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudProvider writes a value of the 'cloud_provider' type to the given writer. +func MarshalCloudProvider(object *CloudProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudProvider writes a value of the 'cloud_provider' type to the given stream. +func writeCloudProvider(object *CloudProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(CloudProviderLinkKind) + } else { + stream.WriteString(CloudProviderKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("display_name") + stream.WriteString(object.displayName) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&32 != 0 && object.regions != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("regions") + writeCloudRegionList(object.regions, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalCloudProvider reads a value of the 'cloud_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCloudProvider(source interface{}) (object *CloudProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCloudProvider(iterator) + err = iterator.Error + return +} + +// readCloudProvider reads a value of the 'cloud_provider' type from the given iterator. +func readCloudProvider(iterator *jsoniter.Iterator) *CloudProvider { + object := &CloudProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == CloudProviderLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "display_name": + value := iterator.ReadString() + object.displayName = value + object.bitmap_ |= 8 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 16 + case "regions": + value := readCloudRegionList(iterator) + object.regions = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cloud_providers_client.go b/clustersmgmt/v2alpha1/cloud_providers_client.go new file mode 100644 index 00000000..9d24bb12 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_providers_client.go @@ -0,0 +1,359 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// CloudProvidersClient is the client of the 'cloud_providers' resource. +// +// Manages the collection of cloud providers. +type CloudProvidersClient struct { + transport http.RoundTripper + path string +} + +// NewCloudProvidersClient creates a new client for the 'cloud_providers' +// resource using the given transport to send the requests and receive the +// responses. +func NewCloudProvidersClient(transport http.RoundTripper, path string) *CloudProvidersClient { + return &CloudProvidersClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of cloud providers. +func (c *CloudProvidersClient) List() *CloudProvidersListRequest { + return &CloudProvidersListRequest{ + transport: c.transport, + path: c.path, + } +} + +// CloudProvider returns the target 'cloud_provider' resource for the given identifier. +// +// Returns a reference to the service that manages an specific cloud provider. +func (c *CloudProvidersClient) CloudProvider(id string) *CloudProviderClient { + return NewCloudProviderClient( + c.transport, + path.Join(c.path, id), + ) +} + +// CloudProvidersListRequest is the request for the 'list' method. +type CloudProvidersListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + fetchRegions *bool + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *CloudProvidersListRequest) Parameter(name string, value interface{}) *CloudProvidersListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudProvidersListRequest) Header(name string, value interface{}) *CloudProvidersListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudProvidersListRequest) Impersonate(user string) *CloudProvidersListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// FetchRegions sets the value of the 'fetch_regions' parameter. +// +// If true, includes the regions on each provider in the output. Could slow request response time. +func (r *CloudProvidersListRequest) FetchRegions(value bool) *CloudProvidersListRequest { + r.fetchRegions = &value + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the cloud provider +// instead of the names of the columns of a table. For example, in order to sort the +// clusters descending by name identifier the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *CloudProvidersListRequest) Order(value string) *CloudProvidersListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *CloudProvidersListRequest) Page(value int) *CloudProvidersListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the cloud provider +// instead of the names of the columns of a table. For example, in order to retrieve +// all the cloud providers with a name starting with `A` the value should be: +// +// ```sql +// name like 'A%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the clusters +// that the user has permission to see will be returned. +func (r *CloudProvidersListRequest) Search(value string) *CloudProvidersListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *CloudProvidersListRequest) Size(value int) *CloudProvidersListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudProvidersListRequest) Send() (result *CloudProvidersListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudProvidersListRequest) SendContext(ctx context.Context) (result *CloudProvidersListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.fetchRegions != nil { + helpers.AddValue(&query, "fetchRegions", *r.fetchRegions) + } + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudProvidersListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCloudProvidersListResponse(result, reader) + if err != nil { + return + } + return +} + +// CloudProvidersListResponse is the response for the 'list' method. +type CloudProvidersListResponse struct { + status int + header http.Header + err *errors.Error + items *CloudProviderList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *CloudProvidersListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudProvidersListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudProvidersListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of cloud providers. +func (r *CloudProvidersListResponse) Items() *CloudProviderList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of cloud providers. +func (r *CloudProvidersListResponse) GetItems() (value *CloudProviderList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *CloudProvidersListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *CloudProvidersListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *CloudProvidersListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *CloudProvidersListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *CloudProvidersListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *CloudProvidersListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_providers_resource_json.go b/clustersmgmt/v2alpha1/cloud_providers_resource_json.go new file mode 100644 index 00000000..9fecac5f --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_providers_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeCloudProvidersListRequest(request *CloudProvidersListRequest, writer io.Writer) error { + return nil +} +func readCloudProvidersListResponse(response *CloudProvidersListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readCloudProviderList(iterator) + response.items = &CloudProviderList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/cloud_region_builder.go b/clustersmgmt/v2alpha1/cloud_region_builder.go new file mode 100644 index 00000000..8f320609 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_builder.go @@ -0,0 +1,194 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudRegionBuilder contains the data and logic needed to build 'cloud_region' objects. +// +// Description of a region of a cloud provider. +type CloudRegionBuilder struct { + bitmap_ uint32 + id string + href string + kmsLocationID string + kmsLocationName string + cloudProvider *CloudProviderBuilder + displayName string + name string + ccsOnly bool + enabled bool + govCloud bool + supportsHypershift bool + supportsMultiAZ bool +} + +// NewCloudRegion creates a new builder of 'cloud_region' objects. +func NewCloudRegion() *CloudRegionBuilder { + return &CloudRegionBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *CloudRegionBuilder) Link(value bool) *CloudRegionBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *CloudRegionBuilder) ID(value string) *CloudRegionBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *CloudRegionBuilder) HREF(value string) *CloudRegionBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CloudRegionBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// CCSOnly sets the value of the 'CCS_only' attribute to the given value. +func (b *CloudRegionBuilder) CCSOnly(value bool) *CloudRegionBuilder { + b.ccsOnly = value + b.bitmap_ |= 8 + return b +} + +// KMSLocationID sets the value of the 'KMS_location_ID' attribute to the given value. +func (b *CloudRegionBuilder) KMSLocationID(value string) *CloudRegionBuilder { + b.kmsLocationID = value + b.bitmap_ |= 16 + return b +} + +// KMSLocationName sets the value of the 'KMS_location_name' attribute to the given value. +func (b *CloudRegionBuilder) KMSLocationName(value string) *CloudRegionBuilder { + b.kmsLocationName = value + b.bitmap_ |= 32 + return b +} + +// CloudProvider sets the value of the 'cloud_provider' attribute to the given value. +// +// Cloud provider. +func (b *CloudRegionBuilder) CloudProvider(value *CloudProviderBuilder) *CloudRegionBuilder { + b.cloudProvider = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// DisplayName sets the value of the 'display_name' attribute to the given value. +func (b *CloudRegionBuilder) DisplayName(value string) *CloudRegionBuilder { + b.displayName = value + b.bitmap_ |= 128 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *CloudRegionBuilder) Enabled(value bool) *CloudRegionBuilder { + b.enabled = value + b.bitmap_ |= 256 + return b +} + +// GovCloud sets the value of the 'gov_cloud' attribute to the given value. +func (b *CloudRegionBuilder) GovCloud(value bool) *CloudRegionBuilder { + b.govCloud = value + b.bitmap_ |= 512 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *CloudRegionBuilder) Name(value string) *CloudRegionBuilder { + b.name = value + b.bitmap_ |= 1024 + return b +} + +// SupportsHypershift sets the value of the 'supports_hypershift' attribute to the given value. +func (b *CloudRegionBuilder) SupportsHypershift(value bool) *CloudRegionBuilder { + b.supportsHypershift = value + b.bitmap_ |= 2048 + return b +} + +// SupportsMultiAZ sets the value of the 'supports_multi_AZ' attribute to the given value. +func (b *CloudRegionBuilder) SupportsMultiAZ(value bool) *CloudRegionBuilder { + b.supportsMultiAZ = value + b.bitmap_ |= 4096 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CloudRegionBuilder) Copy(object *CloudRegion) *CloudRegionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.ccsOnly = object.ccsOnly + b.kmsLocationID = object.kmsLocationID + b.kmsLocationName = object.kmsLocationName + if object.cloudProvider != nil { + b.cloudProvider = NewCloudProvider().Copy(object.cloudProvider) + } else { + b.cloudProvider = nil + } + b.displayName = object.displayName + b.enabled = object.enabled + b.govCloud = object.govCloud + b.name = object.name + b.supportsHypershift = object.supportsHypershift + b.supportsMultiAZ = object.supportsMultiAZ + return b +} + +// Build creates a 'cloud_region' object using the configuration stored in the builder. +func (b *CloudRegionBuilder) Build() (object *CloudRegion, err error) { + object = new(CloudRegion) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.ccsOnly = b.ccsOnly + object.kmsLocationID = b.kmsLocationID + object.kmsLocationName = b.kmsLocationName + if b.cloudProvider != nil { + object.cloudProvider, err = b.cloudProvider.Build() + if err != nil { + return + } + } + object.displayName = b.displayName + object.enabled = b.enabled + object.govCloud = b.govCloud + object.name = b.name + object.supportsHypershift = b.supportsHypershift + object.supportsMultiAZ = b.supportsMultiAZ + return +} diff --git a/clustersmgmt/v2alpha1/cloud_region_client.go b/clustersmgmt/v2alpha1/cloud_region_client.go new file mode 100644 index 00000000..e17cbde5 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// CloudRegionClient is the client of the 'cloud_region' resource. +// +// Manages a specific cloud region. +type CloudRegionClient struct { + transport http.RoundTripper + path string +} + +// NewCloudRegionClient creates a new client for the 'cloud_region' +// resource using the given transport to send the requests and receive the +// responses. +func NewCloudRegionClient(transport http.RoundTripper, path string) *CloudRegionClient { + return &CloudRegionClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the region. +func (c *CloudRegionClient) Delete() *CloudRegionDeleteRequest { + return &CloudRegionDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the region. +func (c *CloudRegionClient) Get() *CloudRegionGetRequest { + return &CloudRegionGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the region. +func (c *CloudRegionClient) Update() *CloudRegionUpdateRequest { + return &CloudRegionUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// CloudRegionPollRequest is the request for the Poll method. +type CloudRegionPollRequest struct { + request *CloudRegionGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *CloudRegionPollRequest) Parameter(name string, value interface{}) *CloudRegionPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *CloudRegionPollRequest) Header(name string, value interface{}) *CloudRegionPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *CloudRegionPollRequest) Interval(value time.Duration) *CloudRegionPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *CloudRegionPollRequest) Status(value int) *CloudRegionPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *CloudRegionPollRequest) Predicate(value func(*CloudRegionGetResponse) bool) *CloudRegionPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*CloudRegionGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *CloudRegionPollRequest) StartContext(ctx context.Context) (response *CloudRegionPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &CloudRegionPollResponse{ + response: result.(*CloudRegionGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *CloudRegionPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// CloudRegionPollResponse is the response for the Poll method. +type CloudRegionPollResponse struct { + response *CloudRegionGetResponse +} + +// Status returns the response status code. +func (r *CloudRegionPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *CloudRegionPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *CloudRegionPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *CloudRegionPollResponse) Body() *CloudRegion { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CloudRegionPollResponse) GetBody() (value *CloudRegion, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *CloudRegionClient) Poll() *CloudRegionPollRequest { + return &CloudRegionPollRequest{ + request: c.Get(), + } +} + +// CloudRegionDeleteRequest is the request for the 'delete' method. +type CloudRegionDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *CloudRegionDeleteRequest) Parameter(name string, value interface{}) *CloudRegionDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudRegionDeleteRequest) Header(name string, value interface{}) *CloudRegionDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudRegionDeleteRequest) Impersonate(user string) *CloudRegionDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudRegionDeleteRequest) Send() (result *CloudRegionDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudRegionDeleteRequest) SendContext(ctx context.Context) (result *CloudRegionDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudRegionDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// CloudRegionDeleteResponse is the response for the 'delete' method. +type CloudRegionDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *CloudRegionDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudRegionDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudRegionDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// CloudRegionGetRequest is the request for the 'get' method. +type CloudRegionGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *CloudRegionGetRequest) Parameter(name string, value interface{}) *CloudRegionGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudRegionGetRequest) Header(name string, value interface{}) *CloudRegionGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudRegionGetRequest) Impersonate(user string) *CloudRegionGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudRegionGetRequest) Send() (result *CloudRegionGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudRegionGetRequest) SendContext(ctx context.Context) (result *CloudRegionGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudRegionGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCloudRegionGetResponse(result, reader) + if err != nil { + return + } + return +} + +// CloudRegionGetResponse is the response for the 'get' method. +type CloudRegionGetResponse struct { + status int + header http.Header + err *errors.Error + body *CloudRegion +} + +// Status returns the response status code. +func (r *CloudRegionGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudRegionGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudRegionGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *CloudRegionGetResponse) Body() *CloudRegion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CloudRegionGetResponse) GetBody() (value *CloudRegion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// CloudRegionUpdateRequest is the request for the 'update' method. +type CloudRegionUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudRegion +} + +// Parameter adds a query parameter. +func (r *CloudRegionUpdateRequest) Parameter(name string, value interface{}) *CloudRegionUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudRegionUpdateRequest) Header(name string, value interface{}) *CloudRegionUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudRegionUpdateRequest) Impersonate(user string) *CloudRegionUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *CloudRegionUpdateRequest) Body(value *CloudRegion) *CloudRegionUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudRegionUpdateRequest) Send() (result *CloudRegionUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudRegionUpdateRequest) SendContext(ctx context.Context) (result *CloudRegionUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeCloudRegionUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudRegionUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCloudRegionUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// CloudRegionUpdateResponse is the response for the 'update' method. +type CloudRegionUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *CloudRegion +} + +// Status returns the response status code. +func (r *CloudRegionUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudRegionUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudRegionUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *CloudRegionUpdateResponse) Body() *CloudRegion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CloudRegionUpdateResponse) GetBody() (value *CloudRegion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_region_list_builder.go b/clustersmgmt/v2alpha1/cloud_region_list_builder.go new file mode 100644 index 00000000..85f260eb --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudRegionListBuilder contains the data and logic needed to build +// 'cloud_region' objects. +type CloudRegionListBuilder struct { + items []*CloudRegionBuilder +} + +// NewCloudRegionList creates a new builder of 'cloud_region' objects. +func NewCloudRegionList() *CloudRegionListBuilder { + return new(CloudRegionListBuilder) +} + +// Items sets the items of the list. +func (b *CloudRegionListBuilder) Items(values ...*CloudRegionBuilder) *CloudRegionListBuilder { + b.items = make([]*CloudRegionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CloudRegionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CloudRegionListBuilder) Copy(list *CloudRegionList) *CloudRegionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CloudRegionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCloudRegion().Copy(v) + } + } + return b +} + +// Build creates a list of 'cloud_region' objects using the +// configuration stored in the builder. +func (b *CloudRegionListBuilder) Build() (list *CloudRegionList, err error) { + items := make([]*CloudRegion, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CloudRegionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cloud_region_list_type_json.go b/clustersmgmt/v2alpha1/cloud_region_list_type_json.go new file mode 100644 index 00000000..0f03097e --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudRegionList writes a list of values of the 'cloud_region' type to +// the given writer. +func MarshalCloudRegionList(list []*CloudRegion, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudRegionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudRegionList writes a list of value of the 'cloud_region' type to +// the given stream. +func writeCloudRegionList(list []*CloudRegion, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCloudRegion(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCloudRegionList reads a list of values of the 'cloud_region' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCloudRegionList(source interface{}) (items []*CloudRegion, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCloudRegionList(iterator) + err = iterator.Error + return +} + +// readCloudRegionList reads list of values of the ”cloud_region' type from +// the given iterator. +func readCloudRegionList(iterator *jsoniter.Iterator) []*CloudRegion { + list := []*CloudRegion{} + for iterator.ReadArray() { + item := readCloudRegion(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cloud_region_resource_json.go b/clustersmgmt/v2alpha1/cloud_region_resource_json.go new file mode 100644 index 00000000..2e08c2ce --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeCloudRegionDeleteRequest(request *CloudRegionDeleteRequest, writer io.Writer) error { + return nil +} +func readCloudRegionDeleteResponse(response *CloudRegionDeleteResponse, reader io.Reader) error { + return nil +} +func writeCloudRegionGetRequest(request *CloudRegionGetRequest, writer io.Writer) error { + return nil +} +func readCloudRegionGetResponse(response *CloudRegionGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCloudRegion(reader) + return err +} +func writeCloudRegionUpdateRequest(request *CloudRegionUpdateRequest, writer io.Writer) error { + return MarshalCloudRegion(request.body, writer) +} +func readCloudRegionUpdateResponse(response *CloudRegionUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCloudRegion(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cloud_region_type.go b/clustersmgmt/v2alpha1/cloud_region_type.go new file mode 100644 index 00000000..9c687e9d --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_type.go @@ -0,0 +1,470 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudRegionKind is the name of the type used to represent objects +// of type 'cloud_region'. +const CloudRegionKind = "CloudRegion" + +// CloudRegionLinkKind is the name of the type used to represent links +// to objects of type 'cloud_region'. +const CloudRegionLinkKind = "CloudRegionLink" + +// CloudRegionNilKind is the name of the type used to nil references +// to objects of type 'cloud_region'. +const CloudRegionNilKind = "CloudRegionNil" + +// CloudRegion represents the values of the 'cloud_region' type. +// +// Description of a region of a cloud provider. +type CloudRegion struct { + bitmap_ uint32 + id string + href string + kmsLocationID string + kmsLocationName string + cloudProvider *CloudProvider + displayName string + name string + ccsOnly bool + enabled bool + govCloud bool + supportsHypershift bool + supportsMultiAZ bool +} + +// Kind returns the name of the type of the object. +func (o *CloudRegion) Kind() string { + if o == nil { + return CloudRegionNilKind + } + if o.bitmap_&1 != 0 { + return CloudRegionLinkKind + } + return CloudRegionKind +} + +// Link returns true iif this is a link. +func (o *CloudRegion) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *CloudRegion) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *CloudRegion) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *CloudRegion) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *CloudRegion) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CloudRegion) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// CCSOnly returns the value of the 'CCS_only' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// 'true' if the region is supported only for CCS clusters, 'false' otherwise. +func (o *CloudRegion) CCSOnly() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.ccsOnly + } + return false +} + +// GetCCSOnly returns the value of the 'CCS_only' attribute and +// a flag indicating if the attribute has a value. +// +// 'true' if the region is supported only for CCS clusters, 'false' otherwise. +func (o *CloudRegion) GetCCSOnly() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.ccsOnly + } + return +} + +// KMSLocationID returns the value of the 'KMS_location_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// (GCP only) Comma-separated list of KMS location IDs that can be used with this region. +// E.g. "global,nam4,us". Order is not guaranteed. +func (o *CloudRegion) KMSLocationID() string { + if o != nil && o.bitmap_&16 != 0 { + return o.kmsLocationID + } + return "" +} + +// GetKMSLocationID returns the value of the 'KMS_location_ID' attribute and +// a flag indicating if the attribute has a value. +// +// (GCP only) Comma-separated list of KMS location IDs that can be used with this region. +// E.g. "global,nam4,us". Order is not guaranteed. +func (o *CloudRegion) GetKMSLocationID() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.kmsLocationID + } + return +} + +// KMSLocationName returns the value of the 'KMS_location_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// (GCP only) Comma-separated list of display names corresponding to KMSLocationID. +// E.g. "Global,nam4 (Iowa, South Carolina, and Oklahoma),US". Order is not guaranteed but will match KMSLocationID. +// Unfortunately, this API doesn't allow robust splitting - Contact ocm-feedback@redhat.com if you want to rely on this. +func (o *CloudRegion) KMSLocationName() string { + if o != nil && o.bitmap_&32 != 0 { + return o.kmsLocationName + } + return "" +} + +// GetKMSLocationName returns the value of the 'KMS_location_name' attribute and +// a flag indicating if the attribute has a value. +// +// (GCP only) Comma-separated list of display names corresponding to KMSLocationID. +// E.g. "Global,nam4 (Iowa, South Carolina, and Oklahoma),US". Order is not guaranteed but will match KMSLocationID. +// Unfortunately, this API doesn't allow robust splitting - Contact ocm-feedback@redhat.com if you want to rely on this. +func (o *CloudRegion) GetKMSLocationName() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.kmsLocationName + } + return +} + +// CloudProvider returns the value of the 'cloud_provider' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the cloud provider that the region belongs to. +func (o *CloudRegion) CloudProvider() *CloudProvider { + if o != nil && o.bitmap_&64 != 0 { + return o.cloudProvider + } + return nil +} + +// GetCloudProvider returns the value of the 'cloud_provider' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the cloud provider that the region belongs to. +func (o *CloudRegion) GetCloudProvider() (value *CloudProvider, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.cloudProvider + } + return +} + +// DisplayName returns the value of the 'display_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the region for display purposes, for example `N. Virginia`. +func (o *CloudRegion) DisplayName() string { + if o != nil && o.bitmap_&128 != 0 { + return o.displayName + } + return "" +} + +// GetDisplayName returns the value of the 'display_name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the region for display purposes, for example `N. Virginia`. +func (o *CloudRegion) GetDisplayName() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.displayName + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Whether the region is enabled for deploying a managed cluster. +func (o *CloudRegion) Enabled() bool { + if o != nil && o.bitmap_&256 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Whether the region is enabled for deploying a managed cluster. +func (o *CloudRegion) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.enabled + } + return +} + +// GovCloud returns the value of the 'gov_cloud' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Whether the region is an AWS GovCloud region. +func (o *CloudRegion) GovCloud() bool { + if o != nil && o.bitmap_&512 != 0 { + return o.govCloud + } + return false +} + +// GetGovCloud returns the value of the 'gov_cloud' attribute and +// a flag indicating if the attribute has a value. +// +// Whether the region is an AWS GovCloud region. +func (o *CloudRegion) GetGovCloud() (value bool, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.govCloud + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Human friendly identifier of the region, for example `us-east-1`. +// +// NOTE: Currently for all cloud providers and all regions `id` and `name` have exactly +// the same values. +func (o *CloudRegion) Name() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Human friendly identifier of the region, for example `us-east-1`. +// +// NOTE: Currently for all cloud providers and all regions `id` and `name` have exactly +// the same values. +func (o *CloudRegion) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.name + } + return +} + +// SupportsHypershift returns the value of the 'supports_hypershift' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// 'true' if the region is supported for Hypershift deployments, 'false' otherwise. +func (o *CloudRegion) SupportsHypershift() bool { + if o != nil && o.bitmap_&2048 != 0 { + return o.supportsHypershift + } + return false +} + +// GetSupportsHypershift returns the value of the 'supports_hypershift' attribute and +// a flag indicating if the attribute has a value. +// +// 'true' if the region is supported for Hypershift deployments, 'false' otherwise. +func (o *CloudRegion) GetSupportsHypershift() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.supportsHypershift + } + return +} + +// SupportsMultiAZ returns the value of the 'supports_multi_AZ' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Whether the region supports multiple availability zones. +func (o *CloudRegion) SupportsMultiAZ() bool { + if o != nil && o.bitmap_&4096 != 0 { + return o.supportsMultiAZ + } + return false +} + +// GetSupportsMultiAZ returns the value of the 'supports_multi_AZ' attribute and +// a flag indicating if the attribute has a value. +// +// Whether the region supports multiple availability zones. +func (o *CloudRegion) GetSupportsMultiAZ() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.supportsMultiAZ + } + return +} + +// CloudRegionListKind is the name of the type used to represent list of objects of +// type 'cloud_region'. +const CloudRegionListKind = "CloudRegionList" + +// CloudRegionListLinkKind is the name of the type used to represent links to list +// of objects of type 'cloud_region'. +const CloudRegionListLinkKind = "CloudRegionListLink" + +// CloudRegionNilKind is the name of the type used to nil lists of objects of +// type 'cloud_region'. +const CloudRegionListNilKind = "CloudRegionListNil" + +// CloudRegionList is a list of values of the 'cloud_region' type. +type CloudRegionList struct { + href string + link bool + items []*CloudRegion +} + +// Kind returns the name of the type of the object. +func (l *CloudRegionList) Kind() string { + if l == nil { + return CloudRegionListNilKind + } + if l.link { + return CloudRegionListLinkKind + } + return CloudRegionListKind +} + +// Link returns true iif this is a link. +func (l *CloudRegionList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *CloudRegionList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *CloudRegionList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *CloudRegionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CloudRegionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CloudRegionList) Get(i int) *CloudRegion { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CloudRegionList) Slice() []*CloudRegion { + var slice []*CloudRegion + if l == nil { + slice = make([]*CloudRegion, 0) + } else { + slice = make([]*CloudRegion, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CloudRegionList) Each(f func(item *CloudRegion) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CloudRegionList) Range(f func(index int, item *CloudRegion) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cloud_region_type_json.go b/clustersmgmt/v2alpha1/cloud_region_type_json.go new file mode 100644 index 00000000..79974fcd --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_region_type_json.go @@ -0,0 +1,237 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudRegion writes a value of the 'cloud_region' type to the given writer. +func MarshalCloudRegion(object *CloudRegion, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudRegion(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudRegion writes a value of the 'cloud_region' type to the given stream. +func writeCloudRegion(object *CloudRegion, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(CloudRegionLinkKind) + } else { + stream.WriteString(CloudRegionKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ccs_only") + stream.WriteBool(object.ccsOnly) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kms_location_id") + stream.WriteString(object.kmsLocationID) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kms_location_name") + stream.WriteString(object.kmsLocationName) + count++ + } + present_ = object.bitmap_&64 != 0 && object.cloudProvider != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cloud_provider") + writeCloudProvider(object.cloudProvider, stream) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("display_name") + stream.WriteString(object.displayName) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("govcloud") + stream.WriteBool(object.govCloud) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("supports_hypershift") + stream.WriteBool(object.supportsHypershift) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("supports_multi_az") + stream.WriteBool(object.supportsMultiAZ) + } + stream.WriteObjectEnd() +} + +// UnmarshalCloudRegion reads a value of the 'cloud_region' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCloudRegion(source interface{}) (object *CloudRegion, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCloudRegion(iterator) + err = iterator.Error + return +} + +// readCloudRegion reads a value of the 'cloud_region' type from the given iterator. +func readCloudRegion(iterator *jsoniter.Iterator) *CloudRegion { + object := &CloudRegion{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == CloudRegionLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "ccs_only": + value := iterator.ReadBool() + object.ccsOnly = value + object.bitmap_ |= 8 + case "kms_location_id": + value := iterator.ReadString() + object.kmsLocationID = value + object.bitmap_ |= 16 + case "kms_location_name": + value := iterator.ReadString() + object.kmsLocationName = value + object.bitmap_ |= 32 + case "cloud_provider": + value := readCloudProvider(iterator) + object.cloudProvider = value + object.bitmap_ |= 64 + case "display_name": + value := iterator.ReadString() + object.displayName = value + object.bitmap_ |= 128 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 256 + case "govcloud": + value := iterator.ReadBool() + object.govCloud = value + object.bitmap_ |= 512 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1024 + case "supports_hypershift": + value := iterator.ReadBool() + object.supportsHypershift = value + object.bitmap_ |= 2048 + case "supports_multi_az": + value := iterator.ReadBool() + object.supportsMultiAZ = value + object.bitmap_ |= 4096 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cloud_regions_client.go b/clustersmgmt/v2alpha1/cloud_regions_client.go new file mode 100644 index 00000000..4677a5ac --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_regions_client.go @@ -0,0 +1,468 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// CloudRegionsClient is the client of the 'cloud_regions' resource. +// +// Manages the collection of regions of a cloud provider. +type CloudRegionsClient struct { + transport http.RoundTripper + path string +} + +// NewCloudRegionsClient creates a new client for the 'cloud_regions' +// resource using the given transport to send the requests and receive the +// responses. +func NewCloudRegionsClient(transport http.RoundTripper, path string) *CloudRegionsClient { + return &CloudRegionsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a cloud region to the database. +func (c *CloudRegionsClient) Add() *CloudRegionsAddRequest { + return &CloudRegionsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of regions of the cloud provider. +// +// IMPORTANT: This collection doesn't currently support paging or searching, so the returned +// `page` will always be 1 and `size` and `total` will always be the total number of regions +// of the provider. +func (c *CloudRegionsClient) List() *CloudRegionsListRequest { + return &CloudRegionsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Region returns the target 'cloud_region' resource for the given identifier. +// +// Reference to the service that manages an specific region. +func (c *CloudRegionsClient) Region(id string) *CloudRegionClient { + return NewCloudRegionClient( + c.transport, + path.Join(c.path, id), + ) +} + +// CloudRegionsAddRequest is the request for the 'add' method. +type CloudRegionsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudRegion +} + +// Parameter adds a query parameter. +func (r *CloudRegionsAddRequest) Parameter(name string, value interface{}) *CloudRegionsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudRegionsAddRequest) Header(name string, value interface{}) *CloudRegionsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudRegionsAddRequest) Impersonate(user string) *CloudRegionsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *CloudRegionsAddRequest) Body(value *CloudRegion) *CloudRegionsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudRegionsAddRequest) Send() (result *CloudRegionsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudRegionsAddRequest) SendContext(ctx context.Context) (result *CloudRegionsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeCloudRegionsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudRegionsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCloudRegionsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// CloudRegionsAddResponse is the response for the 'add' method. +type CloudRegionsAddResponse struct { + status int + header http.Header + err *errors.Error + body *CloudRegion +} + +// Status returns the response status code. +func (r *CloudRegionsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudRegionsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudRegionsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *CloudRegionsAddResponse) Body() *CloudRegion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CloudRegionsAddResponse) GetBody() (value *CloudRegion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// CloudRegionsListRequest is the request for the 'list' method. +type CloudRegionsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *CloudRegionsListRequest) Parameter(name string, value interface{}) *CloudRegionsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CloudRegionsListRequest) Header(name string, value interface{}) *CloudRegionsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CloudRegionsListRequest) Impersonate(user string) *CloudRegionsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *CloudRegionsListRequest) Page(value int) *CloudRegionsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *CloudRegionsListRequest) Size(value int) *CloudRegionsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CloudRegionsListRequest) Send() (result *CloudRegionsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CloudRegionsListRequest) SendContext(ctx context.Context) (result *CloudRegionsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CloudRegionsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCloudRegionsListResponse(result, reader) + if err != nil { + return + } + return +} + +// CloudRegionsListResponse is the response for the 'list' method. +type CloudRegionsListResponse struct { + status int + header http.Header + err *errors.Error + items *CloudRegionList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *CloudRegionsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CloudRegionsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CloudRegionsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of cloud providers. +func (r *CloudRegionsListResponse) Items() *CloudRegionList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of cloud providers. +func (r *CloudRegionsListResponse) GetItems() (value *CloudRegionList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *CloudRegionsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *CloudRegionsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *CloudRegionsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *CloudRegionsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of regions of the provider. +func (r *CloudRegionsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of regions of the provider. +func (r *CloudRegionsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_regions_resource_json.go b/clustersmgmt/v2alpha1/cloud_regions_resource_json.go new file mode 100644 index 00000000..0c40326c --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_regions_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeCloudRegionsAddRequest(request *CloudRegionsAddRequest, writer io.Writer) error { + return MarshalCloudRegion(request.body, writer) +} +func readCloudRegionsAddResponse(response *CloudRegionsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCloudRegion(reader) + return err +} +func writeCloudRegionsListRequest(request *CloudRegionsListRequest, writer io.Writer) error { + return nil +} +func readCloudRegionsListResponse(response *CloudRegionsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readCloudRegionList(iterator) + response.items = &CloudRegionList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/cloud_vpc_builder.go b/clustersmgmt/v2alpha1/cloud_vpc_builder.go new file mode 100644 index 00000000..828c53ca --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_vpc_builder.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudVPCBuilder contains the data and logic needed to build 'cloud_VPC' objects. +// +// Description of a cloud provider virtual private cloud. +type CloudVPCBuilder struct { + bitmap_ uint32 + awsSecurityGroups []*SecurityGroupBuilder + awsSubnets []*SubnetworkBuilder + cidrBlock string + id string + name string + subnets []string + redHatManaged bool +} + +// NewCloudVPC creates a new builder of 'cloud_VPC' objects. +func NewCloudVPC() *CloudVPCBuilder { + return &CloudVPCBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CloudVPCBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AWSSecurityGroups sets the value of the 'AWS_security_groups' attribute to the given values. +func (b *CloudVPCBuilder) AWSSecurityGroups(values ...*SecurityGroupBuilder) *CloudVPCBuilder { + b.awsSecurityGroups = make([]*SecurityGroupBuilder, len(values)) + copy(b.awsSecurityGroups, values) + b.bitmap_ |= 1 + return b +} + +// AWSSubnets sets the value of the 'AWS_subnets' attribute to the given values. +func (b *CloudVPCBuilder) AWSSubnets(values ...*SubnetworkBuilder) *CloudVPCBuilder { + b.awsSubnets = make([]*SubnetworkBuilder, len(values)) + copy(b.awsSubnets, values) + b.bitmap_ |= 2 + return b +} + +// CIDRBlock sets the value of the 'CIDR_block' attribute to the given value. +func (b *CloudVPCBuilder) CIDRBlock(value string) *CloudVPCBuilder { + b.cidrBlock = value + b.bitmap_ |= 4 + return b +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *CloudVPCBuilder) ID(value string) *CloudVPCBuilder { + b.id = value + b.bitmap_ |= 8 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *CloudVPCBuilder) Name(value string) *CloudVPCBuilder { + b.name = value + b.bitmap_ |= 16 + return b +} + +// RedHatManaged sets the value of the 'red_hat_managed' attribute to the given value. +func (b *CloudVPCBuilder) RedHatManaged(value bool) *CloudVPCBuilder { + b.redHatManaged = value + b.bitmap_ |= 32 + return b +} + +// Subnets sets the value of the 'subnets' attribute to the given values. +func (b *CloudVPCBuilder) Subnets(values ...string) *CloudVPCBuilder { + b.subnets = make([]string, len(values)) + copy(b.subnets, values) + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CloudVPCBuilder) Copy(object *CloudVPC) *CloudVPCBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.awsSecurityGroups != nil { + b.awsSecurityGroups = make([]*SecurityGroupBuilder, len(object.awsSecurityGroups)) + for i, v := range object.awsSecurityGroups { + b.awsSecurityGroups[i] = NewSecurityGroup().Copy(v) + } + } else { + b.awsSecurityGroups = nil + } + if object.awsSubnets != nil { + b.awsSubnets = make([]*SubnetworkBuilder, len(object.awsSubnets)) + for i, v := range object.awsSubnets { + b.awsSubnets[i] = NewSubnetwork().Copy(v) + } + } else { + b.awsSubnets = nil + } + b.cidrBlock = object.cidrBlock + b.id = object.id + b.name = object.name + b.redHatManaged = object.redHatManaged + if object.subnets != nil { + b.subnets = make([]string, len(object.subnets)) + copy(b.subnets, object.subnets) + } else { + b.subnets = nil + } + return b +} + +// Build creates a 'cloud_VPC' object using the configuration stored in the builder. +func (b *CloudVPCBuilder) Build() (object *CloudVPC, err error) { + object = new(CloudVPC) + object.bitmap_ = b.bitmap_ + if b.awsSecurityGroups != nil { + object.awsSecurityGroups = make([]*SecurityGroup, len(b.awsSecurityGroups)) + for i, v := range b.awsSecurityGroups { + object.awsSecurityGroups[i], err = v.Build() + if err != nil { + return + } + } + } + if b.awsSubnets != nil { + object.awsSubnets = make([]*Subnetwork, len(b.awsSubnets)) + for i, v := range b.awsSubnets { + object.awsSubnets[i], err = v.Build() + if err != nil { + return + } + } + } + object.cidrBlock = b.cidrBlock + object.id = b.id + object.name = b.name + object.redHatManaged = b.redHatManaged + if b.subnets != nil { + object.subnets = make([]string, len(b.subnets)) + copy(object.subnets, b.subnets) + } + return +} diff --git a/clustersmgmt/v2alpha1/cloud_vpc_list_builder.go b/clustersmgmt/v2alpha1/cloud_vpc_list_builder.go new file mode 100644 index 00000000..8b421634 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_vpc_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudVPCListBuilder contains the data and logic needed to build +// 'cloud_VPC' objects. +type CloudVPCListBuilder struct { + items []*CloudVPCBuilder +} + +// NewCloudVPCList creates a new builder of 'cloud_VPC' objects. +func NewCloudVPCList() *CloudVPCListBuilder { + return new(CloudVPCListBuilder) +} + +// Items sets the items of the list. +func (b *CloudVPCListBuilder) Items(values ...*CloudVPCBuilder) *CloudVPCListBuilder { + b.items = make([]*CloudVPCBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CloudVPCListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CloudVPCListBuilder) Copy(list *CloudVPCList) *CloudVPCListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CloudVPCBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCloudVPC().Copy(v) + } + } + return b +} + +// Build creates a list of 'cloud_VPC' objects using the +// configuration stored in the builder. +func (b *CloudVPCListBuilder) Build() (list *CloudVPCList, err error) { + items := make([]*CloudVPC, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CloudVPCList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cloud_vpc_list_type_json.go b/clustersmgmt/v2alpha1/cloud_vpc_list_type_json.go new file mode 100644 index 00000000..36b935d5 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_vpc_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudVPCList writes a list of values of the 'cloud_VPC' type to +// the given writer. +func MarshalCloudVPCList(list []*CloudVPC, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudVPCList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudVPCList writes a list of value of the 'cloud_VPC' type to +// the given stream. +func writeCloudVPCList(list []*CloudVPC, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCloudVPC(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCloudVPCList reads a list of values of the 'cloud_VPC' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCloudVPCList(source interface{}) (items []*CloudVPC, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCloudVPCList(iterator) + err = iterator.Error + return +} + +// readCloudVPCList reads list of values of the ”cloud_VPC' type from +// the given iterator. +func readCloudVPCList(iterator *jsoniter.Iterator) []*CloudVPC { + list := []*CloudVPC{} + for iterator.ReadArray() { + item := readCloudVPC(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cloud_vpc_type.go b/clustersmgmt/v2alpha1/cloud_vpc_type.go new file mode 100644 index 00000000..de6c8b39 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_vpc_type.go @@ -0,0 +1,286 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CloudVPC represents the values of the 'cloud_VPC' type. +// +// Description of a cloud provider virtual private cloud. +type CloudVPC struct { + bitmap_ uint32 + awsSecurityGroups []*SecurityGroup + awsSubnets []*Subnetwork + cidrBlock string + id string + name string + subnets []string + redHatManaged bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CloudVPC) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AWSSecurityGroups returns the value of the 'AWS_security_groups' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of AWS security groups with details. +func (o *CloudVPC) AWSSecurityGroups() []*SecurityGroup { + if o != nil && o.bitmap_&1 != 0 { + return o.awsSecurityGroups + } + return nil +} + +// GetAWSSecurityGroups returns the value of the 'AWS_security_groups' attribute and +// a flag indicating if the attribute has a value. +// +// List of AWS security groups with details. +func (o *CloudVPC) GetAWSSecurityGroups() (value []*SecurityGroup, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.awsSecurityGroups + } + return +} + +// AWSSubnets returns the value of the 'AWS_subnets' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of AWS subnetworks with details. +func (o *CloudVPC) AWSSubnets() []*Subnetwork { + if o != nil && o.bitmap_&2 != 0 { + return o.awsSubnets + } + return nil +} + +// GetAWSSubnets returns the value of the 'AWS_subnets' attribute and +// a flag indicating if the attribute has a value. +// +// List of AWS subnetworks with details. +func (o *CloudVPC) GetAWSSubnets() (value []*Subnetwork, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.awsSubnets + } + return +} + +// CIDRBlock returns the value of the 'CIDR_block' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// CIDR block of the virtual private cloud. +func (o *CloudVPC) CIDRBlock() string { + if o != nil && o.bitmap_&4 != 0 { + return o.cidrBlock + } + return "" +} + +// GetCIDRBlock returns the value of the 'CIDR_block' attribute and +// a flag indicating if the attribute has a value. +// +// CIDR block of the virtual private cloud. +func (o *CloudVPC) GetCIDRBlock() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.cidrBlock + } + return +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID of virtual private cloud. +func (o *CloudVPC) ID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID of virtual private cloud. +func (o *CloudVPC) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.id + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of virtual private cloud according to its `Name` tag on AWS. +func (o *CloudVPC) Name() string { + if o != nil && o.bitmap_&16 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of virtual private cloud according to its `Name` tag on AWS. +func (o *CloudVPC) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.name + } + return +} + +// RedHatManaged returns the value of the 'red_hat_managed' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// If the resource is RH managed. +func (o *CloudVPC) RedHatManaged() bool { + if o != nil && o.bitmap_&32 != 0 { + return o.redHatManaged + } + return false +} + +// GetRedHatManaged returns the value of the 'red_hat_managed' attribute and +// a flag indicating if the attribute has a value. +// +// If the resource is RH managed. +func (o *CloudVPC) GetRedHatManaged() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.redHatManaged + } + return +} + +// Subnets returns the value of the 'subnets' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of subnets used by the virtual private cloud. +func (o *CloudVPC) Subnets() []string { + if o != nil && o.bitmap_&64 != 0 { + return o.subnets + } + return nil +} + +// GetSubnets returns the value of the 'subnets' attribute and +// a flag indicating if the attribute has a value. +// +// List of subnets used by the virtual private cloud. +func (o *CloudVPC) GetSubnets() (value []string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.subnets + } + return +} + +// CloudVPCListKind is the name of the type used to represent list of objects of +// type 'cloud_VPC'. +const CloudVPCListKind = "CloudVPCList" + +// CloudVPCListLinkKind is the name of the type used to represent links to list +// of objects of type 'cloud_VPC'. +const CloudVPCListLinkKind = "CloudVPCListLink" + +// CloudVPCNilKind is the name of the type used to nil lists of objects of +// type 'cloud_VPC'. +const CloudVPCListNilKind = "CloudVPCListNil" + +// CloudVPCList is a list of values of the 'cloud_VPC' type. +type CloudVPCList struct { + href string + link bool + items []*CloudVPC +} + +// Len returns the length of the list. +func (l *CloudVPCList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CloudVPCList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CloudVPCList) Get(i int) *CloudVPC { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CloudVPCList) Slice() []*CloudVPC { + var slice []*CloudVPC + if l == nil { + slice = make([]*CloudVPC, 0) + } else { + slice = make([]*CloudVPC, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CloudVPCList) Each(f func(item *CloudVPC) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CloudVPCList) Range(f func(index int, item *CloudVPC) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cloud_vpc_type_json.go b/clustersmgmt/v2alpha1/cloud_vpc_type_json.go new file mode 100644 index 00000000..0ad86e13 --- /dev/null +++ b/clustersmgmt/v2alpha1/cloud_vpc_type_json.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCloudVPC writes a value of the 'cloud_VPC' type to the given writer. +func MarshalCloudVPC(object *CloudVPC, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCloudVPC(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCloudVPC writes a value of the 'cloud_VPC' type to the given stream. +func writeCloudVPC(object *CloudVPC, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.awsSecurityGroups != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws_security_groups") + writeSecurityGroupList(object.awsSecurityGroups, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.awsSubnets != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws_subnets") + writeSubnetworkList(object.awsSubnets, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cidr_block") + stream.WriteString(object.cidrBlock) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("red_hat_managed") + stream.WriteBool(object.redHatManaged) + count++ + } + present_ = object.bitmap_&64 != 0 && object.subnets != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnets") + writeStringList(object.subnets, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalCloudVPC reads a value of the 'cloud_VPC' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCloudVPC(source interface{}) (object *CloudVPC, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCloudVPC(iterator) + err = iterator.Error + return +} + +// readCloudVPC reads a value of the 'cloud_VPC' type from the given iterator. +func readCloudVPC(iterator *jsoniter.Iterator) *CloudVPC { + object := &CloudVPC{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "aws_security_groups": + value := readSecurityGroupList(iterator) + object.awsSecurityGroups = value + object.bitmap_ |= 1 + case "aws_subnets": + value := readSubnetworkList(iterator) + object.awsSubnets = value + object.bitmap_ |= 2 + case "cidr_block": + value := iterator.ReadString() + object.cidrBlock = value + object.bitmap_ |= 4 + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 8 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 16 + case "red_hat_managed": + value := iterator.ReadBool() + object.redHatManaged = value + object.bitmap_ |= 32 + case "subnets": + value := readStringList(iterator) + object.subnets = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_api_builder.go b/clustersmgmt/v2alpha1/cluster_api_builder.go new file mode 100644 index 00000000..6c60ad6e --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_api_builder.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterAPIBuilder contains the data and logic needed to build 'cluster_API' objects. +// +// Information about the API of a cluster. +type ClusterAPIBuilder struct { + bitmap_ uint32 + url string + listening ListeningMethod +} + +// NewClusterAPI creates a new builder of 'cluster_API' objects. +func NewClusterAPI() *ClusterAPIBuilder { + return &ClusterAPIBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterAPIBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// URL sets the value of the 'URL' attribute to the given value. +func (b *ClusterAPIBuilder) URL(value string) *ClusterAPIBuilder { + b.url = value + b.bitmap_ |= 1 + return b +} + +// Listening sets the value of the 'listening' attribute to the given value. +// +// Cluster components listening method. +func (b *ClusterAPIBuilder) Listening(value ListeningMethod) *ClusterAPIBuilder { + b.listening = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterAPIBuilder) Copy(object *ClusterAPI) *ClusterAPIBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.url = object.url + b.listening = object.listening + return b +} + +// Build creates a 'cluster_API' object using the configuration stored in the builder. +func (b *ClusterAPIBuilder) Build() (object *ClusterAPI, err error) { + object = new(ClusterAPI) + object.bitmap_ = b.bitmap_ + object.url = b.url + object.listening = b.listening + return +} diff --git a/clustersmgmt/v2alpha1/cluster_api_list_builder.go b/clustersmgmt/v2alpha1/cluster_api_list_builder.go new file mode 100644 index 00000000..7207340c --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_api_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterAPIListBuilder contains the data and logic needed to build +// 'cluster_API' objects. +type ClusterAPIListBuilder struct { + items []*ClusterAPIBuilder +} + +// NewClusterAPIList creates a new builder of 'cluster_API' objects. +func NewClusterAPIList() *ClusterAPIListBuilder { + return new(ClusterAPIListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterAPIListBuilder) Items(values ...*ClusterAPIBuilder) *ClusterAPIListBuilder { + b.items = make([]*ClusterAPIBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterAPIListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterAPIListBuilder) Copy(list *ClusterAPIList) *ClusterAPIListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterAPIBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterAPI().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_API' objects using the +// configuration stored in the builder. +func (b *ClusterAPIListBuilder) Build() (list *ClusterAPIList, err error) { + items := make([]*ClusterAPI, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterAPIList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_api_list_type_json.go b/clustersmgmt/v2alpha1/cluster_api_list_type_json.go new file mode 100644 index 00000000..7dc1db3a --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_api_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterAPIList writes a list of values of the 'cluster_API' type to +// the given writer. +func MarshalClusterAPIList(list []*ClusterAPI, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterAPIList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterAPIList writes a list of value of the 'cluster_API' type to +// the given stream. +func writeClusterAPIList(list []*ClusterAPI, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterAPI(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterAPIList reads a list of values of the 'cluster_API' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterAPIList(source interface{}) (items []*ClusterAPI, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterAPIList(iterator) + err = iterator.Error + return +} + +// readClusterAPIList reads list of values of the ”cluster_API' type from +// the given iterator. +func readClusterAPIList(iterator *jsoniter.Iterator) []*ClusterAPI { + list := []*ClusterAPI{} + for iterator.ReadArray() { + item := readClusterAPI(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_api_type.go b/clustersmgmt/v2alpha1/cluster_api_type.go new file mode 100644 index 00000000..a4ab473d --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_api_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterAPI represents the values of the 'cluster_API' type. +// +// Information about the API of a cluster. +type ClusterAPI struct { + bitmap_ uint32 + url string + listening ListeningMethod +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterAPI) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// URL returns the value of the 'URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The URL of the API server of the cluster. +func (o *ClusterAPI) URL() string { + if o != nil && o.bitmap_&1 != 0 { + return o.url + } + return "" +} + +// GetURL returns the value of the 'URL' attribute and +// a flag indicating if the attribute has a value. +// +// The URL of the API server of the cluster. +func (o *ClusterAPI) GetURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.url + } + return +} + +// Listening returns the value of the 'listening' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The listening method of the API server. +func (o *ClusterAPI) Listening() ListeningMethod { + if o != nil && o.bitmap_&2 != 0 { + return o.listening + } + return ListeningMethod("") +} + +// GetListening returns the value of the 'listening' attribute and +// a flag indicating if the attribute has a value. +// +// The listening method of the API server. +func (o *ClusterAPI) GetListening() (value ListeningMethod, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.listening + } + return +} + +// ClusterAPIListKind is the name of the type used to represent list of objects of +// type 'cluster_API'. +const ClusterAPIListKind = "ClusterAPIList" + +// ClusterAPIListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_API'. +const ClusterAPIListLinkKind = "ClusterAPIListLink" + +// ClusterAPINilKind is the name of the type used to nil lists of objects of +// type 'cluster_API'. +const ClusterAPIListNilKind = "ClusterAPIListNil" + +// ClusterAPIList is a list of values of the 'cluster_API' type. +type ClusterAPIList struct { + href string + link bool + items []*ClusterAPI +} + +// Len returns the length of the list. +func (l *ClusterAPIList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterAPIList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterAPIList) Get(i int) *ClusterAPI { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterAPIList) Slice() []*ClusterAPI { + var slice []*ClusterAPI + if l == nil { + slice = make([]*ClusterAPI, 0) + } else { + slice = make([]*ClusterAPI, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterAPIList) Each(f func(item *ClusterAPI) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterAPIList) Range(f func(index int, item *ClusterAPI) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_api_type_json.go b/clustersmgmt/v2alpha1/cluster_api_type_json.go new file mode 100644 index 00000000..201e7e34 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_api_type_json.go @@ -0,0 +1,100 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterAPI writes a value of the 'cluster_API' type to the given writer. +func MarshalClusterAPI(object *ClusterAPI, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterAPI(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterAPI writes a value of the 'cluster_API' type to the given stream. +func writeClusterAPI(object *ClusterAPI, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("url") + stream.WriteString(object.url) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("listening") + stream.WriteString(string(object.listening)) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterAPI reads a value of the 'cluster_API' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterAPI(source interface{}) (object *ClusterAPI, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterAPI(iterator) + err = iterator.Error + return +} + +// readClusterAPI reads a value of the 'cluster_API' type from the given iterator. +func readClusterAPI(iterator *jsoniter.Iterator) *ClusterAPI { + object := &ClusterAPI{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "url": + value := iterator.ReadString() + object.url = value + object.bitmap_ |= 1 + case "listening": + text := iterator.ReadString() + value := ListeningMethod(text) + object.listening = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_autoscaler_builder.go b/clustersmgmt/v2alpha1/cluster_autoscaler_builder.go new file mode 100644 index 00000000..486e8531 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_autoscaler_builder.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterAutoscalerBuilder contains the data and logic needed to build 'cluster_autoscaler' objects. +// +// Cluster-wide autoscaling configuration. +type ClusterAutoscalerBuilder struct { + bitmap_ uint32 + id string + href string + balancingIgnoredLabels []string + logVerbosity int + maxNodeProvisionTime string + maxPodGracePeriod int + podPriorityThreshold int + resourceLimits *AutoscalerResourceLimitsBuilder + scaleDown *AutoscalerScaleDownConfigBuilder + balanceSimilarNodeGroups bool + ignoreDaemonsetsUtilization bool + skipNodesWithLocalStorage bool +} + +// NewClusterAutoscaler creates a new builder of 'cluster_autoscaler' objects. +func NewClusterAutoscaler() *ClusterAutoscalerBuilder { + return &ClusterAutoscalerBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ClusterAutoscalerBuilder) Link(value bool) *ClusterAutoscalerBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ClusterAutoscalerBuilder) ID(value string) *ClusterAutoscalerBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ClusterAutoscalerBuilder) HREF(value string) *ClusterAutoscalerBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterAutoscalerBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// BalanceSimilarNodeGroups sets the value of the 'balance_similar_node_groups' attribute to the given value. +func (b *ClusterAutoscalerBuilder) BalanceSimilarNodeGroups(value bool) *ClusterAutoscalerBuilder { + b.balanceSimilarNodeGroups = value + b.bitmap_ |= 8 + return b +} + +// BalancingIgnoredLabels sets the value of the 'balancing_ignored_labels' attribute to the given values. +func (b *ClusterAutoscalerBuilder) BalancingIgnoredLabels(values ...string) *ClusterAutoscalerBuilder { + b.balancingIgnoredLabels = make([]string, len(values)) + copy(b.balancingIgnoredLabels, values) + b.bitmap_ |= 16 + return b +} + +// IgnoreDaemonsetsUtilization sets the value of the 'ignore_daemonsets_utilization' attribute to the given value. +func (b *ClusterAutoscalerBuilder) IgnoreDaemonsetsUtilization(value bool) *ClusterAutoscalerBuilder { + b.ignoreDaemonsetsUtilization = value + b.bitmap_ |= 32 + return b +} + +// LogVerbosity sets the value of the 'log_verbosity' attribute to the given value. +func (b *ClusterAutoscalerBuilder) LogVerbosity(value int) *ClusterAutoscalerBuilder { + b.logVerbosity = value + b.bitmap_ |= 64 + return b +} + +// MaxNodeProvisionTime sets the value of the 'max_node_provision_time' attribute to the given value. +func (b *ClusterAutoscalerBuilder) MaxNodeProvisionTime(value string) *ClusterAutoscalerBuilder { + b.maxNodeProvisionTime = value + b.bitmap_ |= 128 + return b +} + +// MaxPodGracePeriod sets the value of the 'max_pod_grace_period' attribute to the given value. +func (b *ClusterAutoscalerBuilder) MaxPodGracePeriod(value int) *ClusterAutoscalerBuilder { + b.maxPodGracePeriod = value + b.bitmap_ |= 256 + return b +} + +// PodPriorityThreshold sets the value of the 'pod_priority_threshold' attribute to the given value. +func (b *ClusterAutoscalerBuilder) PodPriorityThreshold(value int) *ClusterAutoscalerBuilder { + b.podPriorityThreshold = value + b.bitmap_ |= 512 + return b +} + +// ResourceLimits sets the value of the 'resource_limits' attribute to the given value. +func (b *ClusterAutoscalerBuilder) ResourceLimits(value *AutoscalerResourceLimitsBuilder) *ClusterAutoscalerBuilder { + b.resourceLimits = value + if value != nil { + b.bitmap_ |= 1024 + } else { + b.bitmap_ &^= 1024 + } + return b +} + +// ScaleDown sets the value of the 'scale_down' attribute to the given value. +func (b *ClusterAutoscalerBuilder) ScaleDown(value *AutoscalerScaleDownConfigBuilder) *ClusterAutoscalerBuilder { + b.scaleDown = value + if value != nil { + b.bitmap_ |= 2048 + } else { + b.bitmap_ &^= 2048 + } + return b +} + +// SkipNodesWithLocalStorage sets the value of the 'skip_nodes_with_local_storage' attribute to the given value. +func (b *ClusterAutoscalerBuilder) SkipNodesWithLocalStorage(value bool) *ClusterAutoscalerBuilder { + b.skipNodesWithLocalStorage = value + b.bitmap_ |= 4096 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterAutoscalerBuilder) Copy(object *ClusterAutoscaler) *ClusterAutoscalerBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.balanceSimilarNodeGroups = object.balanceSimilarNodeGroups + if object.balancingIgnoredLabels != nil { + b.balancingIgnoredLabels = make([]string, len(object.balancingIgnoredLabels)) + copy(b.balancingIgnoredLabels, object.balancingIgnoredLabels) + } else { + b.balancingIgnoredLabels = nil + } + b.ignoreDaemonsetsUtilization = object.ignoreDaemonsetsUtilization + b.logVerbosity = object.logVerbosity + b.maxNodeProvisionTime = object.maxNodeProvisionTime + b.maxPodGracePeriod = object.maxPodGracePeriod + b.podPriorityThreshold = object.podPriorityThreshold + if object.resourceLimits != nil { + b.resourceLimits = NewAutoscalerResourceLimits().Copy(object.resourceLimits) + } else { + b.resourceLimits = nil + } + if object.scaleDown != nil { + b.scaleDown = NewAutoscalerScaleDownConfig().Copy(object.scaleDown) + } else { + b.scaleDown = nil + } + b.skipNodesWithLocalStorage = object.skipNodesWithLocalStorage + return b +} + +// Build creates a 'cluster_autoscaler' object using the configuration stored in the builder. +func (b *ClusterAutoscalerBuilder) Build() (object *ClusterAutoscaler, err error) { + object = new(ClusterAutoscaler) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.balanceSimilarNodeGroups = b.balanceSimilarNodeGroups + if b.balancingIgnoredLabels != nil { + object.balancingIgnoredLabels = make([]string, len(b.balancingIgnoredLabels)) + copy(object.balancingIgnoredLabels, b.balancingIgnoredLabels) + } + object.ignoreDaemonsetsUtilization = b.ignoreDaemonsetsUtilization + object.logVerbosity = b.logVerbosity + object.maxNodeProvisionTime = b.maxNodeProvisionTime + object.maxPodGracePeriod = b.maxPodGracePeriod + object.podPriorityThreshold = b.podPriorityThreshold + if b.resourceLimits != nil { + object.resourceLimits, err = b.resourceLimits.Build() + if err != nil { + return + } + } + if b.scaleDown != nil { + object.scaleDown, err = b.scaleDown.Build() + if err != nil { + return + } + } + object.skipNodesWithLocalStorage = b.skipNodesWithLocalStorage + return +} diff --git a/clustersmgmt/v2alpha1/cluster_autoscaler_list_builder.go b/clustersmgmt/v2alpha1/cluster_autoscaler_list_builder.go new file mode 100644 index 00000000..90ec308b --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_autoscaler_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterAutoscalerListBuilder contains the data and logic needed to build +// 'cluster_autoscaler' objects. +type ClusterAutoscalerListBuilder struct { + items []*ClusterAutoscalerBuilder +} + +// NewClusterAutoscalerList creates a new builder of 'cluster_autoscaler' objects. +func NewClusterAutoscalerList() *ClusterAutoscalerListBuilder { + return new(ClusterAutoscalerListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterAutoscalerListBuilder) Items(values ...*ClusterAutoscalerBuilder) *ClusterAutoscalerListBuilder { + b.items = make([]*ClusterAutoscalerBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterAutoscalerListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterAutoscalerListBuilder) Copy(list *ClusterAutoscalerList) *ClusterAutoscalerListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterAutoscalerBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterAutoscaler().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_autoscaler' objects using the +// configuration stored in the builder. +func (b *ClusterAutoscalerListBuilder) Build() (list *ClusterAutoscalerList, err error) { + items := make([]*ClusterAutoscaler, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterAutoscalerList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_autoscaler_list_type_json.go b/clustersmgmt/v2alpha1/cluster_autoscaler_list_type_json.go new file mode 100644 index 00000000..8c401b83 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_autoscaler_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterAutoscalerList writes a list of values of the 'cluster_autoscaler' type to +// the given writer. +func MarshalClusterAutoscalerList(list []*ClusterAutoscaler, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterAutoscalerList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterAutoscalerList writes a list of value of the 'cluster_autoscaler' type to +// the given stream. +func writeClusterAutoscalerList(list []*ClusterAutoscaler, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterAutoscaler(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterAutoscalerList reads a list of values of the 'cluster_autoscaler' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterAutoscalerList(source interface{}) (items []*ClusterAutoscaler, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterAutoscalerList(iterator) + err = iterator.Error + return +} + +// readClusterAutoscalerList reads list of values of the ”cluster_autoscaler' type from +// the given iterator. +func readClusterAutoscalerList(iterator *jsoniter.Iterator) []*ClusterAutoscaler { + list := []*ClusterAutoscaler{} + for iterator.ReadArray() { + item := readClusterAutoscaler(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_autoscaler_type.go b/clustersmgmt/v2alpha1/cluster_autoscaler_type.go new file mode 100644 index 00000000..63ce17b3 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_autoscaler_type.go @@ -0,0 +1,476 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterAutoscalerKind is the name of the type used to represent objects +// of type 'cluster_autoscaler'. +const ClusterAutoscalerKind = "ClusterAutoscaler" + +// ClusterAutoscalerLinkKind is the name of the type used to represent links +// to objects of type 'cluster_autoscaler'. +const ClusterAutoscalerLinkKind = "ClusterAutoscalerLink" + +// ClusterAutoscalerNilKind is the name of the type used to nil references +// to objects of type 'cluster_autoscaler'. +const ClusterAutoscalerNilKind = "ClusterAutoscalerNil" + +// ClusterAutoscaler represents the values of the 'cluster_autoscaler' type. +// +// Cluster-wide autoscaling configuration. +type ClusterAutoscaler struct { + bitmap_ uint32 + id string + href string + balancingIgnoredLabels []string + logVerbosity int + maxNodeProvisionTime string + maxPodGracePeriod int + podPriorityThreshold int + resourceLimits *AutoscalerResourceLimits + scaleDown *AutoscalerScaleDownConfig + balanceSimilarNodeGroups bool + ignoreDaemonsetsUtilization bool + skipNodesWithLocalStorage bool +} + +// Kind returns the name of the type of the object. +func (o *ClusterAutoscaler) Kind() string { + if o == nil { + return ClusterAutoscalerNilKind + } + if o.bitmap_&1 != 0 { + return ClusterAutoscalerLinkKind + } + return ClusterAutoscalerKind +} + +// Link returns true iif this is a link. +func (o *ClusterAutoscaler) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ClusterAutoscaler) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ClusterAutoscaler) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ClusterAutoscaler) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ClusterAutoscaler) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterAutoscaler) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// BalanceSimilarNodeGroups returns the value of the 'balance_similar_node_groups' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// BalanceSimilarNodeGroups enables/disables the +// `--balance-similar-node-groups` cluster-autoscaler feature. +// This feature will automatically identify node groups with +// the same instance type and the same set of labels and try +// to keep the respective sizes of those node groups balanced. +func (o *ClusterAutoscaler) BalanceSimilarNodeGroups() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.balanceSimilarNodeGroups + } + return false +} + +// GetBalanceSimilarNodeGroups returns the value of the 'balance_similar_node_groups' attribute and +// a flag indicating if the attribute has a value. +// +// BalanceSimilarNodeGroups enables/disables the +// `--balance-similar-node-groups` cluster-autoscaler feature. +// This feature will automatically identify node groups with +// the same instance type and the same set of labels and try +// to keep the respective sizes of those node groups balanced. +func (o *ClusterAutoscaler) GetBalanceSimilarNodeGroups() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.balanceSimilarNodeGroups + } + return +} + +// BalancingIgnoredLabels returns the value of the 'balancing_ignored_labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// This option specifies labels that cluster autoscaler should ignore when considering node group similarity. +// For example, if you have nodes with "topology.ebs.csi.aws.com/zone" label, you can add name of this label here +// to prevent cluster autoscaler from splitting nodes into different node groups based on its value. +func (o *ClusterAutoscaler) BalancingIgnoredLabels() []string { + if o != nil && o.bitmap_&16 != 0 { + return o.balancingIgnoredLabels + } + return nil +} + +// GetBalancingIgnoredLabels returns the value of the 'balancing_ignored_labels' attribute and +// a flag indicating if the attribute has a value. +// +// This option specifies labels that cluster autoscaler should ignore when considering node group similarity. +// For example, if you have nodes with "topology.ebs.csi.aws.com/zone" label, you can add name of this label here +// to prevent cluster autoscaler from splitting nodes into different node groups based on its value. +func (o *ClusterAutoscaler) GetBalancingIgnoredLabels() (value []string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.balancingIgnoredLabels + } + return +} + +// IgnoreDaemonsetsUtilization returns the value of the 'ignore_daemonsets_utilization' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Should CA ignore DaemonSet pods when calculating resource utilization for scaling down. false by default. +func (o *ClusterAutoscaler) IgnoreDaemonsetsUtilization() bool { + if o != nil && o.bitmap_&32 != 0 { + return o.ignoreDaemonsetsUtilization + } + return false +} + +// GetIgnoreDaemonsetsUtilization returns the value of the 'ignore_daemonsets_utilization' attribute and +// a flag indicating if the attribute has a value. +// +// Should CA ignore DaemonSet pods when calculating resource utilization for scaling down. false by default. +func (o *ClusterAutoscaler) GetIgnoreDaemonsetsUtilization() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.ignoreDaemonsetsUtilization + } + return +} + +// LogVerbosity returns the value of the 'log_verbosity' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Sets the autoscaler log level. +// Default value is 1, level 4 is recommended for DEBUGGING and level 6 will enable almost everything. +func (o *ClusterAutoscaler) LogVerbosity() int { + if o != nil && o.bitmap_&64 != 0 { + return o.logVerbosity + } + return 0 +} + +// GetLogVerbosity returns the value of the 'log_verbosity' attribute and +// a flag indicating if the attribute has a value. +// +// Sets the autoscaler log level. +// Default value is 1, level 4 is recommended for DEBUGGING and level 6 will enable almost everything. +func (o *ClusterAutoscaler) GetLogVerbosity() (value int, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.logVerbosity + } + return +} + +// MaxNodeProvisionTime returns the value of the 'max_node_provision_time' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Maximum time CA waits for node to be provisioned. +func (o *ClusterAutoscaler) MaxNodeProvisionTime() string { + if o != nil && o.bitmap_&128 != 0 { + return o.maxNodeProvisionTime + } + return "" +} + +// GetMaxNodeProvisionTime returns the value of the 'max_node_provision_time' attribute and +// a flag indicating if the attribute has a value. +// +// Maximum time CA waits for node to be provisioned. +func (o *ClusterAutoscaler) GetMaxNodeProvisionTime() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.maxNodeProvisionTime + } + return +} + +// MaxPodGracePeriod returns the value of the 'max_pod_grace_period' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Gives pods graceful termination time before scaling down. +func (o *ClusterAutoscaler) MaxPodGracePeriod() int { + if o != nil && o.bitmap_&256 != 0 { + return o.maxPodGracePeriod + } + return 0 +} + +// GetMaxPodGracePeriod returns the value of the 'max_pod_grace_period' attribute and +// a flag indicating if the attribute has a value. +// +// Gives pods graceful termination time before scaling down. +func (o *ClusterAutoscaler) GetMaxPodGracePeriod() (value int, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.maxPodGracePeriod + } + return +} + +// PodPriorityThreshold returns the value of the 'pod_priority_threshold' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// To allow users to schedule "best-effort" pods, which shouldn't trigger +// Cluster Autoscaler actions, but only run when there are spare resources available, +// More info: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-cluster-autoscaler-work-with-pod-priority-and-preemption. +func (o *ClusterAutoscaler) PodPriorityThreshold() int { + if o != nil && o.bitmap_&512 != 0 { + return o.podPriorityThreshold + } + return 0 +} + +// GetPodPriorityThreshold returns the value of the 'pod_priority_threshold' attribute and +// a flag indicating if the attribute has a value. +// +// To allow users to schedule "best-effort" pods, which shouldn't trigger +// Cluster Autoscaler actions, but only run when there are spare resources available, +// More info: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-cluster-autoscaler-work-with-pod-priority-and-preemption. +func (o *ClusterAutoscaler) GetPodPriorityThreshold() (value int, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.podPriorityThreshold + } + return +} + +// ResourceLimits returns the value of the 'resource_limits' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Constraints of autoscaling resources. +func (o *ClusterAutoscaler) ResourceLimits() *AutoscalerResourceLimits { + if o != nil && o.bitmap_&1024 != 0 { + return o.resourceLimits + } + return nil +} + +// GetResourceLimits returns the value of the 'resource_limits' attribute and +// a flag indicating if the attribute has a value. +// +// Constraints of autoscaling resources. +func (o *ClusterAutoscaler) GetResourceLimits() (value *AutoscalerResourceLimits, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.resourceLimits + } + return +} + +// ScaleDown returns the value of the 'scale_down' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Configuration of scale down operation. +func (o *ClusterAutoscaler) ScaleDown() *AutoscalerScaleDownConfig { + if o != nil && o.bitmap_&2048 != 0 { + return o.scaleDown + } + return nil +} + +// GetScaleDown returns the value of the 'scale_down' attribute and +// a flag indicating if the attribute has a value. +// +// Configuration of scale down operation. +func (o *ClusterAutoscaler) GetScaleDown() (value *AutoscalerScaleDownConfig, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.scaleDown + } + return +} + +// SkipNodesWithLocalStorage returns the value of the 'skip_nodes_with_local_storage' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Enables/Disables `--skip-nodes-with-local-storage` CA feature flag. If true cluster autoscaler will never delete nodes with pods with local storage, e.g. EmptyDir or HostPath. true by default at autoscaler. +func (o *ClusterAutoscaler) SkipNodesWithLocalStorage() bool { + if o != nil && o.bitmap_&4096 != 0 { + return o.skipNodesWithLocalStorage + } + return false +} + +// GetSkipNodesWithLocalStorage returns the value of the 'skip_nodes_with_local_storage' attribute and +// a flag indicating if the attribute has a value. +// +// Enables/Disables `--skip-nodes-with-local-storage` CA feature flag. If true cluster autoscaler will never delete nodes with pods with local storage, e.g. EmptyDir or HostPath. true by default at autoscaler. +func (o *ClusterAutoscaler) GetSkipNodesWithLocalStorage() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.skipNodesWithLocalStorage + } + return +} + +// ClusterAutoscalerListKind is the name of the type used to represent list of objects of +// type 'cluster_autoscaler'. +const ClusterAutoscalerListKind = "ClusterAutoscalerList" + +// ClusterAutoscalerListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_autoscaler'. +const ClusterAutoscalerListLinkKind = "ClusterAutoscalerListLink" + +// ClusterAutoscalerNilKind is the name of the type used to nil lists of objects of +// type 'cluster_autoscaler'. +const ClusterAutoscalerListNilKind = "ClusterAutoscalerListNil" + +// ClusterAutoscalerList is a list of values of the 'cluster_autoscaler' type. +type ClusterAutoscalerList struct { + href string + link bool + items []*ClusterAutoscaler +} + +// Kind returns the name of the type of the object. +func (l *ClusterAutoscalerList) Kind() string { + if l == nil { + return ClusterAutoscalerListNilKind + } + if l.link { + return ClusterAutoscalerListLinkKind + } + return ClusterAutoscalerListKind +} + +// Link returns true iif this is a link. +func (l *ClusterAutoscalerList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ClusterAutoscalerList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ClusterAutoscalerList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ClusterAutoscalerList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterAutoscalerList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterAutoscalerList) Get(i int) *ClusterAutoscaler { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterAutoscalerList) Slice() []*ClusterAutoscaler { + var slice []*ClusterAutoscaler + if l == nil { + slice = make([]*ClusterAutoscaler, 0) + } else { + slice = make([]*ClusterAutoscaler, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterAutoscalerList) Each(f func(item *ClusterAutoscaler) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterAutoscalerList) Range(f func(index int, item *ClusterAutoscaler) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_autoscaler_type_json.go b/clustersmgmt/v2alpha1/cluster_autoscaler_type_json.go new file mode 100644 index 00000000..c1ae08fc --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_autoscaler_type_json.go @@ -0,0 +1,237 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterAutoscaler writes a value of the 'cluster_autoscaler' type to the given writer. +func MarshalClusterAutoscaler(object *ClusterAutoscaler, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterAutoscaler(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterAutoscaler writes a value of the 'cluster_autoscaler' type to the given stream. +func writeClusterAutoscaler(object *ClusterAutoscaler, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ClusterAutoscalerLinkKind) + } else { + stream.WriteString(ClusterAutoscalerKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("balance_similar_node_groups") + stream.WriteBool(object.balanceSimilarNodeGroups) + count++ + } + present_ = object.bitmap_&16 != 0 && object.balancingIgnoredLabels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("balancing_ignored_labels") + writeStringList(object.balancingIgnoredLabels, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ignore_daemonsets_utilization") + stream.WriteBool(object.ignoreDaemonsetsUtilization) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("log_verbosity") + stream.WriteInt(object.logVerbosity) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_node_provision_time") + stream.WriteString(object.maxNodeProvisionTime) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_pod_grace_period") + stream.WriteInt(object.maxPodGracePeriod) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("pod_priority_threshold") + stream.WriteInt(object.podPriorityThreshold) + count++ + } + present_ = object.bitmap_&1024 != 0 && object.resourceLimits != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resource_limits") + writeAutoscalerResourceLimits(object.resourceLimits, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.scaleDown != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("scale_down") + writeAutoscalerScaleDownConfig(object.scaleDown, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("skip_nodes_with_local_storage") + stream.WriteBool(object.skipNodesWithLocalStorage) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterAutoscaler reads a value of the 'cluster_autoscaler' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterAutoscaler(source interface{}) (object *ClusterAutoscaler, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterAutoscaler(iterator) + err = iterator.Error + return +} + +// readClusterAutoscaler reads a value of the 'cluster_autoscaler' type from the given iterator. +func readClusterAutoscaler(iterator *jsoniter.Iterator) *ClusterAutoscaler { + object := &ClusterAutoscaler{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ClusterAutoscalerLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "balance_similar_node_groups": + value := iterator.ReadBool() + object.balanceSimilarNodeGroups = value + object.bitmap_ |= 8 + case "balancing_ignored_labels": + value := readStringList(iterator) + object.balancingIgnoredLabels = value + object.bitmap_ |= 16 + case "ignore_daemonsets_utilization": + value := iterator.ReadBool() + object.ignoreDaemonsetsUtilization = value + object.bitmap_ |= 32 + case "log_verbosity": + value := iterator.ReadInt() + object.logVerbosity = value + object.bitmap_ |= 64 + case "max_node_provision_time": + value := iterator.ReadString() + object.maxNodeProvisionTime = value + object.bitmap_ |= 128 + case "max_pod_grace_period": + value := iterator.ReadInt() + object.maxPodGracePeriod = value + object.bitmap_ |= 256 + case "pod_priority_threshold": + value := iterator.ReadInt() + object.podPriorityThreshold = value + object.bitmap_ |= 512 + case "resource_limits": + value := readAutoscalerResourceLimits(iterator) + object.resourceLimits = value + object.bitmap_ |= 1024 + case "scale_down": + value := readAutoscalerScaleDownConfig(iterator) + object.scaleDown = value + object.bitmap_ |= 2048 + case "skip_nodes_with_local_storage": + value := iterator.ReadBool() + object.skipNodesWithLocalStorage = value + object.bitmap_ |= 4096 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_builder.go b/clustersmgmt/v2alpha1/cluster_builder.go new file mode 100644 index 00000000..779f32f9 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_builder.go @@ -0,0 +1,1294 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ClusterBuilder contains the data and logic needed to build 'cluster' objects. +// +// Definition of an _OpenShift_ cluster. +// +// The `cloud_provider` attribute is a reference to the cloud provider. When a +// cluster is retrieved it will be a link to the cloud provider, containing only +// the kind, id and href attributes: +// +// ```json +// +// { +// "cloud_provider": { +// "kind": "CloudProviderLink", +// "id": "123", +// "href": "/api/clusters_mgmt/v1/cloud_providers/123" +// } +// } +// +// ``` +// +// When a cluster is created this is optional, and if used it should contain the +// identifier of the cloud provider to use: +// +// ```json +// +// { +// "cloud_provider": { +// "id": "123", +// } +// } +// +// ``` +// +// If not included, then the cluster will be created using the default cloud +// provider, which is currently Amazon Web Services. +// +// The region attribute is mandatory when a cluster is created. +// +// The `aws.access_key_id`, `aws.secret_access_key` and `dns.base_domain` +// attributes are mandatory when creation a cluster with your own Amazon Web +// Services account. +type ClusterBuilder struct { + bitmap_ uint64 + id string + href string + api *ClusterAPIBuilder + aws *AWSBuilder + awsInfrastructureAccessRoleGrants *AWSInfrastructureAccessRoleGrantListBuilder + ccs *CCSBuilder + dns *DNSBuilder + gcp *GCPBuilder + gcpEncryptionKey *GCPEncryptionKeyBuilder + gcpNetwork *GCPNetworkBuilder + additionalTrustBundle string + addons *AddOnInstallationListBuilder + autoscaler *ClusterAutoscalerBuilder + azure *AzureBuilder + billingModel BillingModel + byoOidc *ByoOidcBuilder + cloudProvider *CloudProviderBuilder + console *ClusterConsoleBuilder + creationTimestamp time.Time + deleteProtection *DeleteProtectionBuilder + domainPrefix string + expirationTimestamp time.Time + externalID string + externalAuthConfig *ExternalAuthConfigBuilder + externalConfiguration *ExternalConfigurationBuilder + flavour *FlavourBuilder + groups *GroupListBuilder + healthState ClusterHealthState + htpasswd *HTPasswdIdentityProviderBuilder + hypershift *HypershiftBuilder + identityProviders *IdentityProviderListBuilder + inflightChecks *InflightCheckListBuilder + infraID string + ingresses *IngressListBuilder + kubeletConfig *KubeletConfigBuilder + loadBalancerQuota int + machinePools *MachinePoolListBuilder + managedService *ManagedServiceBuilder + name string + network *NetworkBuilder + nodeDrainGracePeriod *ValueBuilder + nodePools *NodePoolListBuilder + nodes *ClusterNodesBuilder + openshiftVersion string + product *ProductBuilder + properties map[string]string + provisionShard *ProvisionShardBuilder + proxy *ProxyBuilder + region *CloudRegionBuilder + state ClusterState + status *ClusterStatusBuilder + storageQuota *ValueBuilder + subscription *SubscriptionBuilder + version *VersionBuilder + fips bool + disableUserWorkloadMonitoring bool + etcdEncryption bool + managed bool + multiAZ bool + multiArchEnabled bool +} + +// NewCluster creates a new builder of 'cluster' objects. +func NewCluster() *ClusterBuilder { + return &ClusterBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ClusterBuilder) Link(value bool) *ClusterBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ClusterBuilder) ID(value string) *ClusterBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ClusterBuilder) HREF(value string) *ClusterBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// API sets the value of the 'API' attribute to the given value. +// +// Information about the API of a cluster. +func (b *ClusterBuilder) API(value *ClusterAPIBuilder) *ClusterBuilder { + b.api = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// AWS sets the value of the 'AWS' attribute to the given value. +// +// _Amazon Web Services_ specific settings of a cluster. +func (b *ClusterBuilder) AWS(value *AWSBuilder) *ClusterBuilder { + b.aws = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// AWSInfrastructureAccessRoleGrants sets the value of the 'AWS_infrastructure_access_role_grants' attribute to the given values. +func (b *ClusterBuilder) AWSInfrastructureAccessRoleGrants(value *AWSInfrastructureAccessRoleGrantListBuilder) *ClusterBuilder { + b.awsInfrastructureAccessRoleGrants = value + b.bitmap_ |= 32 + return b +} + +// CCS sets the value of the 'CCS' attribute to the given value. +func (b *ClusterBuilder) CCS(value *CCSBuilder) *ClusterBuilder { + b.ccs = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// DNS sets the value of the 'DNS' attribute to the given value. +// +// DNS settings of the cluster. +func (b *ClusterBuilder) DNS(value *DNSBuilder) *ClusterBuilder { + b.dns = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// FIPS sets the value of the 'FIPS' attribute to the given value. +func (b *ClusterBuilder) FIPS(value bool) *ClusterBuilder { + b.fips = value + b.bitmap_ |= 256 + return b +} + +// GCP sets the value of the 'GCP' attribute to the given value. +// +// Google cloud platform settings of a cluster. +func (b *ClusterBuilder) GCP(value *GCPBuilder) *ClusterBuilder { + b.gcp = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// GCPEncryptionKey sets the value of the 'GCP_encryption_key' attribute to the given value. +// +// GCP Encryption Key for CCS clusters. +func (b *ClusterBuilder) GCPEncryptionKey(value *GCPEncryptionKeyBuilder) *ClusterBuilder { + b.gcpEncryptionKey = value + if value != nil { + b.bitmap_ |= 1024 + } else { + b.bitmap_ &^= 1024 + } + return b +} + +// GCPNetwork sets the value of the 'GCP_network' attribute to the given value. +// +// GCP Network configuration of a cluster. +func (b *ClusterBuilder) GCPNetwork(value *GCPNetworkBuilder) *ClusterBuilder { + b.gcpNetwork = value + if value != nil { + b.bitmap_ |= 2048 + } else { + b.bitmap_ &^= 2048 + } + return b +} + +// AdditionalTrustBundle sets the value of the 'additional_trust_bundle' attribute to the given value. +func (b *ClusterBuilder) AdditionalTrustBundle(value string) *ClusterBuilder { + b.additionalTrustBundle = value + b.bitmap_ |= 4096 + return b +} + +// Addons sets the value of the 'addons' attribute to the given values. +func (b *ClusterBuilder) Addons(value *AddOnInstallationListBuilder) *ClusterBuilder { + b.addons = value + b.bitmap_ |= 8192 + return b +} + +// Autoscaler sets the value of the 'autoscaler' attribute to the given value. +// +// Cluster-wide autoscaling configuration. +func (b *ClusterBuilder) Autoscaler(value *ClusterAutoscalerBuilder) *ClusterBuilder { + b.autoscaler = value + if value != nil { + b.bitmap_ |= 16384 + } else { + b.bitmap_ &^= 16384 + } + return b +} + +// Azure sets the value of the 'azure' attribute to the given value. +// +// Microsoft Azure settings of a cluster. +func (b *ClusterBuilder) Azure(value *AzureBuilder) *ClusterBuilder { + b.azure = value + if value != nil { + b.bitmap_ |= 32768 + } else { + b.bitmap_ &^= 32768 + } + return b +} + +// BillingModel sets the value of the 'billing_model' attribute to the given value. +// +// Billing model for cluster resources. +func (b *ClusterBuilder) BillingModel(value BillingModel) *ClusterBuilder { + b.billingModel = value + b.bitmap_ |= 65536 + return b +} + +// ByoOidc sets the value of the 'byo_oidc' attribute to the given value. +// +// ByoOidc configuration. +func (b *ClusterBuilder) ByoOidc(value *ByoOidcBuilder) *ClusterBuilder { + b.byoOidc = value + if value != nil { + b.bitmap_ |= 131072 + } else { + b.bitmap_ &^= 131072 + } + return b +} + +// CloudProvider sets the value of the 'cloud_provider' attribute to the given value. +// +// Cloud provider. +func (b *ClusterBuilder) CloudProvider(value *CloudProviderBuilder) *ClusterBuilder { + b.cloudProvider = value + if value != nil { + b.bitmap_ |= 262144 + } else { + b.bitmap_ &^= 262144 + } + return b +} + +// Console sets the value of the 'console' attribute to the given value. +// +// Information about the console of a cluster. +func (b *ClusterBuilder) Console(value *ClusterConsoleBuilder) *ClusterBuilder { + b.console = value + if value != nil { + b.bitmap_ |= 524288 + } else { + b.bitmap_ &^= 524288 + } + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *ClusterBuilder) CreationTimestamp(value time.Time) *ClusterBuilder { + b.creationTimestamp = value + b.bitmap_ |= 1048576 + return b +} + +// DeleteProtection sets the value of the 'delete_protection' attribute to the given value. +// +// DeleteProtection configuration. +func (b *ClusterBuilder) DeleteProtection(value *DeleteProtectionBuilder) *ClusterBuilder { + b.deleteProtection = value + if value != nil { + b.bitmap_ |= 2097152 + } else { + b.bitmap_ &^= 2097152 + } + return b +} + +// DisableUserWorkloadMonitoring sets the value of the 'disable_user_workload_monitoring' attribute to the given value. +func (b *ClusterBuilder) DisableUserWorkloadMonitoring(value bool) *ClusterBuilder { + b.disableUserWorkloadMonitoring = value + b.bitmap_ |= 4194304 + return b +} + +// DomainPrefix sets the value of the 'domain_prefix' attribute to the given value. +func (b *ClusterBuilder) DomainPrefix(value string) *ClusterBuilder { + b.domainPrefix = value + b.bitmap_ |= 8388608 + return b +} + +// EtcdEncryption sets the value of the 'etcd_encryption' attribute to the given value. +func (b *ClusterBuilder) EtcdEncryption(value bool) *ClusterBuilder { + b.etcdEncryption = value + b.bitmap_ |= 16777216 + return b +} + +// ExpirationTimestamp sets the value of the 'expiration_timestamp' attribute to the given value. +func (b *ClusterBuilder) ExpirationTimestamp(value time.Time) *ClusterBuilder { + b.expirationTimestamp = value + b.bitmap_ |= 33554432 + return b +} + +// ExternalID sets the value of the 'external_ID' attribute to the given value. +func (b *ClusterBuilder) ExternalID(value string) *ClusterBuilder { + b.externalID = value + b.bitmap_ |= 67108864 + return b +} + +// ExternalAuthConfig sets the value of the 'external_auth_config' attribute to the given value. +// +// ExternalAuthConfig configuration +func (b *ClusterBuilder) ExternalAuthConfig(value *ExternalAuthConfigBuilder) *ClusterBuilder { + b.externalAuthConfig = value + if value != nil { + b.bitmap_ |= 134217728 + } else { + b.bitmap_ &^= 134217728 + } + return b +} + +// ExternalConfiguration sets the value of the 'external_configuration' attribute to the given value. +// +// Representation of cluster external configuration. +func (b *ClusterBuilder) ExternalConfiguration(value *ExternalConfigurationBuilder) *ClusterBuilder { + b.externalConfiguration = value + if value != nil { + b.bitmap_ |= 268435456 + } else { + b.bitmap_ &^= 268435456 + } + return b +} + +// Flavour sets the value of the 'flavour' attribute to the given value. +// +// Set of predefined properties of a cluster. For example, a _huge_ flavour can be a cluster +// with 10 infra nodes and 1000 compute nodes. +func (b *ClusterBuilder) Flavour(value *FlavourBuilder) *ClusterBuilder { + b.flavour = value + if value != nil { + b.bitmap_ |= 536870912 + } else { + b.bitmap_ &^= 536870912 + } + return b +} + +// Groups sets the value of the 'groups' attribute to the given values. +func (b *ClusterBuilder) Groups(value *GroupListBuilder) *ClusterBuilder { + b.groups = value + b.bitmap_ |= 1073741824 + return b +} + +// HealthState sets the value of the 'health_state' attribute to the given value. +// +// ClusterHealthState indicates the health of a cluster. +func (b *ClusterBuilder) HealthState(value ClusterHealthState) *ClusterBuilder { + b.healthState = value + b.bitmap_ |= 2147483648 + return b +} + +// Htpasswd sets the value of the 'htpasswd' attribute to the given value. +// +// Details for `htpasswd` identity providers. +func (b *ClusterBuilder) Htpasswd(value *HTPasswdIdentityProviderBuilder) *ClusterBuilder { + b.htpasswd = value + if value != nil { + b.bitmap_ |= 4294967296 + } else { + b.bitmap_ &^= 4294967296 + } + return b +} + +// Hypershift sets the value of the 'hypershift' attribute to the given value. +// +// Hypershift configuration. +func (b *ClusterBuilder) Hypershift(value *HypershiftBuilder) *ClusterBuilder { + b.hypershift = value + if value != nil { + b.bitmap_ |= 8589934592 + } else { + b.bitmap_ &^= 8589934592 + } + return b +} + +// IdentityProviders sets the value of the 'identity_providers' attribute to the given values. +func (b *ClusterBuilder) IdentityProviders(value *IdentityProviderListBuilder) *ClusterBuilder { + b.identityProviders = value + b.bitmap_ |= 17179869184 + return b +} + +// InflightChecks sets the value of the 'inflight_checks' attribute to the given values. +func (b *ClusterBuilder) InflightChecks(value *InflightCheckListBuilder) *ClusterBuilder { + b.inflightChecks = value + b.bitmap_ |= 34359738368 + return b +} + +// InfraID sets the value of the 'infra_ID' attribute to the given value. +func (b *ClusterBuilder) InfraID(value string) *ClusterBuilder { + b.infraID = value + b.bitmap_ |= 68719476736 + return b +} + +// Ingresses sets the value of the 'ingresses' attribute to the given values. +func (b *ClusterBuilder) Ingresses(value *IngressListBuilder) *ClusterBuilder { + b.ingresses = value + b.bitmap_ |= 137438953472 + return b +} + +// KubeletConfig sets the value of the 'kubelet_config' attribute to the given value. +// +// OCM representation of KubeletConfig, exposing the fields of Kubernetes +// KubeletConfig that can be managed by users +func (b *ClusterBuilder) KubeletConfig(value *KubeletConfigBuilder) *ClusterBuilder { + b.kubeletConfig = value + if value != nil { + b.bitmap_ |= 274877906944 + } else { + b.bitmap_ &^= 274877906944 + } + return b +} + +// LoadBalancerQuota sets the value of the 'load_balancer_quota' attribute to the given value. +func (b *ClusterBuilder) LoadBalancerQuota(value int) *ClusterBuilder { + b.loadBalancerQuota = value + b.bitmap_ |= 549755813888 + return b +} + +// MachinePools sets the value of the 'machine_pools' attribute to the given values. +func (b *ClusterBuilder) MachinePools(value *MachinePoolListBuilder) *ClusterBuilder { + b.machinePools = value + b.bitmap_ |= 1099511627776 + return b +} + +// Managed sets the value of the 'managed' attribute to the given value. +func (b *ClusterBuilder) Managed(value bool) *ClusterBuilder { + b.managed = value + b.bitmap_ |= 2199023255552 + return b +} + +// ManagedService sets the value of the 'managed_service' attribute to the given value. +// +// Contains the necessary attributes to support role-based authentication on AWS. +func (b *ClusterBuilder) ManagedService(value *ManagedServiceBuilder) *ClusterBuilder { + b.managedService = value + if value != nil { + b.bitmap_ |= 4398046511104 + } else { + b.bitmap_ &^= 4398046511104 + } + return b +} + +// MultiAZ sets the value of the 'multi_AZ' attribute to the given value. +func (b *ClusterBuilder) MultiAZ(value bool) *ClusterBuilder { + b.multiAZ = value + b.bitmap_ |= 8796093022208 + return b +} + +// MultiArchEnabled sets the value of the 'multi_arch_enabled' attribute to the given value. +func (b *ClusterBuilder) MultiArchEnabled(value bool) *ClusterBuilder { + b.multiArchEnabled = value + b.bitmap_ |= 17592186044416 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *ClusterBuilder) Name(value string) *ClusterBuilder { + b.name = value + b.bitmap_ |= 35184372088832 + return b +} + +// Network sets the value of the 'network' attribute to the given value. +// +// Network configuration of a cluster. +func (b *ClusterBuilder) Network(value *NetworkBuilder) *ClusterBuilder { + b.network = value + if value != nil { + b.bitmap_ |= 70368744177664 + } else { + b.bitmap_ &^= 70368744177664 + } + return b +} + +// NodeDrainGracePeriod sets the value of the 'node_drain_grace_period' attribute to the given value. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +func (b *ClusterBuilder) NodeDrainGracePeriod(value *ValueBuilder) *ClusterBuilder { + b.nodeDrainGracePeriod = value + if value != nil { + b.bitmap_ |= 140737488355328 + } else { + b.bitmap_ &^= 140737488355328 + } + return b +} + +// NodePools sets the value of the 'node_pools' attribute to the given values. +func (b *ClusterBuilder) NodePools(value *NodePoolListBuilder) *ClusterBuilder { + b.nodePools = value + b.bitmap_ |= 281474976710656 + return b +} + +// Nodes sets the value of the 'nodes' attribute to the given value. +// +// Counts of different classes of nodes inside a cluster. +func (b *ClusterBuilder) Nodes(value *ClusterNodesBuilder) *ClusterBuilder { + b.nodes = value + if value != nil { + b.bitmap_ |= 562949953421312 + } else { + b.bitmap_ &^= 562949953421312 + } + return b +} + +// OpenshiftVersion sets the value of the 'openshift_version' attribute to the given value. +func (b *ClusterBuilder) OpenshiftVersion(value string) *ClusterBuilder { + b.openshiftVersion = value + b.bitmap_ |= 1125899906842624 + return b +} + +// Product sets the value of the 'product' attribute to the given value. +// +// Representation of an product that can be selected as a cluster type. +func (b *ClusterBuilder) Product(value *ProductBuilder) *ClusterBuilder { + b.product = value + if value != nil { + b.bitmap_ |= 2251799813685248 + } else { + b.bitmap_ &^= 2251799813685248 + } + return b +} + +// Properties sets the value of the 'properties' attribute to the given value. +func (b *ClusterBuilder) Properties(value map[string]string) *ClusterBuilder { + b.properties = value + if value != nil { + b.bitmap_ |= 4503599627370496 + } else { + b.bitmap_ &^= 4503599627370496 + } + return b +} + +// ProvisionShard sets the value of the 'provision_shard' attribute to the given value. +// +// Contains the properties of the provision shard, including AWS and GCP related configurations +func (b *ClusterBuilder) ProvisionShard(value *ProvisionShardBuilder) *ClusterBuilder { + b.provisionShard = value + if value != nil { + b.bitmap_ |= 9007199254740992 + } else { + b.bitmap_ &^= 9007199254740992 + } + return b +} + +// Proxy sets the value of the 'proxy' attribute to the given value. +// +// Proxy configuration of a cluster. +func (b *ClusterBuilder) Proxy(value *ProxyBuilder) *ClusterBuilder { + b.proxy = value + if value != nil { + b.bitmap_ |= 18014398509481984 + } else { + b.bitmap_ &^= 18014398509481984 + } + return b +} + +// Region sets the value of the 'region' attribute to the given value. +// +// Description of a region of a cloud provider. +func (b *ClusterBuilder) Region(value *CloudRegionBuilder) *ClusterBuilder { + b.region = value + if value != nil { + b.bitmap_ |= 36028797018963968 + } else { + b.bitmap_ &^= 36028797018963968 + } + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// Overall state of a cluster. +func (b *ClusterBuilder) State(value ClusterState) *ClusterBuilder { + b.state = value + b.bitmap_ |= 72057594037927936 + return b +} + +// Status sets the value of the 'status' attribute to the given value. +// +// Detailed status of a cluster. +func (b *ClusterBuilder) Status(value *ClusterStatusBuilder) *ClusterBuilder { + b.status = value + if value != nil { + b.bitmap_ |= 144115188075855872 + } else { + b.bitmap_ &^= 144115188075855872 + } + return b +} + +// StorageQuota sets the value of the 'storage_quota' attribute to the given value. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +func (b *ClusterBuilder) StorageQuota(value *ValueBuilder) *ClusterBuilder { + b.storageQuota = value + if value != nil { + b.bitmap_ |= 288230376151711744 + } else { + b.bitmap_ &^= 288230376151711744 + } + return b +} + +// Subscription sets the value of the 'subscription' attribute to the given value. +// +// Definition of a subscription. +func (b *ClusterBuilder) Subscription(value *SubscriptionBuilder) *ClusterBuilder { + b.subscription = value + if value != nil { + b.bitmap_ |= 576460752303423488 + } else { + b.bitmap_ &^= 576460752303423488 + } + return b +} + +// Version sets the value of the 'version' attribute to the given value. +// +// Representation of an _OpenShift_ version. +func (b *ClusterBuilder) Version(value *VersionBuilder) *ClusterBuilder { + b.version = value + if value != nil { + b.bitmap_ |= 1152921504606846976 + } else { + b.bitmap_ &^= 1152921504606846976 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterBuilder) Copy(object *Cluster) *ClusterBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.api != nil { + b.api = NewClusterAPI().Copy(object.api) + } else { + b.api = nil + } + if object.aws != nil { + b.aws = NewAWS().Copy(object.aws) + } else { + b.aws = nil + } + if object.awsInfrastructureAccessRoleGrants != nil { + b.awsInfrastructureAccessRoleGrants = NewAWSInfrastructureAccessRoleGrantList().Copy(object.awsInfrastructureAccessRoleGrants) + } else { + b.awsInfrastructureAccessRoleGrants = nil + } + if object.ccs != nil { + b.ccs = NewCCS().Copy(object.ccs) + } else { + b.ccs = nil + } + if object.dns != nil { + b.dns = NewDNS().Copy(object.dns) + } else { + b.dns = nil + } + b.fips = object.fips + if object.gcp != nil { + b.gcp = NewGCP().Copy(object.gcp) + } else { + b.gcp = nil + } + if object.gcpEncryptionKey != nil { + b.gcpEncryptionKey = NewGCPEncryptionKey().Copy(object.gcpEncryptionKey) + } else { + b.gcpEncryptionKey = nil + } + if object.gcpNetwork != nil { + b.gcpNetwork = NewGCPNetwork().Copy(object.gcpNetwork) + } else { + b.gcpNetwork = nil + } + b.additionalTrustBundle = object.additionalTrustBundle + if object.addons != nil { + b.addons = NewAddOnInstallationList().Copy(object.addons) + } else { + b.addons = nil + } + if object.autoscaler != nil { + b.autoscaler = NewClusterAutoscaler().Copy(object.autoscaler) + } else { + b.autoscaler = nil + } + if object.azure != nil { + b.azure = NewAzure().Copy(object.azure) + } else { + b.azure = nil + } + b.billingModel = object.billingModel + if object.byoOidc != nil { + b.byoOidc = NewByoOidc().Copy(object.byoOidc) + } else { + b.byoOidc = nil + } + if object.cloudProvider != nil { + b.cloudProvider = NewCloudProvider().Copy(object.cloudProvider) + } else { + b.cloudProvider = nil + } + if object.console != nil { + b.console = NewClusterConsole().Copy(object.console) + } else { + b.console = nil + } + b.creationTimestamp = object.creationTimestamp + if object.deleteProtection != nil { + b.deleteProtection = NewDeleteProtection().Copy(object.deleteProtection) + } else { + b.deleteProtection = nil + } + b.disableUserWorkloadMonitoring = object.disableUserWorkloadMonitoring + b.domainPrefix = object.domainPrefix + b.etcdEncryption = object.etcdEncryption + b.expirationTimestamp = object.expirationTimestamp + b.externalID = object.externalID + if object.externalAuthConfig != nil { + b.externalAuthConfig = NewExternalAuthConfig().Copy(object.externalAuthConfig) + } else { + b.externalAuthConfig = nil + } + if object.externalConfiguration != nil { + b.externalConfiguration = NewExternalConfiguration().Copy(object.externalConfiguration) + } else { + b.externalConfiguration = nil + } + if object.flavour != nil { + b.flavour = NewFlavour().Copy(object.flavour) + } else { + b.flavour = nil + } + if object.groups != nil { + b.groups = NewGroupList().Copy(object.groups) + } else { + b.groups = nil + } + b.healthState = object.healthState + if object.htpasswd != nil { + b.htpasswd = NewHTPasswdIdentityProvider().Copy(object.htpasswd) + } else { + b.htpasswd = nil + } + if object.hypershift != nil { + b.hypershift = NewHypershift().Copy(object.hypershift) + } else { + b.hypershift = nil + } + if object.identityProviders != nil { + b.identityProviders = NewIdentityProviderList().Copy(object.identityProviders) + } else { + b.identityProviders = nil + } + if object.inflightChecks != nil { + b.inflightChecks = NewInflightCheckList().Copy(object.inflightChecks) + } else { + b.inflightChecks = nil + } + b.infraID = object.infraID + if object.ingresses != nil { + b.ingresses = NewIngressList().Copy(object.ingresses) + } else { + b.ingresses = nil + } + if object.kubeletConfig != nil { + b.kubeletConfig = NewKubeletConfig().Copy(object.kubeletConfig) + } else { + b.kubeletConfig = nil + } + b.loadBalancerQuota = object.loadBalancerQuota + if object.machinePools != nil { + b.machinePools = NewMachinePoolList().Copy(object.machinePools) + } else { + b.machinePools = nil + } + b.managed = object.managed + if object.managedService != nil { + b.managedService = NewManagedService().Copy(object.managedService) + } else { + b.managedService = nil + } + b.multiAZ = object.multiAZ + b.multiArchEnabled = object.multiArchEnabled + b.name = object.name + if object.network != nil { + b.network = NewNetwork().Copy(object.network) + } else { + b.network = nil + } + if object.nodeDrainGracePeriod != nil { + b.nodeDrainGracePeriod = NewValue().Copy(object.nodeDrainGracePeriod) + } else { + b.nodeDrainGracePeriod = nil + } + if object.nodePools != nil { + b.nodePools = NewNodePoolList().Copy(object.nodePools) + } else { + b.nodePools = nil + } + if object.nodes != nil { + b.nodes = NewClusterNodes().Copy(object.nodes) + } else { + b.nodes = nil + } + b.openshiftVersion = object.openshiftVersion + if object.product != nil { + b.product = NewProduct().Copy(object.product) + } else { + b.product = nil + } + if len(object.properties) > 0 { + b.properties = map[string]string{} + for k, v := range object.properties { + b.properties[k] = v + } + } else { + b.properties = nil + } + if object.provisionShard != nil { + b.provisionShard = NewProvisionShard().Copy(object.provisionShard) + } else { + b.provisionShard = nil + } + if object.proxy != nil { + b.proxy = NewProxy().Copy(object.proxy) + } else { + b.proxy = nil + } + if object.region != nil { + b.region = NewCloudRegion().Copy(object.region) + } else { + b.region = nil + } + b.state = object.state + if object.status != nil { + b.status = NewClusterStatus().Copy(object.status) + } else { + b.status = nil + } + if object.storageQuota != nil { + b.storageQuota = NewValue().Copy(object.storageQuota) + } else { + b.storageQuota = nil + } + if object.subscription != nil { + b.subscription = NewSubscription().Copy(object.subscription) + } else { + b.subscription = nil + } + if object.version != nil { + b.version = NewVersion().Copy(object.version) + } else { + b.version = nil + } + return b +} + +// Build creates a 'cluster' object using the configuration stored in the builder. +func (b *ClusterBuilder) Build() (object *Cluster, err error) { + object = new(Cluster) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.api != nil { + object.api, err = b.api.Build() + if err != nil { + return + } + } + if b.aws != nil { + object.aws, err = b.aws.Build() + if err != nil { + return + } + } + if b.awsInfrastructureAccessRoleGrants != nil { + object.awsInfrastructureAccessRoleGrants, err = b.awsInfrastructureAccessRoleGrants.Build() + if err != nil { + return + } + } + if b.ccs != nil { + object.ccs, err = b.ccs.Build() + if err != nil { + return + } + } + if b.dns != nil { + object.dns, err = b.dns.Build() + if err != nil { + return + } + } + object.fips = b.fips + if b.gcp != nil { + object.gcp, err = b.gcp.Build() + if err != nil { + return + } + } + if b.gcpEncryptionKey != nil { + object.gcpEncryptionKey, err = b.gcpEncryptionKey.Build() + if err != nil { + return + } + } + if b.gcpNetwork != nil { + object.gcpNetwork, err = b.gcpNetwork.Build() + if err != nil { + return + } + } + object.additionalTrustBundle = b.additionalTrustBundle + if b.addons != nil { + object.addons, err = b.addons.Build() + if err != nil { + return + } + } + if b.autoscaler != nil { + object.autoscaler, err = b.autoscaler.Build() + if err != nil { + return + } + } + if b.azure != nil { + object.azure, err = b.azure.Build() + if err != nil { + return + } + } + object.billingModel = b.billingModel + if b.byoOidc != nil { + object.byoOidc, err = b.byoOidc.Build() + if err != nil { + return + } + } + if b.cloudProvider != nil { + object.cloudProvider, err = b.cloudProvider.Build() + if err != nil { + return + } + } + if b.console != nil { + object.console, err = b.console.Build() + if err != nil { + return + } + } + object.creationTimestamp = b.creationTimestamp + if b.deleteProtection != nil { + object.deleteProtection, err = b.deleteProtection.Build() + if err != nil { + return + } + } + object.disableUserWorkloadMonitoring = b.disableUserWorkloadMonitoring + object.domainPrefix = b.domainPrefix + object.etcdEncryption = b.etcdEncryption + object.expirationTimestamp = b.expirationTimestamp + object.externalID = b.externalID + if b.externalAuthConfig != nil { + object.externalAuthConfig, err = b.externalAuthConfig.Build() + if err != nil { + return + } + } + if b.externalConfiguration != nil { + object.externalConfiguration, err = b.externalConfiguration.Build() + if err != nil { + return + } + } + if b.flavour != nil { + object.flavour, err = b.flavour.Build() + if err != nil { + return + } + } + if b.groups != nil { + object.groups, err = b.groups.Build() + if err != nil { + return + } + } + object.healthState = b.healthState + if b.htpasswd != nil { + object.htpasswd, err = b.htpasswd.Build() + if err != nil { + return + } + } + if b.hypershift != nil { + object.hypershift, err = b.hypershift.Build() + if err != nil { + return + } + } + if b.identityProviders != nil { + object.identityProviders, err = b.identityProviders.Build() + if err != nil { + return + } + } + if b.inflightChecks != nil { + object.inflightChecks, err = b.inflightChecks.Build() + if err != nil { + return + } + } + object.infraID = b.infraID + if b.ingresses != nil { + object.ingresses, err = b.ingresses.Build() + if err != nil { + return + } + } + if b.kubeletConfig != nil { + object.kubeletConfig, err = b.kubeletConfig.Build() + if err != nil { + return + } + } + object.loadBalancerQuota = b.loadBalancerQuota + if b.machinePools != nil { + object.machinePools, err = b.machinePools.Build() + if err != nil { + return + } + } + object.managed = b.managed + if b.managedService != nil { + object.managedService, err = b.managedService.Build() + if err != nil { + return + } + } + object.multiAZ = b.multiAZ + object.multiArchEnabled = b.multiArchEnabled + object.name = b.name + if b.network != nil { + object.network, err = b.network.Build() + if err != nil { + return + } + } + if b.nodeDrainGracePeriod != nil { + object.nodeDrainGracePeriod, err = b.nodeDrainGracePeriod.Build() + if err != nil { + return + } + } + if b.nodePools != nil { + object.nodePools, err = b.nodePools.Build() + if err != nil { + return + } + } + if b.nodes != nil { + object.nodes, err = b.nodes.Build() + if err != nil { + return + } + } + object.openshiftVersion = b.openshiftVersion + if b.product != nil { + object.product, err = b.product.Build() + if err != nil { + return + } + } + if b.properties != nil { + object.properties = make(map[string]string) + for k, v := range b.properties { + object.properties[k] = v + } + } + if b.provisionShard != nil { + object.provisionShard, err = b.provisionShard.Build() + if err != nil { + return + } + } + if b.proxy != nil { + object.proxy, err = b.proxy.Build() + if err != nil { + return + } + } + if b.region != nil { + object.region, err = b.region.Build() + if err != nil { + return + } + } + object.state = b.state + if b.status != nil { + object.status, err = b.status.Build() + if err != nil { + return + } + } + if b.storageQuota != nil { + object.storageQuota, err = b.storageQuota.Build() + if err != nil { + return + } + } + if b.subscription != nil { + object.subscription, err = b.subscription.Build() + if err != nil { + return + } + } + if b.version != nil { + object.version, err = b.version.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_client.go b/clustersmgmt/v2alpha1/cluster_client.go new file mode 100644 index 00000000..bbae7657 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_client.go @@ -0,0 +1,1178 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ClusterClient is the client of the 'cluster' resource. +// +// Manages a specific cluster. +type ClusterClient struct { + transport http.RoundTripper + path string +} + +// NewClusterClient creates a new client for the 'cluster' +// resource using the given transport to send the requests and receive the +// responses. +func NewClusterClient(transport http.RoundTripper, path string) *ClusterClient { + return &ClusterClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the cluster. +func (c *ClusterClient) Delete() *ClusterDeleteRequest { + return &ClusterDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the cluster. +func (c *ClusterClient) Get() *ClusterGetRequest { + return &ClusterGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Hibernate creates a request for the 'hibernate' method. +// +// Initiates cluster hibernation. While hibernating a cluster will not consume any cloud provider infrastructure +// but will be counted for quota. +func (c *ClusterClient) Hibernate() *ClusterHibernateRequest { + return &ClusterHibernateRequest{ + transport: c.transport, + path: path.Join(c.path, "hibernate"), + } +} + +// Resume creates a request for the 'resume' method. +// +// Resumes from Hibernation. +func (c *ClusterClient) Resume() *ClusterResumeRequest { + return &ClusterResumeRequest{ + transport: c.transport, + path: path.Join(c.path, "resume"), + } +} + +// Update creates a request for the 'update' method. +// +// Updates the cluster. +func (c *ClusterClient) Update() *ClusterUpdateRequest { + return &ClusterUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWS returns the target 'AWS' resource. +func (c *ClusterClient) AWS() *AWSClient { + return NewAWSClient( + c.transport, + path.Join(c.path, "aws"), + ) +} + +// AWSInfrastructureAccessRoleGrants returns the target 'AWS_infrastructure_access_role_grants' resource. +// +// Reference to the resource that manages the collection of AWS infrastructure +// access role grants on this cluster. +func (c *ClusterClient) AWSInfrastructureAccessRoleGrants() *AWSInfrastructureAccessRoleGrantsClient { + return NewAWSInfrastructureAccessRoleGrantsClient( + c.transport, + path.Join(c.path, "aws_infrastructure_access_role_grants"), + ) +} + +// STSOperatorRoles returns the target 'operator_IAM_roles' resource. +func (c *ClusterClient) STSOperatorRoles() *OperatorIAMRolesClient { + return NewOperatorIAMRolesClient( + c.transport, + path.Join(c.path, "sts_operator_roles"), + ) +} + +// AddonInquiries returns the target 'addon_inquiries' resource. +// +// Reference to the resource that manages the collection of the add-on inquiries on this cluster. +func (c *ClusterClient) AddonInquiries() *AddonInquiriesClient { + return NewAddonInquiriesClient( + c.transport, + path.Join(c.path, "addon_inquiries"), + ) +} + +// AddonUpgradePolicies returns the target 'addon_upgrade_policies' resource. +// +// Reference to the resource that manages the collection of addon upgrade policies defined for this cluster. +func (c *ClusterClient) AddonUpgradePolicies() *AddonUpgradePoliciesClient { + return NewAddonUpgradePoliciesClient( + c.transport, + path.Join(c.path, "addon_upgrade_policies"), + ) +} + +// Addons returns the target 'add_on_installations' resource. +// +// Reference to the resource that manages the collection of add-ons installed on this cluster. +func (c *ClusterClient) Addons() *AddOnInstallationsClient { + return NewAddOnInstallationsClient( + c.transport, + path.Join(c.path, "addons"), + ) +} + +// Autoscaler returns the target 'autoscaler' resource. +// +// Reference to the resource that manages the cluster autoscaler. +func (c *ClusterClient) Autoscaler() *AutoscalerClient { + return NewAutoscalerClient( + c.transport, + path.Join(c.path, "autoscaler"), + ) +} + +// BreakGlassCredentials returns the target 'break_glass_credentials' resource. +// +// Reference to the resource that manages the break glass credentials. +func (c *ClusterClient) BreakGlassCredentials() *BreakGlassCredentialsClient { + return NewBreakGlassCredentialsClient( + c.transport, + path.Join(c.path, "break_glass_credentials"), + ) +} + +// Clusterdeployment returns the target 'clusterdeployment' resource. +// +// Reference to the resource that manages the cluster deployment. +func (c *ClusterClient) Clusterdeployment() *ClusterdeploymentClient { + return NewClusterdeploymentClient( + c.transport, + path.Join(c.path, "clusterdeployment"), + ) +} + +// ControlPlane returns the target 'control_plane' resource. +// +// Reference to the resource that manages the collection of upgrade policies defined for control plane for this cluster. +func (c *ClusterClient) ControlPlane() *ControlPlaneClient { + return NewControlPlaneClient( + c.transport, + path.Join(c.path, "control_plane"), + ) +} + +// Credentials returns the target 'credentials' resource. +// +// Reference to the resource that manages the credentials of the cluster. +func (c *ClusterClient) Credentials() *CredentialsClient { + return NewCredentialsClient( + c.transport, + path.Join(c.path, "credentials"), + ) +} + +// DeleteProtection returns the target 'delete_protection' resource. +func (c *ClusterClient) DeleteProtection() *DeleteProtectionClient { + return NewDeleteProtectionClient( + c.transport, + path.Join(c.path, "delete_protection"), + ) +} + +// ExternalAuthConfig returns the target 'external_auth_config' resource. +// +// Reference to the resource that manages the external authentication configuration. +func (c *ClusterClient) ExternalAuthConfig() *ExternalAuthConfigClient { + return NewExternalAuthConfigClient( + c.transport, + path.Join(c.path, "external_auth_config"), + ) +} + +// ExternalConfiguration returns the target 'external_configuration' resource. +// +// Reference to the resource that manages the external configuration. +func (c *ClusterClient) ExternalConfiguration() *ExternalConfigurationClient { + return NewExternalConfigurationClient( + c.transport, + path.Join(c.path, "external_configuration"), + ) +} + +// GateAgreements returns the target 'version_gate_agreements' resource. +// +// Reference to cluster's agreed version gate. +func (c *ClusterClient) GateAgreements() *VersionGateAgreementsClient { + return NewVersionGateAgreementsClient( + c.transport, + path.Join(c.path, "gate_agreements"), + ) +} + +// Groups returns the target 'groups' resource. +// +// Reference to the resource that manages the collection of groups. +func (c *ClusterClient) Groups() *GroupsClient { + return NewGroupsClient( + c.transport, + path.Join(c.path, "groups"), + ) +} + +// Hypershift returns the target 'hypershift' resource. +func (c *ClusterClient) Hypershift() *HypershiftClient { + return NewHypershiftClient( + c.transport, + path.Join(c.path, "hypershift"), + ) +} + +// IdentityProviders returns the target 'identity_providers' resource. +// +// Reference to the resource that manages the collection of identity providers. +func (c *ClusterClient) IdentityProviders() *IdentityProvidersClient { + return NewIdentityProvidersClient( + c.transport, + path.Join(c.path, "identity_providers"), + ) +} + +// InflightChecks returns the target 'inflight_checks' resource. +// +// Reference to the resource that manages the collection of inflight checks. +func (c *ClusterClient) InflightChecks() *InflightChecksClient { + return NewInflightChecksClient( + c.transport, + path.Join(c.path, "inflight_checks"), + ) +} + +// Ingresses returns the target 'ingresses' resource. +// +// Reference to the resource that manages the collection of ingress resources. +func (c *ClusterClient) Ingresses() *IngressesClient { + return NewIngressesClient( + c.transport, + path.Join(c.path, "ingresses"), + ) +} + +// KubeletConfig returns the target 'kubelet_config' resource. +func (c *ClusterClient) KubeletConfig() *KubeletConfigClient { + return NewKubeletConfigClient( + c.transport, + path.Join(c.path, "kubelet_config"), + ) +} + +// KubeletConfigs returns the target 'kubelet_configs' resource. +func (c *ClusterClient) KubeletConfigs() *KubeletConfigsClient { + return NewKubeletConfigsClient( + c.transport, + path.Join(c.path, "kubelet_configs"), + ) +} + +// LimitedSupportReasons returns the target 'limited_support_reasons' resource. +// +// Reference to cluster limited support reasons. +func (c *ClusterClient) LimitedSupportReasons() *LimitedSupportReasonsClient { + return NewLimitedSupportReasonsClient( + c.transport, + path.Join(c.path, "limited_support_reasons"), + ) +} + +// Logs returns the target 'logs' resource. +// +// Reference to the resource that manages the collection of logs of the cluster. +func (c *ClusterClient) Logs() *LogsClient { + return NewLogsClient( + c.transport, + path.Join(c.path, "logs"), + ) +} + +// MachinePools returns the target 'machine_pools' resource. +// +// Reference to the resource that manages the collection of machine pool resources. +func (c *ClusterClient) MachinePools() *MachinePoolsClient { + return NewMachinePoolsClient( + c.transport, + path.Join(c.path, "machine_pools"), + ) +} + +// MetricQueries returns the target 'metric_queries' resource. +// +// Reference to the resource that manages metrics queries for the cluster. +func (c *ClusterClient) MetricQueries() *MetricQueriesClient { + return NewMetricQueriesClient( + c.transport, + path.Join(c.path, "metric_queries"), + ) +} + +// NodePools returns the target 'node_pools' resource. +// +// Reference to the resource that manages the collection of node pool resources. +func (c *ClusterClient) NodePools() *NodePoolsClient { + return NewNodePoolsClient( + c.transport, + path.Join(c.path, "node_pools"), + ) +} + +// ProvisionShard returns the target 'provision_shard' resource. +// +// Reference to the resource that manages the cluster's provision shard. +func (c *ClusterClient) ProvisionShard() *ProvisionShardClient { + return NewProvisionShardClient( + c.transport, + path.Join(c.path, "provision_shard"), + ) +} + +// Resources returns the target 'resources' resource. +// +// Reference to cluster resources. +func (c *ClusterClient) Resources() *ResourcesClient { + return NewResourcesClient( + c.transport, + path.Join(c.path, "resources"), + ) +} + +// Status returns the target 'cluster_status' resource. +// +// Reference to the resource that manages the detailed status of the cluster. +func (c *ClusterClient) Status() *ClusterStatusClient { + return NewClusterStatusClient( + c.transport, + path.Join(c.path, "status"), + ) +} + +// StsSupportJumpRole returns the target 'sts_support_jump_role' resource. +func (c *ClusterClient) StsSupportJumpRole() *StsSupportJumpRoleClient { + return NewStsSupportJumpRoleClient( + c.transport, + path.Join(c.path, "sts_support_jump_role"), + ) +} + +// TuningConfigs returns the target 'tuning_configs' resource. +// +// Reference to the resource that manages the collection of tuning configs for this cluster. +func (c *ClusterClient) TuningConfigs() *TuningConfigsClient { + return NewTuningConfigsClient( + c.transport, + path.Join(c.path, "tuning_configs"), + ) +} + +// UpgradePolicies returns the target 'upgrade_policies' resource. +// +// Reference to the resource that manages the collection of upgrade policies defined for this cluster. +func (c *ClusterClient) UpgradePolicies() *UpgradePoliciesClient { + return NewUpgradePoliciesClient( + c.transport, + path.Join(c.path, "upgrade_policies"), + ) +} + +// Vpc returns the target 'vpc' resource. +// +// Reference to the resource that manages the vpc resource. +func (c *ClusterClient) Vpc() *VpcClient { + return NewVpcClient( + c.transport, + path.Join(c.path, "vpc"), + ) +} + +// ClusterPollRequest is the request for the Poll method. +type ClusterPollRequest struct { + request *ClusterGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ClusterPollRequest) Parameter(name string, value interface{}) *ClusterPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ClusterPollRequest) Header(name string, value interface{}) *ClusterPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ClusterPollRequest) Interval(value time.Duration) *ClusterPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ClusterPollRequest) Status(value int) *ClusterPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ClusterPollRequest) Predicate(value func(*ClusterGetResponse) bool) *ClusterPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ClusterGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ClusterPollRequest) StartContext(ctx context.Context) (response *ClusterPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ClusterPollResponse{ + response: result.(*ClusterGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ClusterPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ClusterPollResponse is the response for the Poll method. +type ClusterPollResponse struct { + response *ClusterGetResponse +} + +// Status returns the response status code. +func (r *ClusterPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ClusterPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ClusterPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterPollResponse) Body() *Cluster { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterPollResponse) GetBody() (value *Cluster, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ClusterClient) Poll() *ClusterPollRequest { + return &ClusterPollRequest{ + request: c.Get(), + } +} + +// ClusterDeleteRequest is the request for the 'delete' method. +type ClusterDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + bestEffort *bool + deprovision *bool + dryRun *bool +} + +// Parameter adds a query parameter. +func (r *ClusterDeleteRequest) Parameter(name string, value interface{}) *ClusterDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterDeleteRequest) Header(name string, value interface{}) *ClusterDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterDeleteRequest) Impersonate(user string) *ClusterDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// BestEffort sets the value of the 'best_effort' parameter. +// +// BestEffort flag is used to check if the cluster deletion should be best-effort mode or not. +func (r *ClusterDeleteRequest) BestEffort(value bool) *ClusterDeleteRequest { + r.bestEffort = &value + return r +} + +// Deprovision sets the value of the 'deprovision' parameter. +// +// If false it will only delete from OCM but not the actual cluster resources. +// false is only allowed for OCP clusters. true by default. +func (r *ClusterDeleteRequest) Deprovision(value bool) *ClusterDeleteRequest { + r.deprovision = &value + return r +} + +// DryRun sets the value of the 'dry_run' parameter. +// +// Dry run flag is used to check if the operation can be completed, but won't delete. +func (r *ClusterDeleteRequest) DryRun(value bool) *ClusterDeleteRequest { + r.dryRun = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterDeleteRequest) Send() (result *ClusterDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterDeleteRequest) SendContext(ctx context.Context) (result *ClusterDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.bestEffort != nil { + helpers.AddValue(&query, "best_effort", *r.bestEffort) + } + if r.deprovision != nil { + helpers.AddValue(&query, "deprovision", *r.deprovision) + } + if r.dryRun != nil { + helpers.AddValue(&query, "dry_run", *r.dryRun) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ClusterDeleteResponse is the response for the 'delete' method. +type ClusterDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ClusterDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ClusterGetRequest is the request for the 'get' method. +type ClusterGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterGetRequest) Parameter(name string, value interface{}) *ClusterGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterGetRequest) Header(name string, value interface{}) *ClusterGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterGetRequest) Impersonate(user string) *ClusterGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterGetRequest) Send() (result *ClusterGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterGetRequest) SendContext(ctx context.Context) (result *ClusterGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClusterGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ClusterGetResponse is the response for the 'get' method. +type ClusterGetResponse struct { + status int + header http.Header + err *errors.Error + body *Cluster +} + +// Status returns the response status code. +func (r *ClusterGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterGetResponse) Body() *Cluster { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterGetResponse) GetBody() (value *Cluster, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ClusterHibernateRequest is the request for the 'hibernate' method. +type ClusterHibernateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterHibernateRequest) Parameter(name string, value interface{}) *ClusterHibernateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterHibernateRequest) Header(name string, value interface{}) *ClusterHibernateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterHibernateRequest) Impersonate(user string) *ClusterHibernateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterHibernateRequest) Send() (result *ClusterHibernateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterHibernateRequest) SendContext(ctx context.Context) (result *ClusterHibernateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterHibernateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ClusterHibernateResponse is the response for the 'hibernate' method. +type ClusterHibernateResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ClusterHibernateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterHibernateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterHibernateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ClusterResumeRequest is the request for the 'resume' method. +type ClusterResumeRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterResumeRequest) Parameter(name string, value interface{}) *ClusterResumeRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterResumeRequest) Header(name string, value interface{}) *ClusterResumeRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterResumeRequest) Impersonate(user string) *ClusterResumeRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterResumeRequest) Send() (result *ClusterResumeResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterResumeRequest) SendContext(ctx context.Context) (result *ClusterResumeResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterResumeResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ClusterResumeResponse is the response for the 'resume' method. +type ClusterResumeResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ClusterResumeResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterResumeResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterResumeResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ClusterUpdateRequest is the request for the 'update' method. +type ClusterUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Cluster +} + +// Parameter adds a query parameter. +func (r *ClusterUpdateRequest) Parameter(name string, value interface{}) *ClusterUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterUpdateRequest) Header(name string, value interface{}) *ClusterUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterUpdateRequest) Impersonate(user string) *ClusterUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *ClusterUpdateRequest) Body(value *Cluster) *ClusterUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterUpdateRequest) Send() (result *ClusterUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterUpdateRequest) SendContext(ctx context.Context) (result *ClusterUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeClusterUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClusterUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// ClusterUpdateResponse is the response for the 'update' method. +type ClusterUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Cluster +} + +// Status returns the response status code. +func (r *ClusterUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterUpdateResponse) Body() *Cluster { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterUpdateResponse) GetBody() (value *Cluster, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_configuration_mode_list_type_json.go b/clustersmgmt/v2alpha1/cluster_configuration_mode_list_type_json.go new file mode 100644 index 00000000..d96401a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_configuration_mode_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterConfigurationModeList writes a list of values of the 'cluster_configuration_mode' type to +// the given writer. +func MarshalClusterConfigurationModeList(list []ClusterConfigurationMode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterConfigurationModeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterConfigurationModeList writes a list of value of the 'cluster_configuration_mode' type to +// the given stream. +func writeClusterConfigurationModeList(list []ClusterConfigurationMode, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterConfigurationModeList reads a list of values of the 'cluster_configuration_mode' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterConfigurationModeList(source interface{}) (items []ClusterConfigurationMode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterConfigurationModeList(iterator) + err = iterator.Error + return +} + +// readClusterConfigurationModeList reads list of values of the ”cluster_configuration_mode' type from +// the given iterator. +func readClusterConfigurationModeList(iterator *jsoniter.Iterator) []ClusterConfigurationMode { + list := []ClusterConfigurationMode{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ClusterConfigurationMode(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_configuration_mode_type.go b/clustersmgmt/v2alpha1/cluster_configuration_mode_type.go new file mode 100644 index 00000000..19c828f3 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_configuration_mode_type.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterConfigurationMode represents the values of the 'cluster_configuration_mode' enumerated type. +type ClusterConfigurationMode string + +const ( + // Full configuration (default). + ClusterConfigurationModeFull ClusterConfigurationMode = "full" + // Only read configuration operations are supported. + // The cluster can't be deleted, reshaped, configure IDPs, add/remove users, etc. + ClusterConfigurationModeReadOnly ClusterConfigurationMode = "read_only" +) diff --git a/clustersmgmt/v2alpha1/cluster_console_builder.go b/clustersmgmt/v2alpha1/cluster_console_builder.go new file mode 100644 index 00000000..9b2bf550 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_console_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterConsoleBuilder contains the data and logic needed to build 'cluster_console' objects. +// +// Information about the console of a cluster. +type ClusterConsoleBuilder struct { + bitmap_ uint32 + url string +} + +// NewClusterConsole creates a new builder of 'cluster_console' objects. +func NewClusterConsole() *ClusterConsoleBuilder { + return &ClusterConsoleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterConsoleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// URL sets the value of the 'URL' attribute to the given value. +func (b *ClusterConsoleBuilder) URL(value string) *ClusterConsoleBuilder { + b.url = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterConsoleBuilder) Copy(object *ClusterConsole) *ClusterConsoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.url = object.url + return b +} + +// Build creates a 'cluster_console' object using the configuration stored in the builder. +func (b *ClusterConsoleBuilder) Build() (object *ClusterConsole, err error) { + object = new(ClusterConsole) + object.bitmap_ = b.bitmap_ + object.url = b.url + return +} diff --git a/clustersmgmt/v2alpha1/cluster_console_list_builder.go b/clustersmgmt/v2alpha1/cluster_console_list_builder.go new file mode 100644 index 00000000..84f5e460 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_console_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterConsoleListBuilder contains the data and logic needed to build +// 'cluster_console' objects. +type ClusterConsoleListBuilder struct { + items []*ClusterConsoleBuilder +} + +// NewClusterConsoleList creates a new builder of 'cluster_console' objects. +func NewClusterConsoleList() *ClusterConsoleListBuilder { + return new(ClusterConsoleListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterConsoleListBuilder) Items(values ...*ClusterConsoleBuilder) *ClusterConsoleListBuilder { + b.items = make([]*ClusterConsoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterConsoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterConsoleListBuilder) Copy(list *ClusterConsoleList) *ClusterConsoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterConsoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterConsole().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_console' objects using the +// configuration stored in the builder. +func (b *ClusterConsoleListBuilder) Build() (list *ClusterConsoleList, err error) { + items := make([]*ClusterConsole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterConsoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_console_list_type_json.go b/clustersmgmt/v2alpha1/cluster_console_list_type_json.go new file mode 100644 index 00000000..7939fbf6 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_console_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterConsoleList writes a list of values of the 'cluster_console' type to +// the given writer. +func MarshalClusterConsoleList(list []*ClusterConsole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterConsoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterConsoleList writes a list of value of the 'cluster_console' type to +// the given stream. +func writeClusterConsoleList(list []*ClusterConsole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterConsole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterConsoleList reads a list of values of the 'cluster_console' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterConsoleList(source interface{}) (items []*ClusterConsole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterConsoleList(iterator) + err = iterator.Error + return +} + +// readClusterConsoleList reads list of values of the ”cluster_console' type from +// the given iterator. +func readClusterConsoleList(iterator *jsoniter.Iterator) []*ClusterConsole { + list := []*ClusterConsole{} + for iterator.ReadArray() { + item := readClusterConsole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_console_type.go b/clustersmgmt/v2alpha1/cluster_console_type.go new file mode 100644 index 00000000..c495f75a --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_console_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterConsole represents the values of the 'cluster_console' type. +// +// Information about the console of a cluster. +type ClusterConsole struct { + bitmap_ uint32 + url string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterConsole) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// URL returns the value of the 'URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The URL of the console of the cluster. +func (o *ClusterConsole) URL() string { + if o != nil && o.bitmap_&1 != 0 { + return o.url + } + return "" +} + +// GetURL returns the value of the 'URL' attribute and +// a flag indicating if the attribute has a value. +// +// The URL of the console of the cluster. +func (o *ClusterConsole) GetURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.url + } + return +} + +// ClusterConsoleListKind is the name of the type used to represent list of objects of +// type 'cluster_console'. +const ClusterConsoleListKind = "ClusterConsoleList" + +// ClusterConsoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_console'. +const ClusterConsoleListLinkKind = "ClusterConsoleListLink" + +// ClusterConsoleNilKind is the name of the type used to nil lists of objects of +// type 'cluster_console'. +const ClusterConsoleListNilKind = "ClusterConsoleListNil" + +// ClusterConsoleList is a list of values of the 'cluster_console' type. +type ClusterConsoleList struct { + href string + link bool + items []*ClusterConsole +} + +// Len returns the length of the list. +func (l *ClusterConsoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterConsoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterConsoleList) Get(i int) *ClusterConsole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterConsoleList) Slice() []*ClusterConsole { + var slice []*ClusterConsole + if l == nil { + slice = make([]*ClusterConsole, 0) + } else { + slice = make([]*ClusterConsole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterConsoleList) Each(f func(item *ClusterConsole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterConsoleList) Range(f func(index int, item *ClusterConsole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_console_type_json.go b/clustersmgmt/v2alpha1/cluster_console_type_json.go new file mode 100644 index 00000000..41642ec0 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_console_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterConsole writes a value of the 'cluster_console' type to the given writer. +func MarshalClusterConsole(object *ClusterConsole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterConsole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterConsole writes a value of the 'cluster_console' type to the given stream. +func writeClusterConsole(object *ClusterConsole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("url") + stream.WriteString(object.url) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterConsole reads a value of the 'cluster_console' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterConsole(source interface{}) (object *ClusterConsole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterConsole(iterator) + err = iterator.Error + return +} + +// readClusterConsole reads a value of the 'cluster_console' type from the given iterator. +func readClusterConsole(iterator *jsoniter.Iterator) *ClusterConsole { + object := &ClusterConsole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "url": + value := iterator.ReadString() + object.url = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_credentials_builder.go b/clustersmgmt/v2alpha1/cluster_credentials_builder.go new file mode 100644 index 00000000..d334ec6b --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_credentials_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterCredentialsBuilder contains the data and logic needed to build 'cluster_credentials' objects. +// +// Credentials of the a cluster. +type ClusterCredentialsBuilder struct { + bitmap_ uint32 + id string + href string + kubeconfig string +} + +// NewClusterCredentials creates a new builder of 'cluster_credentials' objects. +func NewClusterCredentials() *ClusterCredentialsBuilder { + return &ClusterCredentialsBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ClusterCredentialsBuilder) Link(value bool) *ClusterCredentialsBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ClusterCredentialsBuilder) ID(value string) *ClusterCredentialsBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ClusterCredentialsBuilder) HREF(value string) *ClusterCredentialsBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterCredentialsBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Kubeconfig sets the value of the 'kubeconfig' attribute to the given value. +func (b *ClusterCredentialsBuilder) Kubeconfig(value string) *ClusterCredentialsBuilder { + b.kubeconfig = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterCredentialsBuilder) Copy(object *ClusterCredentials) *ClusterCredentialsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.kubeconfig = object.kubeconfig + return b +} + +// Build creates a 'cluster_credentials' object using the configuration stored in the builder. +func (b *ClusterCredentialsBuilder) Build() (object *ClusterCredentials, err error) { + object = new(ClusterCredentials) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.kubeconfig = b.kubeconfig + return +} diff --git a/clustersmgmt/v2alpha1/cluster_credentials_list_builder.go b/clustersmgmt/v2alpha1/cluster_credentials_list_builder.go new file mode 100644 index 00000000..2ba35e59 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_credentials_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterCredentialsListBuilder contains the data and logic needed to build +// 'cluster_credentials' objects. +type ClusterCredentialsListBuilder struct { + items []*ClusterCredentialsBuilder +} + +// NewClusterCredentialsList creates a new builder of 'cluster_credentials' objects. +func NewClusterCredentialsList() *ClusterCredentialsListBuilder { + return new(ClusterCredentialsListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterCredentialsListBuilder) Items(values ...*ClusterCredentialsBuilder) *ClusterCredentialsListBuilder { + b.items = make([]*ClusterCredentialsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterCredentialsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterCredentialsListBuilder) Copy(list *ClusterCredentialsList) *ClusterCredentialsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterCredentialsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterCredentials().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_credentials' objects using the +// configuration stored in the builder. +func (b *ClusterCredentialsListBuilder) Build() (list *ClusterCredentialsList, err error) { + items := make([]*ClusterCredentials, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterCredentialsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_credentials_list_type_json.go b/clustersmgmt/v2alpha1/cluster_credentials_list_type_json.go new file mode 100644 index 00000000..fc1c1a5d --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_credentials_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterCredentialsList writes a list of values of the 'cluster_credentials' type to +// the given writer. +func MarshalClusterCredentialsList(list []*ClusterCredentials, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterCredentialsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterCredentialsList writes a list of value of the 'cluster_credentials' type to +// the given stream. +func writeClusterCredentialsList(list []*ClusterCredentials, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterCredentials(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterCredentialsList reads a list of values of the 'cluster_credentials' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterCredentialsList(source interface{}) (items []*ClusterCredentials, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterCredentialsList(iterator) + err = iterator.Error + return +} + +// readClusterCredentialsList reads list of values of the ”cluster_credentials' type from +// the given iterator. +func readClusterCredentialsList(iterator *jsoniter.Iterator) []*ClusterCredentials { + list := []*ClusterCredentials{} + for iterator.ReadArray() { + item := readClusterCredentials(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_credentials_type.go b/clustersmgmt/v2alpha1/cluster_credentials_type.go new file mode 100644 index 00000000..c2fa1914 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_credentials_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterCredentialsKind is the name of the type used to represent objects +// of type 'cluster_credentials'. +const ClusterCredentialsKind = "ClusterCredentials" + +// ClusterCredentialsLinkKind is the name of the type used to represent links +// to objects of type 'cluster_credentials'. +const ClusterCredentialsLinkKind = "ClusterCredentialsLink" + +// ClusterCredentialsNilKind is the name of the type used to nil references +// to objects of type 'cluster_credentials'. +const ClusterCredentialsNilKind = "ClusterCredentialsNil" + +// ClusterCredentials represents the values of the 'cluster_credentials' type. +// +// Credentials of the a cluster. +type ClusterCredentials struct { + bitmap_ uint32 + id string + href string + kubeconfig string +} + +// Kind returns the name of the type of the object. +func (o *ClusterCredentials) Kind() string { + if o == nil { + return ClusterCredentialsNilKind + } + if o.bitmap_&1 != 0 { + return ClusterCredentialsLinkKind + } + return ClusterCredentialsKind +} + +// Link returns true iif this is a link. +func (o *ClusterCredentials) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ClusterCredentials) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ClusterCredentials) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ClusterCredentials) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ClusterCredentials) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterCredentials) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Kubeconfig returns the value of the 'kubeconfig' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Administrator _kubeconfig_ file for the cluster. +func (o *ClusterCredentials) Kubeconfig() string { + if o != nil && o.bitmap_&8 != 0 { + return o.kubeconfig + } + return "" +} + +// GetKubeconfig returns the value of the 'kubeconfig' attribute and +// a flag indicating if the attribute has a value. +// +// Administrator _kubeconfig_ file for the cluster. +func (o *ClusterCredentials) GetKubeconfig() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.kubeconfig + } + return +} + +// ClusterCredentialsListKind is the name of the type used to represent list of objects of +// type 'cluster_credentials'. +const ClusterCredentialsListKind = "ClusterCredentialsList" + +// ClusterCredentialsListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_credentials'. +const ClusterCredentialsListLinkKind = "ClusterCredentialsListLink" + +// ClusterCredentialsNilKind is the name of the type used to nil lists of objects of +// type 'cluster_credentials'. +const ClusterCredentialsListNilKind = "ClusterCredentialsListNil" + +// ClusterCredentialsList is a list of values of the 'cluster_credentials' type. +type ClusterCredentialsList struct { + href string + link bool + items []*ClusterCredentials +} + +// Kind returns the name of the type of the object. +func (l *ClusterCredentialsList) Kind() string { + if l == nil { + return ClusterCredentialsListNilKind + } + if l.link { + return ClusterCredentialsListLinkKind + } + return ClusterCredentialsListKind +} + +// Link returns true iif this is a link. +func (l *ClusterCredentialsList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ClusterCredentialsList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ClusterCredentialsList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ClusterCredentialsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterCredentialsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterCredentialsList) Get(i int) *ClusterCredentials { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterCredentialsList) Slice() []*ClusterCredentials { + var slice []*ClusterCredentials + if l == nil { + slice = make([]*ClusterCredentials, 0) + } else { + slice = make([]*ClusterCredentials, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterCredentialsList) Each(f func(item *ClusterCredentials) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterCredentialsList) Range(f func(index int, item *ClusterCredentials) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_credentials_type_json.go b/clustersmgmt/v2alpha1/cluster_credentials_type_json.go new file mode 100644 index 00000000..9007ec87 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_credentials_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterCredentials writes a value of the 'cluster_credentials' type to the given writer. +func MarshalClusterCredentials(object *ClusterCredentials, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterCredentials(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterCredentials writes a value of the 'cluster_credentials' type to the given stream. +func writeClusterCredentials(object *ClusterCredentials, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ClusterCredentialsLinkKind) + } else { + stream.WriteString(ClusterCredentialsKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kubeconfig") + stream.WriteString(object.kubeconfig) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterCredentials reads a value of the 'cluster_credentials' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterCredentials(source interface{}) (object *ClusterCredentials, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterCredentials(iterator) + err = iterator.Error + return +} + +// readClusterCredentials reads a value of the 'cluster_credentials' type from the given iterator. +func readClusterCredentials(iterator *jsoniter.Iterator) *ClusterCredentials { + object := &ClusterCredentials{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ClusterCredentialsLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "kubeconfig": + value := iterator.ReadString() + object.kubeconfig = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_deployment_builder.go b/clustersmgmt/v2alpha1/cluster_deployment_builder.go new file mode 100644 index 00000000..75d59bec --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_deployment_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterDeploymentBuilder contains the data and logic needed to build 'cluster_deployment' objects. +// +// Representation of a clusterdeployment. +type ClusterDeploymentBuilder struct { + bitmap_ uint32 + id string + href string + content interface{} +} + +// NewClusterDeployment creates a new builder of 'cluster_deployment' objects. +func NewClusterDeployment() *ClusterDeploymentBuilder { + return &ClusterDeploymentBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ClusterDeploymentBuilder) Link(value bool) *ClusterDeploymentBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ClusterDeploymentBuilder) ID(value string) *ClusterDeploymentBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ClusterDeploymentBuilder) HREF(value string) *ClusterDeploymentBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterDeploymentBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Content sets the value of the 'content' attribute to the given value. +func (b *ClusterDeploymentBuilder) Content(value interface{}) *ClusterDeploymentBuilder { + b.content = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterDeploymentBuilder) Copy(object *ClusterDeployment) *ClusterDeploymentBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.content = object.content + return b +} + +// Build creates a 'cluster_deployment' object using the configuration stored in the builder. +func (b *ClusterDeploymentBuilder) Build() (object *ClusterDeployment, err error) { + object = new(ClusterDeployment) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.content = b.content + return +} diff --git a/clustersmgmt/v2alpha1/cluster_deployment_list_builder.go b/clustersmgmt/v2alpha1/cluster_deployment_list_builder.go new file mode 100644 index 00000000..9c35c662 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_deployment_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterDeploymentListBuilder contains the data and logic needed to build +// 'cluster_deployment' objects. +type ClusterDeploymentListBuilder struct { + items []*ClusterDeploymentBuilder +} + +// NewClusterDeploymentList creates a new builder of 'cluster_deployment' objects. +func NewClusterDeploymentList() *ClusterDeploymentListBuilder { + return new(ClusterDeploymentListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterDeploymentListBuilder) Items(values ...*ClusterDeploymentBuilder) *ClusterDeploymentListBuilder { + b.items = make([]*ClusterDeploymentBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterDeploymentListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterDeploymentListBuilder) Copy(list *ClusterDeploymentList) *ClusterDeploymentListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterDeploymentBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterDeployment().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_deployment' objects using the +// configuration stored in the builder. +func (b *ClusterDeploymentListBuilder) Build() (list *ClusterDeploymentList, err error) { + items := make([]*ClusterDeployment, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterDeploymentList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_deployment_list_type_json.go b/clustersmgmt/v2alpha1/cluster_deployment_list_type_json.go new file mode 100644 index 00000000..3eafb3bf --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_deployment_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterDeploymentList writes a list of values of the 'cluster_deployment' type to +// the given writer. +func MarshalClusterDeploymentList(list []*ClusterDeployment, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterDeploymentList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterDeploymentList writes a list of value of the 'cluster_deployment' type to +// the given stream. +func writeClusterDeploymentList(list []*ClusterDeployment, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterDeployment(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterDeploymentList reads a list of values of the 'cluster_deployment' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterDeploymentList(source interface{}) (items []*ClusterDeployment, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterDeploymentList(iterator) + err = iterator.Error + return +} + +// readClusterDeploymentList reads list of values of the ”cluster_deployment' type from +// the given iterator. +func readClusterDeploymentList(iterator *jsoniter.Iterator) []*ClusterDeployment { + list := []*ClusterDeployment{} + for iterator.ReadArray() { + item := readClusterDeployment(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_deployment_type.go b/clustersmgmt/v2alpha1/cluster_deployment_type.go new file mode 100644 index 00000000..5bceb295 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_deployment_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterDeploymentKind is the name of the type used to represent objects +// of type 'cluster_deployment'. +const ClusterDeploymentKind = "ClusterDeployment" + +// ClusterDeploymentLinkKind is the name of the type used to represent links +// to objects of type 'cluster_deployment'. +const ClusterDeploymentLinkKind = "ClusterDeploymentLink" + +// ClusterDeploymentNilKind is the name of the type used to nil references +// to objects of type 'cluster_deployment'. +const ClusterDeploymentNilKind = "ClusterDeploymentNil" + +// ClusterDeployment represents the values of the 'cluster_deployment' type. +// +// Representation of a clusterdeployment. +type ClusterDeployment struct { + bitmap_ uint32 + id string + href string + content interface{} +} + +// Kind returns the name of the type of the object. +func (o *ClusterDeployment) Kind() string { + if o == nil { + return ClusterDeploymentNilKind + } + if o.bitmap_&1 != 0 { + return ClusterDeploymentLinkKind + } + return ClusterDeploymentKind +} + +// Link returns true iif this is a link. +func (o *ClusterDeployment) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ClusterDeployment) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ClusterDeployment) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ClusterDeployment) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ClusterDeployment) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterDeployment) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Content returns the value of the 'content' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Content of the clusterdeployment. +func (o *ClusterDeployment) Content() interface{} { + if o != nil && o.bitmap_&8 != 0 { + return o.content + } + return nil +} + +// GetContent returns the value of the 'content' attribute and +// a flag indicating if the attribute has a value. +// +// Content of the clusterdeployment. +func (o *ClusterDeployment) GetContent() (value interface{}, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.content + } + return +} + +// ClusterDeploymentListKind is the name of the type used to represent list of objects of +// type 'cluster_deployment'. +const ClusterDeploymentListKind = "ClusterDeploymentList" + +// ClusterDeploymentListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_deployment'. +const ClusterDeploymentListLinkKind = "ClusterDeploymentListLink" + +// ClusterDeploymentNilKind is the name of the type used to nil lists of objects of +// type 'cluster_deployment'. +const ClusterDeploymentListNilKind = "ClusterDeploymentListNil" + +// ClusterDeploymentList is a list of values of the 'cluster_deployment' type. +type ClusterDeploymentList struct { + href string + link bool + items []*ClusterDeployment +} + +// Kind returns the name of the type of the object. +func (l *ClusterDeploymentList) Kind() string { + if l == nil { + return ClusterDeploymentListNilKind + } + if l.link { + return ClusterDeploymentListLinkKind + } + return ClusterDeploymentListKind +} + +// Link returns true iif this is a link. +func (l *ClusterDeploymentList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ClusterDeploymentList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ClusterDeploymentList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ClusterDeploymentList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterDeploymentList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterDeploymentList) Get(i int) *ClusterDeployment { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterDeploymentList) Slice() []*ClusterDeployment { + var slice []*ClusterDeployment + if l == nil { + slice = make([]*ClusterDeployment, 0) + } else { + slice = make([]*ClusterDeployment, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterDeploymentList) Each(f func(item *ClusterDeployment) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterDeploymentList) Range(f func(index int, item *ClusterDeployment) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_deployment_type_json.go b/clustersmgmt/v2alpha1/cluster_deployment_type_json.go new file mode 100644 index 00000000..d70cbfa3 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_deployment_type_json.go @@ -0,0 +1,121 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterDeployment writes a value of the 'cluster_deployment' type to the given writer. +func MarshalClusterDeployment(object *ClusterDeployment, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterDeployment(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterDeployment writes a value of the 'cluster_deployment' type to the given stream. +func writeClusterDeployment(object *ClusterDeployment, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ClusterDeploymentLinkKind) + } else { + stream.WriteString(ClusterDeploymentKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("content") + stream.WriteVal(object.content) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterDeployment reads a value of the 'cluster_deployment' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterDeployment(source interface{}) (object *ClusterDeployment, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterDeployment(iterator) + err = iterator.Error + return +} + +// readClusterDeployment reads a value of the 'cluster_deployment' type from the given iterator. +func readClusterDeployment(iterator *jsoniter.Iterator) *ClusterDeployment { + object := &ClusterDeployment{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ClusterDeploymentLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "content": + var value interface{} + iterator.ReadVal(&value) + object.content = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_health_state_list_type_json.go b/clustersmgmt/v2alpha1/cluster_health_state_list_type_json.go new file mode 100644 index 00000000..bca5f0f6 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_health_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterHealthStateList writes a list of values of the 'cluster_health_state' type to +// the given writer. +func MarshalClusterHealthStateList(list []ClusterHealthState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterHealthStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterHealthStateList writes a list of value of the 'cluster_health_state' type to +// the given stream. +func writeClusterHealthStateList(list []ClusterHealthState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterHealthStateList reads a list of values of the 'cluster_health_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterHealthStateList(source interface{}) (items []ClusterHealthState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterHealthStateList(iterator) + err = iterator.Error + return +} + +// readClusterHealthStateList reads list of values of the ”cluster_health_state' type from +// the given iterator. +func readClusterHealthStateList(iterator *jsoniter.Iterator) []ClusterHealthState { + list := []ClusterHealthState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ClusterHealthState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_health_state_type.go b/clustersmgmt/v2alpha1/cluster_health_state_type.go new file mode 100644 index 00000000..8dc41610 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_health_state_type.go @@ -0,0 +1,32 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterHealthState represents the values of the 'cluster_health_state' enumerated type. +type ClusterHealthState string + +const ( + // Cluster is Ready and healthy. + ClusterHealthStateHealthy ClusterHealthState = "healthy" + // Cluster is Ready and unhealthy. + ClusterHealthStateUnhealthy ClusterHealthState = "unhealthy" + // Cluster health is unknown. + ClusterHealthStateUnknown ClusterHealthState = "unknown" +) diff --git a/clustersmgmt/v2alpha1/cluster_link_builder.go b/clustersmgmt/v2alpha1/cluster_link_builder.go new file mode 100644 index 00000000..8e30027c --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_link_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterLinkBuilder contains the data and logic needed to build 'cluster_link' objects. +// +// Definition of a cluster link. +type ClusterLinkBuilder struct { + bitmap_ uint32 + href string + id string +} + +// NewClusterLink creates a new builder of 'cluster_link' objects. +func NewClusterLink() *ClusterLinkBuilder { + return &ClusterLinkBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterLinkBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// HREF sets the value of the 'HREF' attribute to the given value. +func (b *ClusterLinkBuilder) HREF(value string) *ClusterLinkBuilder { + b.href = value + b.bitmap_ |= 1 + return b +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *ClusterLinkBuilder) ID(value string) *ClusterLinkBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterLinkBuilder) Copy(object *ClusterLink) *ClusterLinkBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.href = object.href + b.id = object.id + return b +} + +// Build creates a 'cluster_link' object using the configuration stored in the builder. +func (b *ClusterLinkBuilder) Build() (object *ClusterLink, err error) { + object = new(ClusterLink) + object.bitmap_ = b.bitmap_ + object.href = b.href + object.id = b.id + return +} diff --git a/clustersmgmt/v2alpha1/cluster_link_list_builder.go b/clustersmgmt/v2alpha1/cluster_link_list_builder.go new file mode 100644 index 00000000..54ebf8c1 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_link_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterLinkListBuilder contains the data and logic needed to build +// 'cluster_link' objects. +type ClusterLinkListBuilder struct { + items []*ClusterLinkBuilder +} + +// NewClusterLinkList creates a new builder of 'cluster_link' objects. +func NewClusterLinkList() *ClusterLinkListBuilder { + return new(ClusterLinkListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterLinkListBuilder) Items(values ...*ClusterLinkBuilder) *ClusterLinkListBuilder { + b.items = make([]*ClusterLinkBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterLinkListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterLinkListBuilder) Copy(list *ClusterLinkList) *ClusterLinkListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterLinkBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterLink().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_link' objects using the +// configuration stored in the builder. +func (b *ClusterLinkListBuilder) Build() (list *ClusterLinkList, err error) { + items := make([]*ClusterLink, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterLinkList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_link_list_type_json.go b/clustersmgmt/v2alpha1/cluster_link_list_type_json.go new file mode 100644 index 00000000..466e3e68 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_link_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterLinkList writes a list of values of the 'cluster_link' type to +// the given writer. +func MarshalClusterLinkList(list []*ClusterLink, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterLinkList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterLinkList writes a list of value of the 'cluster_link' type to +// the given stream. +func writeClusterLinkList(list []*ClusterLink, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterLink(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterLinkList reads a list of values of the 'cluster_link' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterLinkList(source interface{}) (items []*ClusterLink, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterLinkList(iterator) + err = iterator.Error + return +} + +// readClusterLinkList reads list of values of the ”cluster_link' type from +// the given iterator. +func readClusterLinkList(iterator *jsoniter.Iterator) []*ClusterLink { + list := []*ClusterLink{} + for iterator.ReadArray() { + item := readClusterLink(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_link_type.go b/clustersmgmt/v2alpha1/cluster_link_type.go new file mode 100644 index 00000000..563387a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_link_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterLink represents the values of the 'cluster_link' type. +// +// Definition of a cluster link. +type ClusterLink struct { + bitmap_ uint32 + href string + id string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterLink) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// HREF returns the value of the 'HREF' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HREF for the cluster, filled in response. +func (o *ClusterLink) HREF() string { + if o != nil && o.bitmap_&1 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the value of the 'HREF' attribute and +// a flag indicating if the attribute has a value. +// +// HREF for the cluster, filled in response. +func (o *ClusterLink) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.href + } + return +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The cluster's ID. +func (o *ClusterLink) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// The cluster's ID. +func (o *ClusterLink) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// ClusterLinkListKind is the name of the type used to represent list of objects of +// type 'cluster_link'. +const ClusterLinkListKind = "ClusterLinkList" + +// ClusterLinkListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_link'. +const ClusterLinkListLinkKind = "ClusterLinkListLink" + +// ClusterLinkNilKind is the name of the type used to nil lists of objects of +// type 'cluster_link'. +const ClusterLinkListNilKind = "ClusterLinkListNil" + +// ClusterLinkList is a list of values of the 'cluster_link' type. +type ClusterLinkList struct { + href string + link bool + items []*ClusterLink +} + +// Len returns the length of the list. +func (l *ClusterLinkList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterLinkList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterLinkList) Get(i int) *ClusterLink { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterLinkList) Slice() []*ClusterLink { + var slice []*ClusterLink + if l == nil { + slice = make([]*ClusterLink, 0) + } else { + slice = make([]*ClusterLink, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterLinkList) Each(f func(item *ClusterLink) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterLinkList) Range(f func(index int, item *ClusterLink) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_link_type_json.go b/clustersmgmt/v2alpha1/cluster_link_type_json.go new file mode 100644 index 00000000..b0952662 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_link_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterLink writes a value of the 'cluster_link' type to the given writer. +func MarshalClusterLink(object *ClusterLink, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterLink(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterLink writes a value of the 'cluster_link' type to the given stream. +func writeClusterLink(object *ClusterLink, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterLink reads a value of the 'cluster_link' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterLink(source interface{}) (object *ClusterLink, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterLink(iterator) + err = iterator.Error + return +} + +// readClusterLink reads a value of the 'cluster_link' type from the given iterator. +func readClusterLink(iterator *jsoniter.Iterator) *ClusterLink { + object := &ClusterLink{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "href": + value := iterator.ReadString() + object.href = value + object.bitmap_ |= 1 + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_list_builder.go b/clustersmgmt/v2alpha1/cluster_list_builder.go new file mode 100644 index 00000000..42bb6b79 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterListBuilder contains the data and logic needed to build +// 'cluster' objects. +type ClusterListBuilder struct { + items []*ClusterBuilder +} + +// NewClusterList creates a new builder of 'cluster' objects. +func NewClusterList() *ClusterListBuilder { + return new(ClusterListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterListBuilder) Items(values ...*ClusterBuilder) *ClusterListBuilder { + b.items = make([]*ClusterBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterListBuilder) Copy(list *ClusterList) *ClusterListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCluster().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster' objects using the +// configuration stored in the builder. +func (b *ClusterListBuilder) Build() (list *ClusterList, err error) { + items := make([]*Cluster, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_list_type_json.go b/clustersmgmt/v2alpha1/cluster_list_type_json.go new file mode 100644 index 00000000..0252aa5e --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterList writes a list of values of the 'cluster' type to +// the given writer. +func MarshalClusterList(list []*Cluster, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterList writes a list of value of the 'cluster' type to +// the given stream. +func writeClusterList(list []*Cluster, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCluster(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterList reads a list of values of the 'cluster' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterList(source interface{}) (items []*Cluster, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterList(iterator) + err = iterator.Error + return +} + +// readClusterList reads list of values of the ”cluster' type from +// the given iterator. +func readClusterList(iterator *jsoniter.Iterator) []*Cluster { + list := []*Cluster{} + for iterator.ReadArray() { + item := readCluster(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_nodes_builder.go b/clustersmgmt/v2alpha1/cluster_nodes_builder.go new file mode 100644 index 00000000..38e11d92 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_nodes_builder.go @@ -0,0 +1,289 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterNodesBuilder contains the data and logic needed to build 'cluster_nodes' objects. +// +// Counts of different classes of nodes inside a cluster. +type ClusterNodesBuilder struct { + bitmap_ uint32 + autoscaleCompute *MachinePoolAutoscalingBuilder + availabilityZones []string + compute int + computeLabels map[string]string + computeMachineType *MachineTypeBuilder + computeRootVolume *RootVolumeBuilder + infra int + infraMachineType *MachineTypeBuilder + master int + masterMachineType *MachineTypeBuilder + securityGroupFilters []*MachinePoolSecurityGroupFilterBuilder + total int +} + +// NewClusterNodes creates a new builder of 'cluster_nodes' objects. +func NewClusterNodes() *ClusterNodesBuilder { + return &ClusterNodesBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterNodesBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AutoscaleCompute sets the value of the 'autoscale_compute' attribute to the given value. +// +// Representation of a autoscaling in a machine pool. +func (b *ClusterNodesBuilder) AutoscaleCompute(value *MachinePoolAutoscalingBuilder) *ClusterNodesBuilder { + b.autoscaleCompute = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// AvailabilityZones sets the value of the 'availability_zones' attribute to the given values. +func (b *ClusterNodesBuilder) AvailabilityZones(values ...string) *ClusterNodesBuilder { + b.availabilityZones = make([]string, len(values)) + copy(b.availabilityZones, values) + b.bitmap_ |= 2 + return b +} + +// Compute sets the value of the 'compute' attribute to the given value. +func (b *ClusterNodesBuilder) Compute(value int) *ClusterNodesBuilder { + b.compute = value + b.bitmap_ |= 4 + return b +} + +// ComputeLabels sets the value of the 'compute_labels' attribute to the given value. +func (b *ClusterNodesBuilder) ComputeLabels(value map[string]string) *ClusterNodesBuilder { + b.computeLabels = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// ComputeMachineType sets the value of the 'compute_machine_type' attribute to the given value. +// +// Machine type. +func (b *ClusterNodesBuilder) ComputeMachineType(value *MachineTypeBuilder) *ClusterNodesBuilder { + b.computeMachineType = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// ComputeRootVolume sets the value of the 'compute_root_volume' attribute to the given value. +// +// Root volume capabilities. +func (b *ClusterNodesBuilder) ComputeRootVolume(value *RootVolumeBuilder) *ClusterNodesBuilder { + b.computeRootVolume = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Infra sets the value of the 'infra' attribute to the given value. +func (b *ClusterNodesBuilder) Infra(value int) *ClusterNodesBuilder { + b.infra = value + b.bitmap_ |= 64 + return b +} + +// InfraMachineType sets the value of the 'infra_machine_type' attribute to the given value. +// +// Machine type. +func (b *ClusterNodesBuilder) InfraMachineType(value *MachineTypeBuilder) *ClusterNodesBuilder { + b.infraMachineType = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// Master sets the value of the 'master' attribute to the given value. +func (b *ClusterNodesBuilder) Master(value int) *ClusterNodesBuilder { + b.master = value + b.bitmap_ |= 256 + return b +} + +// MasterMachineType sets the value of the 'master_machine_type' attribute to the given value. +// +// Machine type. +func (b *ClusterNodesBuilder) MasterMachineType(value *MachineTypeBuilder) *ClusterNodesBuilder { + b.masterMachineType = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// SecurityGroupFilters sets the value of the 'security_group_filters' attribute to the given values. +func (b *ClusterNodesBuilder) SecurityGroupFilters(values ...*MachinePoolSecurityGroupFilterBuilder) *ClusterNodesBuilder { + b.securityGroupFilters = make([]*MachinePoolSecurityGroupFilterBuilder, len(values)) + copy(b.securityGroupFilters, values) + b.bitmap_ |= 1024 + return b +} + +// Total sets the value of the 'total' attribute to the given value. +func (b *ClusterNodesBuilder) Total(value int) *ClusterNodesBuilder { + b.total = value + b.bitmap_ |= 2048 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterNodesBuilder) Copy(object *ClusterNodes) *ClusterNodesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.autoscaleCompute != nil { + b.autoscaleCompute = NewMachinePoolAutoscaling().Copy(object.autoscaleCompute) + } else { + b.autoscaleCompute = nil + } + if object.availabilityZones != nil { + b.availabilityZones = make([]string, len(object.availabilityZones)) + copy(b.availabilityZones, object.availabilityZones) + } else { + b.availabilityZones = nil + } + b.compute = object.compute + if len(object.computeLabels) > 0 { + b.computeLabels = map[string]string{} + for k, v := range object.computeLabels { + b.computeLabels[k] = v + } + } else { + b.computeLabels = nil + } + if object.computeMachineType != nil { + b.computeMachineType = NewMachineType().Copy(object.computeMachineType) + } else { + b.computeMachineType = nil + } + if object.computeRootVolume != nil { + b.computeRootVolume = NewRootVolume().Copy(object.computeRootVolume) + } else { + b.computeRootVolume = nil + } + b.infra = object.infra + if object.infraMachineType != nil { + b.infraMachineType = NewMachineType().Copy(object.infraMachineType) + } else { + b.infraMachineType = nil + } + b.master = object.master + if object.masterMachineType != nil { + b.masterMachineType = NewMachineType().Copy(object.masterMachineType) + } else { + b.masterMachineType = nil + } + if object.securityGroupFilters != nil { + b.securityGroupFilters = make([]*MachinePoolSecurityGroupFilterBuilder, len(object.securityGroupFilters)) + for i, v := range object.securityGroupFilters { + b.securityGroupFilters[i] = NewMachinePoolSecurityGroupFilter().Copy(v) + } + } else { + b.securityGroupFilters = nil + } + b.total = object.total + return b +} + +// Build creates a 'cluster_nodes' object using the configuration stored in the builder. +func (b *ClusterNodesBuilder) Build() (object *ClusterNodes, err error) { + object = new(ClusterNodes) + object.bitmap_ = b.bitmap_ + if b.autoscaleCompute != nil { + object.autoscaleCompute, err = b.autoscaleCompute.Build() + if err != nil { + return + } + } + if b.availabilityZones != nil { + object.availabilityZones = make([]string, len(b.availabilityZones)) + copy(object.availabilityZones, b.availabilityZones) + } + object.compute = b.compute + if b.computeLabels != nil { + object.computeLabels = make(map[string]string) + for k, v := range b.computeLabels { + object.computeLabels[k] = v + } + } + if b.computeMachineType != nil { + object.computeMachineType, err = b.computeMachineType.Build() + if err != nil { + return + } + } + if b.computeRootVolume != nil { + object.computeRootVolume, err = b.computeRootVolume.Build() + if err != nil { + return + } + } + object.infra = b.infra + if b.infraMachineType != nil { + object.infraMachineType, err = b.infraMachineType.Build() + if err != nil { + return + } + } + object.master = b.master + if b.masterMachineType != nil { + object.masterMachineType, err = b.masterMachineType.Build() + if err != nil { + return + } + } + if b.securityGroupFilters != nil { + object.securityGroupFilters = make([]*MachinePoolSecurityGroupFilter, len(b.securityGroupFilters)) + for i, v := range b.securityGroupFilters { + object.securityGroupFilters[i], err = v.Build() + if err != nil { + return + } + } + } + object.total = b.total + return +} diff --git a/clustersmgmt/v2alpha1/cluster_nodes_list_builder.go b/clustersmgmt/v2alpha1/cluster_nodes_list_builder.go new file mode 100644 index 00000000..31858fc6 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_nodes_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterNodesListBuilder contains the data and logic needed to build +// 'cluster_nodes' objects. +type ClusterNodesListBuilder struct { + items []*ClusterNodesBuilder +} + +// NewClusterNodesList creates a new builder of 'cluster_nodes' objects. +func NewClusterNodesList() *ClusterNodesListBuilder { + return new(ClusterNodesListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterNodesListBuilder) Items(values ...*ClusterNodesBuilder) *ClusterNodesListBuilder { + b.items = make([]*ClusterNodesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterNodesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterNodesListBuilder) Copy(list *ClusterNodesList) *ClusterNodesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterNodesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterNodes().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_nodes' objects using the +// configuration stored in the builder. +func (b *ClusterNodesListBuilder) Build() (list *ClusterNodesList, err error) { + items := make([]*ClusterNodes, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterNodesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_nodes_list_type_json.go b/clustersmgmt/v2alpha1/cluster_nodes_list_type_json.go new file mode 100644 index 00000000..b5d34947 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_nodes_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterNodesList writes a list of values of the 'cluster_nodes' type to +// the given writer. +func MarshalClusterNodesList(list []*ClusterNodes, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterNodesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterNodesList writes a list of value of the 'cluster_nodes' type to +// the given stream. +func writeClusterNodesList(list []*ClusterNodes, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterNodes(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterNodesList reads a list of values of the 'cluster_nodes' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterNodesList(source interface{}) (items []*ClusterNodes, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterNodesList(iterator) + err = iterator.Error + return +} + +// readClusterNodesList reads list of values of the ”cluster_nodes' type from +// the given iterator. +func readClusterNodesList(iterator *jsoniter.Iterator) []*ClusterNodes { + list := []*ClusterNodes{} + for iterator.ReadArray() { + item := readClusterNodes(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_nodes_type.go b/clustersmgmt/v2alpha1/cluster_nodes_type.go new file mode 100644 index 00000000..72bda819 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_nodes_type.go @@ -0,0 +1,410 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterNodes represents the values of the 'cluster_nodes' type. +// +// Counts of different classes of nodes inside a cluster. +type ClusterNodes struct { + bitmap_ uint32 + autoscaleCompute *MachinePoolAutoscaling + availabilityZones []string + compute int + computeLabels map[string]string + computeMachineType *MachineType + computeRootVolume *RootVolume + infra int + infraMachineType *MachineType + master int + masterMachineType *MachineType + securityGroupFilters []*MachinePoolSecurityGroupFilter + total int +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterNodes) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AutoscaleCompute returns the value of the 'autoscale_compute' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for auto-scaling the compute machine pool. +// Compute and AutoscaleCompute cannot be used together. +func (o *ClusterNodes) AutoscaleCompute() *MachinePoolAutoscaling { + if o != nil && o.bitmap_&1 != 0 { + return o.autoscaleCompute + } + return nil +} + +// GetAutoscaleCompute returns the value of the 'autoscale_compute' attribute and +// a flag indicating if the attribute has a value. +// +// Details for auto-scaling the compute machine pool. +// Compute and AutoscaleCompute cannot be used together. +func (o *ClusterNodes) GetAutoscaleCompute() (value *MachinePoolAutoscaling, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.autoscaleCompute + } + return +} + +// AvailabilityZones returns the value of the 'availability_zones' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The availability zones upon which the nodes are created. +func (o *ClusterNodes) AvailabilityZones() []string { + if o != nil && o.bitmap_&2 != 0 { + return o.availabilityZones + } + return nil +} + +// GetAvailabilityZones returns the value of the 'availability_zones' attribute and +// a flag indicating if the attribute has a value. +// +// The availability zones upon which the nodes are created. +func (o *ClusterNodes) GetAvailabilityZones() (value []string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.availabilityZones + } + return +} + +// Compute returns the value of the 'compute' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Number of compute nodes of the cluster. +// Compute and AutoscaleCompute cannot be used together. +func (o *ClusterNodes) Compute() int { + if o != nil && o.bitmap_&4 != 0 { + return o.compute + } + return 0 +} + +// GetCompute returns the value of the 'compute' attribute and +// a flag indicating if the attribute has a value. +// +// Number of compute nodes of the cluster. +// Compute and AutoscaleCompute cannot be used together. +func (o *ClusterNodes) GetCompute() (value int, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.compute + } + return +} + +// ComputeLabels returns the value of the 'compute_labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The labels set on the "default" compute machine pool. +func (o *ClusterNodes) ComputeLabels() map[string]string { + if o != nil && o.bitmap_&8 != 0 { + return o.computeLabels + } + return nil +} + +// GetComputeLabels returns the value of the 'compute_labels' attribute and +// a flag indicating if the attribute has a value. +// +// The labels set on the "default" compute machine pool. +func (o *ClusterNodes) GetComputeLabels() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.computeLabels + } + return +} + +// ComputeMachineType returns the value of the 'compute_machine_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The compute machine type to use, for example `r5.xlarge`. +func (o *ClusterNodes) ComputeMachineType() *MachineType { + if o != nil && o.bitmap_&16 != 0 { + return o.computeMachineType + } + return nil +} + +// GetComputeMachineType returns the value of the 'compute_machine_type' attribute and +// a flag indicating if the attribute has a value. +// +// The compute machine type to use, for example `r5.xlarge`. +func (o *ClusterNodes) GetComputeMachineType() (value *MachineType, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.computeMachineType + } + return +} + +// ComputeRootVolume returns the value of the 'compute_root_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The compute machine root volume capabilities. +func (o *ClusterNodes) ComputeRootVolume() *RootVolume { + if o != nil && o.bitmap_&32 != 0 { + return o.computeRootVolume + } + return nil +} + +// GetComputeRootVolume returns the value of the 'compute_root_volume' attribute and +// a flag indicating if the attribute has a value. +// +// The compute machine root volume capabilities. +func (o *ClusterNodes) GetComputeRootVolume() (value *RootVolume, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.computeRootVolume + } + return +} + +// Infra returns the value of the 'infra' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Number of infrastructure nodes of the cluster. +func (o *ClusterNodes) Infra() int { + if o != nil && o.bitmap_&64 != 0 { + return o.infra + } + return 0 +} + +// GetInfra returns the value of the 'infra' attribute and +// a flag indicating if the attribute has a value. +// +// Number of infrastructure nodes of the cluster. +func (o *ClusterNodes) GetInfra() (value int, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.infra + } + return +} + +// InfraMachineType returns the value of the 'infra_machine_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The infra machine type to use, for example `r5.xlarge` (Optional). +func (o *ClusterNodes) InfraMachineType() *MachineType { + if o != nil && o.bitmap_&128 != 0 { + return o.infraMachineType + } + return nil +} + +// GetInfraMachineType returns the value of the 'infra_machine_type' attribute and +// a flag indicating if the attribute has a value. +// +// The infra machine type to use, for example `r5.xlarge` (Optional). +func (o *ClusterNodes) GetInfraMachineType() (value *MachineType, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.infraMachineType + } + return +} + +// Master returns the value of the 'master' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Number of master nodes of the cluster. +func (o *ClusterNodes) Master() int { + if o != nil && o.bitmap_&256 != 0 { + return o.master + } + return 0 +} + +// GetMaster returns the value of the 'master' attribute and +// a flag indicating if the attribute has a value. +// +// Number of master nodes of the cluster. +func (o *ClusterNodes) GetMaster() (value int, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.master + } + return +} + +// MasterMachineType returns the value of the 'master_machine_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The master machine type to use, for example `r5.xlarge` (Optional). +func (o *ClusterNodes) MasterMachineType() *MachineType { + if o != nil && o.bitmap_&512 != 0 { + return o.masterMachineType + } + return nil +} + +// GetMasterMachineType returns the value of the 'master_machine_type' attribute and +// a flag indicating if the attribute has a value. +// +// The master machine type to use, for example `r5.xlarge` (Optional). +func (o *ClusterNodes) GetMasterMachineType() (value *MachineType, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.masterMachineType + } + return +} + +// SecurityGroupFilters returns the value of the 'security_group_filters' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of security groups to be applied to nodes (Optional). +func (o *ClusterNodes) SecurityGroupFilters() []*MachinePoolSecurityGroupFilter { + if o != nil && o.bitmap_&1024 != 0 { + return o.securityGroupFilters + } + return nil +} + +// GetSecurityGroupFilters returns the value of the 'security_group_filters' attribute and +// a flag indicating if the attribute has a value. +// +// List of security groups to be applied to nodes (Optional). +func (o *ClusterNodes) GetSecurityGroupFilters() (value []*MachinePoolSecurityGroupFilter, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.securityGroupFilters + } + return +} + +// Total returns the value of the 'total' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Total number of nodes of the cluster. +func (o *ClusterNodes) Total() int { + if o != nil && o.bitmap_&2048 != 0 { + return o.total + } + return 0 +} + +// GetTotal returns the value of the 'total' attribute and +// a flag indicating if the attribute has a value. +// +// Total number of nodes of the cluster. +func (o *ClusterNodes) GetTotal() (value int, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.total + } + return +} + +// ClusterNodesListKind is the name of the type used to represent list of objects of +// type 'cluster_nodes'. +const ClusterNodesListKind = "ClusterNodesList" + +// ClusterNodesListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_nodes'. +const ClusterNodesListLinkKind = "ClusterNodesListLink" + +// ClusterNodesNilKind is the name of the type used to nil lists of objects of +// type 'cluster_nodes'. +const ClusterNodesListNilKind = "ClusterNodesListNil" + +// ClusterNodesList is a list of values of the 'cluster_nodes' type. +type ClusterNodesList struct { + href string + link bool + items []*ClusterNodes +} + +// Len returns the length of the list. +func (l *ClusterNodesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterNodesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterNodesList) Get(i int) *ClusterNodes { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterNodesList) Slice() []*ClusterNodes { + var slice []*ClusterNodes + if l == nil { + slice = make([]*ClusterNodes, 0) + } else { + slice = make([]*ClusterNodes, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterNodesList) Each(f func(item *ClusterNodes) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterNodesList) Range(f func(index int, item *ClusterNodes) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_nodes_type_json.go b/clustersmgmt/v2alpha1/cluster_nodes_type_json.go new file mode 100644 index 00000000..113892fb --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_nodes_type_json.go @@ -0,0 +1,258 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterNodes writes a value of the 'cluster_nodes' type to the given writer. +func MarshalClusterNodes(object *ClusterNodes, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterNodes(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterNodes writes a value of the 'cluster_nodes' type to the given stream. +func writeClusterNodes(object *ClusterNodes, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.autoscaleCompute != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("autoscale_compute") + writeMachinePoolAutoscaling(object.autoscaleCompute, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.availabilityZones != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zones") + writeStringList(object.availabilityZones, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute") + stream.WriteInt(object.compute) + count++ + } + present_ = object.bitmap_&8 != 0 && object.computeLabels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute_labels") + if object.computeLabels != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.computeLabels)) + i := 0 + for key := range object.computeLabels { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.computeLabels[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&16 != 0 && object.computeMachineType != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute_machine_type") + writeMachineType(object.computeMachineType, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.computeRootVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute_root_volume") + writeRootVolume(object.computeRootVolume, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra") + stream.WriteInt(object.infra) + count++ + } + present_ = object.bitmap_&128 != 0 && object.infraMachineType != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra_machine_type") + writeMachineType(object.infraMachineType, stream) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master") + stream.WriteInt(object.master) + count++ + } + present_ = object.bitmap_&512 != 0 && object.masterMachineType != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master_machine_type") + writeMachineType(object.masterMachineType, stream) + count++ + } + present_ = object.bitmap_&1024 != 0 && object.securityGroupFilters != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("security_group_filters") + writeMachinePoolSecurityGroupFilterList(object.securityGroupFilters, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("total") + stream.WriteInt(object.total) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterNodes reads a value of the 'cluster_nodes' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterNodes(source interface{}) (object *ClusterNodes, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterNodes(iterator) + err = iterator.Error + return +} + +// readClusterNodes reads a value of the 'cluster_nodes' type from the given iterator. +func readClusterNodes(iterator *jsoniter.Iterator) *ClusterNodes { + object := &ClusterNodes{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "autoscale_compute": + value := readMachinePoolAutoscaling(iterator) + object.autoscaleCompute = value + object.bitmap_ |= 1 + case "availability_zones": + value := readStringList(iterator) + object.availabilityZones = value + object.bitmap_ |= 2 + case "compute": + value := iterator.ReadInt() + object.compute = value + object.bitmap_ |= 4 + case "compute_labels": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.computeLabels = value + object.bitmap_ |= 8 + case "compute_machine_type": + value := readMachineType(iterator) + object.computeMachineType = value + object.bitmap_ |= 16 + case "compute_root_volume": + value := readRootVolume(iterator) + object.computeRootVolume = value + object.bitmap_ |= 32 + case "infra": + value := iterator.ReadInt() + object.infra = value + object.bitmap_ |= 64 + case "infra_machine_type": + value := readMachineType(iterator) + object.infraMachineType = value + object.bitmap_ |= 128 + case "master": + value := iterator.ReadInt() + object.master = value + object.bitmap_ |= 256 + case "master_machine_type": + value := readMachineType(iterator) + object.masterMachineType = value + object.bitmap_ |= 512 + case "security_group_filters": + value := readMachinePoolSecurityGroupFilterList(iterator) + object.securityGroupFilters = value + object.bitmap_ |= 1024 + case "total": + value := iterator.ReadInt() + object.total = value + object.bitmap_ |= 2048 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_info_builder.go b/clustersmgmt/v2alpha1/cluster_operator_info_builder.go new file mode 100644 index 00000000..885938ea --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_info_builder.go @@ -0,0 +1,107 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ClusterOperatorInfoBuilder contains the data and logic needed to build 'cluster_operator_info' objects. +type ClusterOperatorInfoBuilder struct { + bitmap_ uint32 + condition ClusterOperatorState + name string + reason string + time time.Time + version string +} + +// NewClusterOperatorInfo creates a new builder of 'cluster_operator_info' objects. +func NewClusterOperatorInfo() *ClusterOperatorInfoBuilder { + return &ClusterOperatorInfoBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterOperatorInfoBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Condition sets the value of the 'condition' attribute to the given value. +// +// Overall state of a cluster operator. +func (b *ClusterOperatorInfoBuilder) Condition(value ClusterOperatorState) *ClusterOperatorInfoBuilder { + b.condition = value + b.bitmap_ |= 1 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *ClusterOperatorInfoBuilder) Name(value string) *ClusterOperatorInfoBuilder { + b.name = value + b.bitmap_ |= 2 + return b +} + +// Reason sets the value of the 'reason' attribute to the given value. +func (b *ClusterOperatorInfoBuilder) Reason(value string) *ClusterOperatorInfoBuilder { + b.reason = value + b.bitmap_ |= 4 + return b +} + +// Time sets the value of the 'time' attribute to the given value. +func (b *ClusterOperatorInfoBuilder) Time(value time.Time) *ClusterOperatorInfoBuilder { + b.time = value + b.bitmap_ |= 8 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +func (b *ClusterOperatorInfoBuilder) Version(value string) *ClusterOperatorInfoBuilder { + b.version = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterOperatorInfoBuilder) Copy(object *ClusterOperatorInfo) *ClusterOperatorInfoBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.condition = object.condition + b.name = object.name + b.reason = object.reason + b.time = object.time + b.version = object.version + return b +} + +// Build creates a 'cluster_operator_info' object using the configuration stored in the builder. +func (b *ClusterOperatorInfoBuilder) Build() (object *ClusterOperatorInfo, err error) { + object = new(ClusterOperatorInfo) + object.bitmap_ = b.bitmap_ + object.condition = b.condition + object.name = b.name + object.reason = b.reason + object.time = b.time + object.version = b.version + return +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_info_list_builder.go b/clustersmgmt/v2alpha1/cluster_operator_info_list_builder.go new file mode 100644 index 00000000..120e5cfe --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_info_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterOperatorInfoListBuilder contains the data and logic needed to build +// 'cluster_operator_info' objects. +type ClusterOperatorInfoListBuilder struct { + items []*ClusterOperatorInfoBuilder +} + +// NewClusterOperatorInfoList creates a new builder of 'cluster_operator_info' objects. +func NewClusterOperatorInfoList() *ClusterOperatorInfoListBuilder { + return new(ClusterOperatorInfoListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterOperatorInfoListBuilder) Items(values ...*ClusterOperatorInfoBuilder) *ClusterOperatorInfoListBuilder { + b.items = make([]*ClusterOperatorInfoBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterOperatorInfoListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterOperatorInfoListBuilder) Copy(list *ClusterOperatorInfoList) *ClusterOperatorInfoListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterOperatorInfoBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterOperatorInfo().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_operator_info' objects using the +// configuration stored in the builder. +func (b *ClusterOperatorInfoListBuilder) Build() (list *ClusterOperatorInfoList, err error) { + items := make([]*ClusterOperatorInfo, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterOperatorInfoList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_info_list_type_json.go b/clustersmgmt/v2alpha1/cluster_operator_info_list_type_json.go new file mode 100644 index 00000000..80f02ed7 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_info_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterOperatorInfoList writes a list of values of the 'cluster_operator_info' type to +// the given writer. +func MarshalClusterOperatorInfoList(list []*ClusterOperatorInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterOperatorInfoList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterOperatorInfoList writes a list of value of the 'cluster_operator_info' type to +// the given stream. +func writeClusterOperatorInfoList(list []*ClusterOperatorInfo, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterOperatorInfo(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterOperatorInfoList reads a list of values of the 'cluster_operator_info' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterOperatorInfoList(source interface{}) (items []*ClusterOperatorInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterOperatorInfoList(iterator) + err = iterator.Error + return +} + +// readClusterOperatorInfoList reads list of values of the ”cluster_operator_info' type from +// the given iterator. +func readClusterOperatorInfoList(iterator *jsoniter.Iterator) []*ClusterOperatorInfo { + list := []*ClusterOperatorInfo{} + for iterator.ReadArray() { + item := readClusterOperatorInfo(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_info_type.go b/clustersmgmt/v2alpha1/cluster_operator_info_type.go new file mode 100644 index 00000000..1f75f7d5 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_info_type.go @@ -0,0 +1,240 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ClusterOperatorInfo represents the values of the 'cluster_operator_info' type. +type ClusterOperatorInfo struct { + bitmap_ uint32 + condition ClusterOperatorState + name string + reason string + time time.Time + version string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterOperatorInfo) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Condition returns the value of the 'condition' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Operator status. Empty string if unknown. +func (o *ClusterOperatorInfo) Condition() ClusterOperatorState { + if o != nil && o.bitmap_&1 != 0 { + return o.condition + } + return ClusterOperatorState("") +} + +// GetCondition returns the value of the 'condition' attribute and +// a flag indicating if the attribute has a value. +// +// Operator status. Empty string if unknown. +func (o *ClusterOperatorInfo) GetCondition() (value ClusterOperatorState, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.condition + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the operator. +func (o *ClusterOperatorInfo) Name() string { + if o != nil && o.bitmap_&2 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the operator. +func (o *ClusterOperatorInfo) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.name + } + return +} + +// Reason returns the value of the 'reason' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Extra detail on condition, if available. Empty string if unknown. +func (o *ClusterOperatorInfo) Reason() string { + if o != nil && o.bitmap_&4 != 0 { + return o.reason + } + return "" +} + +// GetReason returns the value of the 'reason' attribute and +// a flag indicating if the attribute has a value. +// +// Extra detail on condition, if available. Empty string if unknown. +func (o *ClusterOperatorInfo) GetReason() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.reason + } + return +} + +// Time returns the value of the 'time' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Time when the sample was obtained, in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) format. +func (o *ClusterOperatorInfo) Time() time.Time { + if o != nil && o.bitmap_&8 != 0 { + return o.time + } + return time.Time{} +} + +// GetTime returns the value of the 'time' attribute and +// a flag indicating if the attribute has a value. +// +// Time when the sample was obtained, in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) format. +func (o *ClusterOperatorInfo) GetTime() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.time + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Current version of the operator. Empty string if unknown. +func (o *ClusterOperatorInfo) Version() string { + if o != nil && o.bitmap_&16 != 0 { + return o.version + } + return "" +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Current version of the operator. Empty string if unknown. +func (o *ClusterOperatorInfo) GetVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.version + } + return +} + +// ClusterOperatorInfoListKind is the name of the type used to represent list of objects of +// type 'cluster_operator_info'. +const ClusterOperatorInfoListKind = "ClusterOperatorInfoList" + +// ClusterOperatorInfoListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_operator_info'. +const ClusterOperatorInfoListLinkKind = "ClusterOperatorInfoListLink" + +// ClusterOperatorInfoNilKind is the name of the type used to nil lists of objects of +// type 'cluster_operator_info'. +const ClusterOperatorInfoListNilKind = "ClusterOperatorInfoListNil" + +// ClusterOperatorInfoList is a list of values of the 'cluster_operator_info' type. +type ClusterOperatorInfoList struct { + href string + link bool + items []*ClusterOperatorInfo +} + +// Len returns the length of the list. +func (l *ClusterOperatorInfoList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterOperatorInfoList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterOperatorInfoList) Get(i int) *ClusterOperatorInfo { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterOperatorInfoList) Slice() []*ClusterOperatorInfo { + var slice []*ClusterOperatorInfo + if l == nil { + slice = make([]*ClusterOperatorInfo, 0) + } else { + slice = make([]*ClusterOperatorInfo, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterOperatorInfoList) Each(f func(item *ClusterOperatorInfo) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterOperatorInfoList) Range(f func(index int, item *ClusterOperatorInfo) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_info_type_json.go b/clustersmgmt/v2alpha1/cluster_operator_info_type_json.go new file mode 100644 index 00000000..1ddaf356 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_info_type_json.go @@ -0,0 +1,144 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterOperatorInfo writes a value of the 'cluster_operator_info' type to the given writer. +func MarshalClusterOperatorInfo(object *ClusterOperatorInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterOperatorInfo(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterOperatorInfo writes a value of the 'cluster_operator_info' type to the given stream. +func writeClusterOperatorInfo(object *ClusterOperatorInfo, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("condition") + stream.WriteString(string(object.condition)) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("reason") + stream.WriteString(object.reason) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("time") + stream.WriteString((object.time).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + stream.WriteString(object.version) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterOperatorInfo reads a value of the 'cluster_operator_info' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterOperatorInfo(source interface{}) (object *ClusterOperatorInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterOperatorInfo(iterator) + err = iterator.Error + return +} + +// readClusterOperatorInfo reads a value of the 'cluster_operator_info' type from the given iterator. +func readClusterOperatorInfo(iterator *jsoniter.Iterator) *ClusterOperatorInfo { + object := &ClusterOperatorInfo{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "condition": + text := iterator.ReadString() + value := ClusterOperatorState(text) + object.condition = value + object.bitmap_ |= 1 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 2 + case "reason": + value := iterator.ReadString() + object.reason = value + object.bitmap_ |= 4 + case "time": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.time = value + object.bitmap_ |= 8 + case "version": + value := iterator.ReadString() + object.version = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_state_list_type_json.go b/clustersmgmt/v2alpha1/cluster_operator_state_list_type_json.go new file mode 100644 index 00000000..14cdb2ad --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterOperatorStateList writes a list of values of the 'cluster_operator_state' type to +// the given writer. +func MarshalClusterOperatorStateList(list []ClusterOperatorState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterOperatorStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterOperatorStateList writes a list of value of the 'cluster_operator_state' type to +// the given stream. +func writeClusterOperatorStateList(list []ClusterOperatorState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterOperatorStateList reads a list of values of the 'cluster_operator_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterOperatorStateList(source interface{}) (items []ClusterOperatorState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterOperatorStateList(iterator) + err = iterator.Error + return +} + +// readClusterOperatorStateList reads list of values of the ”cluster_operator_state' type from +// the given iterator. +func readClusterOperatorStateList(iterator *jsoniter.Iterator) []ClusterOperatorState { + list := []ClusterOperatorState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ClusterOperatorState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_operator_state_type.go b/clustersmgmt/v2alpha1/cluster_operator_state_type.go new file mode 100644 index 00000000..4c16cd23 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operator_state_type.go @@ -0,0 +1,34 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterOperatorState represents the values of the 'cluster_operator_state' enumerated type. +type ClusterOperatorState string + +const ( + // Operator is working normally. + ClusterOperatorStateAvailable ClusterOperatorState = "available" + // Operator is partially working, there is an issue. + ClusterOperatorStateDegraded ClusterOperatorState = "degraded" + // Operator is not running or not working. + ClusterOperatorStateFailing ClusterOperatorState = "failing" + // Operator is upgrading to newer version, possibly degraded until upgrade completes. + ClusterOperatorStateUpgrading ClusterOperatorState = "upgrading" +) diff --git a/clustersmgmt/v2alpha1/cluster_operators_info_builder.go b/clustersmgmt/v2alpha1/cluster_operators_info_builder.go new file mode 100644 index 00000000..1aaf1111 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_info_builder.go @@ -0,0 +1,79 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterOperatorsInfoBuilder contains the data and logic needed to build 'cluster_operators_info' objects. +// +// Provides detailed information about the operators installed on the cluster. +type ClusterOperatorsInfoBuilder struct { + bitmap_ uint32 + operators []*ClusterOperatorInfoBuilder +} + +// NewClusterOperatorsInfo creates a new builder of 'cluster_operators_info' objects. +func NewClusterOperatorsInfo() *ClusterOperatorsInfoBuilder { + return &ClusterOperatorsInfoBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterOperatorsInfoBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Operators sets the value of the 'operators' attribute to the given values. +func (b *ClusterOperatorsInfoBuilder) Operators(values ...*ClusterOperatorInfoBuilder) *ClusterOperatorsInfoBuilder { + b.operators = make([]*ClusterOperatorInfoBuilder, len(values)) + copy(b.operators, values) + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterOperatorsInfoBuilder) Copy(object *ClusterOperatorsInfo) *ClusterOperatorsInfoBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.operators != nil { + b.operators = make([]*ClusterOperatorInfoBuilder, len(object.operators)) + for i, v := range object.operators { + b.operators[i] = NewClusterOperatorInfo().Copy(v) + } + } else { + b.operators = nil + } + return b +} + +// Build creates a 'cluster_operators_info' object using the configuration stored in the builder. +func (b *ClusterOperatorsInfoBuilder) Build() (object *ClusterOperatorsInfo, err error) { + object = new(ClusterOperatorsInfo) + object.bitmap_ = b.bitmap_ + if b.operators != nil { + object.operators = make([]*ClusterOperatorInfo, len(b.operators)) + for i, v := range b.operators { + object.operators[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_operators_info_list_builder.go b/clustersmgmt/v2alpha1/cluster_operators_info_list_builder.go new file mode 100644 index 00000000..5d80e7e2 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_info_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterOperatorsInfoListBuilder contains the data and logic needed to build +// 'cluster_operators_info' objects. +type ClusterOperatorsInfoListBuilder struct { + items []*ClusterOperatorsInfoBuilder +} + +// NewClusterOperatorsInfoList creates a new builder of 'cluster_operators_info' objects. +func NewClusterOperatorsInfoList() *ClusterOperatorsInfoListBuilder { + return new(ClusterOperatorsInfoListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterOperatorsInfoListBuilder) Items(values ...*ClusterOperatorsInfoBuilder) *ClusterOperatorsInfoListBuilder { + b.items = make([]*ClusterOperatorsInfoBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterOperatorsInfoListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterOperatorsInfoListBuilder) Copy(list *ClusterOperatorsInfoList) *ClusterOperatorsInfoListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterOperatorsInfoBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterOperatorsInfo().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_operators_info' objects using the +// configuration stored in the builder. +func (b *ClusterOperatorsInfoListBuilder) Build() (list *ClusterOperatorsInfoList, err error) { + items := make([]*ClusterOperatorsInfo, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterOperatorsInfoList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_operators_info_list_type_json.go b/clustersmgmt/v2alpha1/cluster_operators_info_list_type_json.go new file mode 100644 index 00000000..94e5181a --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_info_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterOperatorsInfoList writes a list of values of the 'cluster_operators_info' type to +// the given writer. +func MarshalClusterOperatorsInfoList(list []*ClusterOperatorsInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterOperatorsInfoList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterOperatorsInfoList writes a list of value of the 'cluster_operators_info' type to +// the given stream. +func writeClusterOperatorsInfoList(list []*ClusterOperatorsInfo, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterOperatorsInfo(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterOperatorsInfoList reads a list of values of the 'cluster_operators_info' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterOperatorsInfoList(source interface{}) (items []*ClusterOperatorsInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterOperatorsInfoList(iterator) + err = iterator.Error + return +} + +// readClusterOperatorsInfoList reads list of values of the ”cluster_operators_info' type from +// the given iterator. +func readClusterOperatorsInfoList(iterator *jsoniter.Iterator) []*ClusterOperatorsInfo { + list := []*ClusterOperatorsInfo{} + for iterator.ReadArray() { + item := readClusterOperatorsInfo(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_operators_info_type.go b/clustersmgmt/v2alpha1/cluster_operators_info_type.go new file mode 100644 index 00000000..c961e3a1 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_info_type.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterOperatorsInfo represents the values of the 'cluster_operators_info' type. +// +// Provides detailed information about the operators installed on the cluster. +type ClusterOperatorsInfo struct { + bitmap_ uint32 + operators []*ClusterOperatorInfo +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterOperatorsInfo) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Operators returns the value of the 'operators' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *ClusterOperatorsInfo) Operators() []*ClusterOperatorInfo { + if o != nil && o.bitmap_&1 != 0 { + return o.operators + } + return nil +} + +// GetOperators returns the value of the 'operators' attribute and +// a flag indicating if the attribute has a value. +func (o *ClusterOperatorsInfo) GetOperators() (value []*ClusterOperatorInfo, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.operators + } + return +} + +// ClusterOperatorsInfoListKind is the name of the type used to represent list of objects of +// type 'cluster_operators_info'. +const ClusterOperatorsInfoListKind = "ClusterOperatorsInfoList" + +// ClusterOperatorsInfoListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_operators_info'. +const ClusterOperatorsInfoListLinkKind = "ClusterOperatorsInfoListLink" + +// ClusterOperatorsInfoNilKind is the name of the type used to nil lists of objects of +// type 'cluster_operators_info'. +const ClusterOperatorsInfoListNilKind = "ClusterOperatorsInfoListNil" + +// ClusterOperatorsInfoList is a list of values of the 'cluster_operators_info' type. +type ClusterOperatorsInfoList struct { + href string + link bool + items []*ClusterOperatorsInfo +} + +// Len returns the length of the list. +func (l *ClusterOperatorsInfoList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterOperatorsInfoList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterOperatorsInfoList) Get(i int) *ClusterOperatorsInfo { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterOperatorsInfoList) Slice() []*ClusterOperatorsInfo { + var slice []*ClusterOperatorsInfo + if l == nil { + slice = make([]*ClusterOperatorsInfo, 0) + } else { + slice = make([]*ClusterOperatorsInfo, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterOperatorsInfoList) Each(f func(item *ClusterOperatorsInfo) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterOperatorsInfoList) Range(f func(index int, item *ClusterOperatorsInfo) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_operators_info_type_json.go b/clustersmgmt/v2alpha1/cluster_operators_info_type_json.go new file mode 100644 index 00000000..9e12064f --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_info_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterOperatorsInfo writes a value of the 'cluster_operators_info' type to the given writer. +func MarshalClusterOperatorsInfo(object *ClusterOperatorsInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterOperatorsInfo(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterOperatorsInfo writes a value of the 'cluster_operators_info' type to the given stream. +func writeClusterOperatorsInfo(object *ClusterOperatorsInfo, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.operators != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operators") + writeClusterOperatorInfoList(object.operators, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterOperatorsInfo reads a value of the 'cluster_operators_info' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterOperatorsInfo(source interface{}) (object *ClusterOperatorsInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterOperatorsInfo(iterator) + err = iterator.Error + return +} + +// readClusterOperatorsInfo reads a value of the 'cluster_operators_info' type from the given iterator. +func readClusterOperatorsInfo(iterator *jsoniter.Iterator) *ClusterOperatorsInfo { + object := &ClusterOperatorsInfo{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "operators": + value := readClusterOperatorInfoList(iterator) + object.operators = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_operators_metric_query_client.go b/clustersmgmt/v2alpha1/cluster_operators_metric_query_client.go new file mode 100644 index 00000000..4896f763 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_metric_query_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ClusterOperatorsMetricQueryClient is the client of the 'cluster_operators_metric_query' resource. +// +// Provides detailed information about the Metrics of the Cluster +type ClusterOperatorsMetricQueryClient struct { + transport http.RoundTripper + path string +} + +// NewClusterOperatorsMetricQueryClient creates a new client for the 'cluster_operators_metric_query' +// resource using the given transport to send the requests and receive the +// responses. +func NewClusterOperatorsMetricQueryClient(transport http.RoundTripper, path string) *ClusterOperatorsMetricQueryClient { + return &ClusterOperatorsMetricQueryClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *ClusterOperatorsMetricQueryClient) Get() *ClusterOperatorsMetricQueryGetRequest { + return &ClusterOperatorsMetricQueryGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// ClusterOperatorsMetricQueryPollRequest is the request for the Poll method. +type ClusterOperatorsMetricQueryPollRequest struct { + request *ClusterOperatorsMetricQueryGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ClusterOperatorsMetricQueryPollRequest) Parameter(name string, value interface{}) *ClusterOperatorsMetricQueryPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ClusterOperatorsMetricQueryPollRequest) Header(name string, value interface{}) *ClusterOperatorsMetricQueryPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ClusterOperatorsMetricQueryPollRequest) Interval(value time.Duration) *ClusterOperatorsMetricQueryPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ClusterOperatorsMetricQueryPollRequest) Status(value int) *ClusterOperatorsMetricQueryPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ClusterOperatorsMetricQueryPollRequest) Predicate(value func(*ClusterOperatorsMetricQueryGetResponse) bool) *ClusterOperatorsMetricQueryPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ClusterOperatorsMetricQueryGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ClusterOperatorsMetricQueryPollRequest) StartContext(ctx context.Context) (response *ClusterOperatorsMetricQueryPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ClusterOperatorsMetricQueryPollResponse{ + response: result.(*ClusterOperatorsMetricQueryGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ClusterOperatorsMetricQueryPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ClusterOperatorsMetricQueryPollResponse is the response for the Poll method. +type ClusterOperatorsMetricQueryPollResponse struct { + response *ClusterOperatorsMetricQueryGetResponse +} + +// Status returns the response status code. +func (r *ClusterOperatorsMetricQueryPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ClusterOperatorsMetricQueryPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ClusterOperatorsMetricQueryPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterOperatorsMetricQueryPollResponse) Body() *ClusterOperatorsInfo { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterOperatorsMetricQueryPollResponse) GetBody() (value *ClusterOperatorsInfo, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ClusterOperatorsMetricQueryClient) Poll() *ClusterOperatorsMetricQueryPollRequest { + return &ClusterOperatorsMetricQueryPollRequest{ + request: c.Get(), + } +} + +// ClusterOperatorsMetricQueryGetRequest is the request for the 'get' method. +type ClusterOperatorsMetricQueryGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterOperatorsMetricQueryGetRequest) Parameter(name string, value interface{}) *ClusterOperatorsMetricQueryGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterOperatorsMetricQueryGetRequest) Header(name string, value interface{}) *ClusterOperatorsMetricQueryGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterOperatorsMetricQueryGetRequest) Impersonate(user string) *ClusterOperatorsMetricQueryGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterOperatorsMetricQueryGetRequest) Send() (result *ClusterOperatorsMetricQueryGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterOperatorsMetricQueryGetRequest) SendContext(ctx context.Context) (result *ClusterOperatorsMetricQueryGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterOperatorsMetricQueryGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClusterOperatorsMetricQueryGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ClusterOperatorsMetricQueryGetResponse is the response for the 'get' method. +type ClusterOperatorsMetricQueryGetResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterOperatorsInfo +} + +// Status returns the response status code. +func (r *ClusterOperatorsMetricQueryGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterOperatorsMetricQueryGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterOperatorsMetricQueryGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterOperatorsMetricQueryGetResponse) Body() *ClusterOperatorsInfo { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterOperatorsMetricQueryGetResponse) GetBody() (value *ClusterOperatorsInfo, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_operators_metric_query_resource_json.go b/clustersmgmt/v2alpha1/cluster_operators_metric_query_resource_json.go new file mode 100644 index 00000000..63e9dcc2 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_operators_metric_query_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeClusterOperatorsMetricQueryGetRequest(request *ClusterOperatorsMetricQueryGetRequest, writer io.Writer) error { + return nil +} +func readClusterOperatorsMetricQueryGetResponse(response *ClusterOperatorsMetricQueryGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterOperatorsInfo(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cluster_registration_builder.go b/clustersmgmt/v2alpha1/cluster_registration_builder.go new file mode 100644 index 00000000..5a7595cb --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_registration_builder.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterRegistrationBuilder contains the data and logic needed to build 'cluster_registration' objects. +// +// Registration of a new cluster to the service. +// +// For example, to register a cluster that has been provisioned outside +// of this service, send a a request like this: +// +// ```http +// POST /api/clusters_mgmt/v1/register_cluster HTTP/1.1 +// ``` +// +// With a request body like this: +// +// ```json +// +// { +// "external_id": "d656aecf-11a6-4782-ad86-8f72638449ba", +// "subscription_id": "...", +// "organization_id": "..." +// } +// +// ``` +type ClusterRegistrationBuilder struct { + bitmap_ uint32 + consoleUrl string + externalID string + organizationID string + subscriptionID string +} + +// NewClusterRegistration creates a new builder of 'cluster_registration' objects. +func NewClusterRegistration() *ClusterRegistrationBuilder { + return &ClusterRegistrationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterRegistrationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ConsoleUrl sets the value of the 'console_url' attribute to the given value. +func (b *ClusterRegistrationBuilder) ConsoleUrl(value string) *ClusterRegistrationBuilder { + b.consoleUrl = value + b.bitmap_ |= 1 + return b +} + +// ExternalID sets the value of the 'external_ID' attribute to the given value. +func (b *ClusterRegistrationBuilder) ExternalID(value string) *ClusterRegistrationBuilder { + b.externalID = value + b.bitmap_ |= 2 + return b +} + +// OrganizationID sets the value of the 'organization_ID' attribute to the given value. +func (b *ClusterRegistrationBuilder) OrganizationID(value string) *ClusterRegistrationBuilder { + b.organizationID = value + b.bitmap_ |= 4 + return b +} + +// SubscriptionID sets the value of the 'subscription_ID' attribute to the given value. +func (b *ClusterRegistrationBuilder) SubscriptionID(value string) *ClusterRegistrationBuilder { + b.subscriptionID = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterRegistrationBuilder) Copy(object *ClusterRegistration) *ClusterRegistrationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.consoleUrl = object.consoleUrl + b.externalID = object.externalID + b.organizationID = object.organizationID + b.subscriptionID = object.subscriptionID + return b +} + +// Build creates a 'cluster_registration' object using the configuration stored in the builder. +func (b *ClusterRegistrationBuilder) Build() (object *ClusterRegistration, err error) { + object = new(ClusterRegistration) + object.bitmap_ = b.bitmap_ + object.consoleUrl = b.consoleUrl + object.externalID = b.externalID + object.organizationID = b.organizationID + object.subscriptionID = b.subscriptionID + return +} diff --git a/clustersmgmt/v2alpha1/cluster_registration_list_builder.go b/clustersmgmt/v2alpha1/cluster_registration_list_builder.go new file mode 100644 index 00000000..3a91e57b --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_registration_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterRegistrationListBuilder contains the data and logic needed to build +// 'cluster_registration' objects. +type ClusterRegistrationListBuilder struct { + items []*ClusterRegistrationBuilder +} + +// NewClusterRegistrationList creates a new builder of 'cluster_registration' objects. +func NewClusterRegistrationList() *ClusterRegistrationListBuilder { + return new(ClusterRegistrationListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterRegistrationListBuilder) Items(values ...*ClusterRegistrationBuilder) *ClusterRegistrationListBuilder { + b.items = make([]*ClusterRegistrationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterRegistrationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterRegistrationListBuilder) Copy(list *ClusterRegistrationList) *ClusterRegistrationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterRegistrationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterRegistration().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_registration' objects using the +// configuration stored in the builder. +func (b *ClusterRegistrationListBuilder) Build() (list *ClusterRegistrationList, err error) { + items := make([]*ClusterRegistration, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterRegistrationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_registration_list_type_json.go b/clustersmgmt/v2alpha1/cluster_registration_list_type_json.go new file mode 100644 index 00000000..0368b863 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_registration_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterRegistrationList writes a list of values of the 'cluster_registration' type to +// the given writer. +func MarshalClusterRegistrationList(list []*ClusterRegistration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterRegistrationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterRegistrationList writes a list of value of the 'cluster_registration' type to +// the given stream. +func writeClusterRegistrationList(list []*ClusterRegistration, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterRegistration(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterRegistrationList reads a list of values of the 'cluster_registration' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterRegistrationList(source interface{}) (items []*ClusterRegistration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterRegistrationList(iterator) + err = iterator.Error + return +} + +// readClusterRegistrationList reads list of values of the ”cluster_registration' type from +// the given iterator. +func readClusterRegistrationList(iterator *jsoniter.Iterator) []*ClusterRegistration { + list := []*ClusterRegistration{} + for iterator.ReadArray() { + item := readClusterRegistration(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_registration_type.go b/clustersmgmt/v2alpha1/cluster_registration_type.go new file mode 100644 index 00000000..67aea04a --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_registration_type.go @@ -0,0 +1,237 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterRegistration represents the values of the 'cluster_registration' type. +// +// Registration of a new cluster to the service. +// +// For example, to register a cluster that has been provisioned outside +// of this service, send a a request like this: +// +// ```http +// POST /api/clusters_mgmt/v1/register_cluster HTTP/1.1 +// ``` +// +// With a request body like this: +// +// ```json +// +// { +// "external_id": "d656aecf-11a6-4782-ad86-8f72638449ba", +// "subscription_id": "...", +// "organization_id": "..." +// } +// +// ``` +type ClusterRegistration struct { + bitmap_ uint32 + consoleUrl string + externalID string + organizationID string + subscriptionID string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterRegistration) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ConsoleUrl returns the value of the 'console_url' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional Console URL of the cluster. +func (o *ClusterRegistration) ConsoleUrl() string { + if o != nil && o.bitmap_&1 != 0 { + return o.consoleUrl + } + return "" +} + +// GetConsoleUrl returns the value of the 'console_url' attribute and +// a flag indicating if the attribute has a value. +// +// Optional Console URL of the cluster. +func (o *ClusterRegistration) GetConsoleUrl() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.consoleUrl + } + return +} + +// ExternalID returns the value of the 'external_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Identifier of the cluster generated by the installer. +func (o *ClusterRegistration) ExternalID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.externalID + } + return "" +} + +// GetExternalID returns the value of the 'external_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Identifier of the cluster generated by the installer. +func (o *ClusterRegistration) GetExternalID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.externalID + } + return +} + +// OrganizationID returns the value of the 'organization_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Organization identifier of the cluster generated by the +// account manager. +func (o *ClusterRegistration) OrganizationID() string { + if o != nil && o.bitmap_&4 != 0 { + return o.organizationID + } + return "" +} + +// GetOrganizationID returns the value of the 'organization_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Organization identifier of the cluster generated by the +// account manager. +func (o *ClusterRegistration) GetOrganizationID() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.organizationID + } + return +} + +// SubscriptionID returns the value of the 'subscription_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Subscription identifier of the cluster generated by the account +// manager. +func (o *ClusterRegistration) SubscriptionID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.subscriptionID + } + return "" +} + +// GetSubscriptionID returns the value of the 'subscription_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Subscription identifier of the cluster generated by the account +// manager. +func (o *ClusterRegistration) GetSubscriptionID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.subscriptionID + } + return +} + +// ClusterRegistrationListKind is the name of the type used to represent list of objects of +// type 'cluster_registration'. +const ClusterRegistrationListKind = "ClusterRegistrationList" + +// ClusterRegistrationListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_registration'. +const ClusterRegistrationListLinkKind = "ClusterRegistrationListLink" + +// ClusterRegistrationNilKind is the name of the type used to nil lists of objects of +// type 'cluster_registration'. +const ClusterRegistrationListNilKind = "ClusterRegistrationListNil" + +// ClusterRegistrationList is a list of values of the 'cluster_registration' type. +type ClusterRegistrationList struct { + href string + link bool + items []*ClusterRegistration +} + +// Len returns the length of the list. +func (l *ClusterRegistrationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterRegistrationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterRegistrationList) Get(i int) *ClusterRegistration { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterRegistrationList) Slice() []*ClusterRegistration { + var slice []*ClusterRegistration + if l == nil { + slice = make([]*ClusterRegistration, 0) + } else { + slice = make([]*ClusterRegistration, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterRegistrationList) Each(f func(item *ClusterRegistration) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterRegistrationList) Range(f func(index int, item *ClusterRegistration) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_registration_type_json.go b/clustersmgmt/v2alpha1/cluster_registration_type_json.go new file mode 100644 index 00000000..ff7dd8e3 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_registration_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterRegistration writes a value of the 'cluster_registration' type to the given writer. +func MarshalClusterRegistration(object *ClusterRegistration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterRegistration(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterRegistration writes a value of the 'cluster_registration' type to the given stream. +func writeClusterRegistration(object *ClusterRegistration, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("console_url") + stream.WriteString(object.consoleUrl) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("external_id") + stream.WriteString(object.externalID) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("organization_id") + stream.WriteString(object.organizationID) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subscription_id") + stream.WriteString(object.subscriptionID) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterRegistration reads a value of the 'cluster_registration' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterRegistration(source interface{}) (object *ClusterRegistration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterRegistration(iterator) + err = iterator.Error + return +} + +// readClusterRegistration reads a value of the 'cluster_registration' type from the given iterator. +func readClusterRegistration(iterator *jsoniter.Iterator) *ClusterRegistration { + object := &ClusterRegistration{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "console_url": + value := iterator.ReadString() + object.consoleUrl = value + object.bitmap_ |= 1 + case "external_id": + value := iterator.ReadString() + object.externalID = value + object.bitmap_ |= 2 + case "organization_id": + value := iterator.ReadString() + object.organizationID = value + object.bitmap_ |= 4 + case "subscription_id": + value := iterator.ReadString() + object.subscriptionID = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_resource_json.go b/clustersmgmt/v2alpha1/cluster_resource_json.go new file mode 100644 index 00000000..fa7bd84e --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resource_json.go @@ -0,0 +1,57 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeClusterDeleteRequest(request *ClusterDeleteRequest, writer io.Writer) error { + return nil +} +func readClusterDeleteResponse(response *ClusterDeleteResponse, reader io.Reader) error { + return nil +} +func writeClusterGetRequest(request *ClusterGetRequest, writer io.Writer) error { + return nil +} +func readClusterGetResponse(response *ClusterGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCluster(reader) + return err +} +func writeClusterHibernateRequest(request *ClusterHibernateRequest, writer io.Writer) error { + return nil +} +func readClusterHibernateResponse(response *ClusterHibernateResponse, reader io.Reader) error { + return nil +} +func writeClusterResumeRequest(request *ClusterResumeRequest, writer io.Writer) error { + return nil +} +func readClusterResumeResponse(response *ClusterResumeResponse, reader io.Reader) error { + return nil +} +func writeClusterUpdateRequest(request *ClusterUpdateRequest, writer io.Writer) error { + return MarshalCluster(request.body, writer) +} +func readClusterUpdateResponse(response *ClusterUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCluster(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_builder.go b/clustersmgmt/v2alpha1/cluster_resources_builder.go new file mode 100644 index 00000000..25462088 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_builder.go @@ -0,0 +1,129 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ClusterResourcesBuilder contains the data and logic needed to build 'cluster_resources' objects. +// +// Cluster Resource which belongs to a cluster, example Cluster Deployment. +type ClusterResourcesBuilder struct { + bitmap_ uint32 + id string + href string + clusterID string + creationTimestamp time.Time + resources map[string]string +} + +// NewClusterResources creates a new builder of 'cluster_resources' objects. +func NewClusterResources() *ClusterResourcesBuilder { + return &ClusterResourcesBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ClusterResourcesBuilder) Link(value bool) *ClusterResourcesBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ClusterResourcesBuilder) ID(value string) *ClusterResourcesBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ClusterResourcesBuilder) HREF(value string) *ClusterResourcesBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterResourcesBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ClusterID sets the value of the 'cluster_ID' attribute to the given value. +func (b *ClusterResourcesBuilder) ClusterID(value string) *ClusterResourcesBuilder { + b.clusterID = value + b.bitmap_ |= 8 + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *ClusterResourcesBuilder) CreationTimestamp(value time.Time) *ClusterResourcesBuilder { + b.creationTimestamp = value + b.bitmap_ |= 16 + return b +} + +// Resources sets the value of the 'resources' attribute to the given value. +func (b *ClusterResourcesBuilder) Resources(value map[string]string) *ClusterResourcesBuilder { + b.resources = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterResourcesBuilder) Copy(object *ClusterResources) *ClusterResourcesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.clusterID = object.clusterID + b.creationTimestamp = object.creationTimestamp + if len(object.resources) > 0 { + b.resources = map[string]string{} + for k, v := range object.resources { + b.resources[k] = v + } + } else { + b.resources = nil + } + return b +} + +// Build creates a 'cluster_resources' object using the configuration stored in the builder. +func (b *ClusterResourcesBuilder) Build() (object *ClusterResources, err error) { + object = new(ClusterResources) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.clusterID = b.clusterID + object.creationTimestamp = b.creationTimestamp + if b.resources != nil { + object.resources = make(map[string]string) + for k, v := range b.resources { + object.resources[k] = v + } + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_client.go b/clustersmgmt/v2alpha1/cluster_resources_client.go new file mode 100644 index 00000000..c2d8d49c --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_client.go @@ -0,0 +1,315 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ClusterResourcesClient is the client of the 'cluster_resources' resource. +// +// Manages currently available cluster resources +type ClusterResourcesClient struct { + transport http.RoundTripper + path string +} + +// NewClusterResourcesClient creates a new client for the 'cluster_resources' +// resource using the given transport to send the requests and receive the +// responses. +func NewClusterResourcesClient(transport http.RoundTripper, path string) *ClusterResourcesClient { + return &ClusterResourcesClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves currently available cluster resources +func (c *ClusterResourcesClient) Get() *ClusterResourcesGetRequest { + return &ClusterResourcesGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// ClusterResourcesPollRequest is the request for the Poll method. +type ClusterResourcesPollRequest struct { + request *ClusterResourcesGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ClusterResourcesPollRequest) Parameter(name string, value interface{}) *ClusterResourcesPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ClusterResourcesPollRequest) Header(name string, value interface{}) *ClusterResourcesPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ClusterResourcesPollRequest) Interval(value time.Duration) *ClusterResourcesPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ClusterResourcesPollRequest) Status(value int) *ClusterResourcesPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ClusterResourcesPollRequest) Predicate(value func(*ClusterResourcesGetResponse) bool) *ClusterResourcesPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ClusterResourcesGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ClusterResourcesPollRequest) StartContext(ctx context.Context) (response *ClusterResourcesPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ClusterResourcesPollResponse{ + response: result.(*ClusterResourcesGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ClusterResourcesPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ClusterResourcesPollResponse is the response for the Poll method. +type ClusterResourcesPollResponse struct { + response *ClusterResourcesGetResponse +} + +// Status returns the response status code. +func (r *ClusterResourcesPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ClusterResourcesPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ClusterResourcesPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +// +// List of cluster resources +func (r *ClusterResourcesPollResponse) Body() *ClusterResources { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// List of cluster resources +func (r *ClusterResourcesPollResponse) GetBody() (value *ClusterResources, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ClusterResourcesClient) Poll() *ClusterResourcesPollRequest { + return &ClusterResourcesPollRequest{ + request: c.Get(), + } +} + +// ClusterResourcesGetRequest is the request for the 'get' method. +type ClusterResourcesGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterResourcesGetRequest) Parameter(name string, value interface{}) *ClusterResourcesGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterResourcesGetRequest) Header(name string, value interface{}) *ClusterResourcesGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterResourcesGetRequest) Impersonate(user string) *ClusterResourcesGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterResourcesGetRequest) Send() (result *ClusterResourcesGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterResourcesGetRequest) SendContext(ctx context.Context) (result *ClusterResourcesGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterResourcesGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClusterResourcesGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ClusterResourcesGetResponse is the response for the 'get' method. +type ClusterResourcesGetResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterResources +} + +// Status returns the response status code. +func (r *ClusterResourcesGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterResourcesGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterResourcesGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// List of cluster resources +func (r *ClusterResourcesGetResponse) Body() *ClusterResources { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// List of cluster resources +func (r *ClusterResourcesGetResponse) GetBody() (value *ClusterResources, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_list_builder.go b/clustersmgmt/v2alpha1/cluster_resources_list_builder.go new file mode 100644 index 00000000..876c21dd --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterResourcesListBuilder contains the data and logic needed to build +// 'cluster_resources' objects. +type ClusterResourcesListBuilder struct { + items []*ClusterResourcesBuilder +} + +// NewClusterResourcesList creates a new builder of 'cluster_resources' objects. +func NewClusterResourcesList() *ClusterResourcesListBuilder { + return new(ClusterResourcesListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterResourcesListBuilder) Items(values ...*ClusterResourcesBuilder) *ClusterResourcesListBuilder { + b.items = make([]*ClusterResourcesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterResourcesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterResourcesListBuilder) Copy(list *ClusterResourcesList) *ClusterResourcesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterResourcesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterResources().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_resources' objects using the +// configuration stored in the builder. +func (b *ClusterResourcesListBuilder) Build() (list *ClusterResourcesList, err error) { + items := make([]*ClusterResources, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterResourcesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_list_type_json.go b/clustersmgmt/v2alpha1/cluster_resources_list_type_json.go new file mode 100644 index 00000000..68df926d --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterResourcesList writes a list of values of the 'cluster_resources' type to +// the given writer. +func MarshalClusterResourcesList(list []*ClusterResources, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterResourcesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterResourcesList writes a list of value of the 'cluster_resources' type to +// the given stream. +func writeClusterResourcesList(list []*ClusterResources, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterResources(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterResourcesList reads a list of values of the 'cluster_resources' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterResourcesList(source interface{}) (items []*ClusterResources, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterResourcesList(iterator) + err = iterator.Error + return +} + +// readClusterResourcesList reads list of values of the ”cluster_resources' type from +// the given iterator. +func readClusterResourcesList(iterator *jsoniter.Iterator) []*ClusterResources { + list := []*ClusterResources{} + for iterator.ReadArray() { + item := readClusterResources(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_resource_json.go b/clustersmgmt/v2alpha1/cluster_resources_resource_json.go new file mode 100644 index 00000000..2f56bccd --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeClusterResourcesGetRequest(request *ClusterResourcesGetRequest, writer io.Writer) error { + return nil +} +func readClusterResourcesGetResponse(response *ClusterResourcesGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterResources(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_type.go b/clustersmgmt/v2alpha1/cluster_resources_type.go new file mode 100644 index 00000000..40e225c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_type.go @@ -0,0 +1,294 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ClusterResourcesKind is the name of the type used to represent objects +// of type 'cluster_resources'. +const ClusterResourcesKind = "ClusterResources" + +// ClusterResourcesLinkKind is the name of the type used to represent links +// to objects of type 'cluster_resources'. +const ClusterResourcesLinkKind = "ClusterResourcesLink" + +// ClusterResourcesNilKind is the name of the type used to nil references +// to objects of type 'cluster_resources'. +const ClusterResourcesNilKind = "ClusterResourcesNil" + +// ClusterResources represents the values of the 'cluster_resources' type. +// +// Cluster Resource which belongs to a cluster, example Cluster Deployment. +type ClusterResources struct { + bitmap_ uint32 + id string + href string + clusterID string + creationTimestamp time.Time + resources map[string]string +} + +// Kind returns the name of the type of the object. +func (o *ClusterResources) Kind() string { + if o == nil { + return ClusterResourcesNilKind + } + if o.bitmap_&1 != 0 { + return ClusterResourcesLinkKind + } + return ClusterResourcesKind +} + +// Link returns true iif this is a link. +func (o *ClusterResources) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ClusterResources) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ClusterResources) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ClusterResources) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ClusterResources) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterResources) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ClusterID returns the value of the 'cluster_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster ID for the fetched resources +func (o *ClusterResources) ClusterID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clusterID + } + return "" +} + +// GetClusterID returns the value of the 'cluster_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster ID for the fetched resources +func (o *ClusterResources) GetClusterID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clusterID + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the resources were fetched. +func (o *ClusterResources) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the resources were fetched. +func (o *ClusterResources) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// Resources returns the value of the 'resources' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Returned map of cluster resources fetched. +func (o *ClusterResources) Resources() map[string]string { + if o != nil && o.bitmap_&32 != 0 { + return o.resources + } + return nil +} + +// GetResources returns the value of the 'resources' attribute and +// a flag indicating if the attribute has a value. +// +// Returned map of cluster resources fetched. +func (o *ClusterResources) GetResources() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.resources + } + return +} + +// ClusterResourcesListKind is the name of the type used to represent list of objects of +// type 'cluster_resources'. +const ClusterResourcesListKind = "ClusterResourcesList" + +// ClusterResourcesListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_resources'. +const ClusterResourcesListLinkKind = "ClusterResourcesListLink" + +// ClusterResourcesNilKind is the name of the type used to nil lists of objects of +// type 'cluster_resources'. +const ClusterResourcesListNilKind = "ClusterResourcesListNil" + +// ClusterResourcesList is a list of values of the 'cluster_resources' type. +type ClusterResourcesList struct { + href string + link bool + items []*ClusterResources +} + +// Kind returns the name of the type of the object. +func (l *ClusterResourcesList) Kind() string { + if l == nil { + return ClusterResourcesListNilKind + } + if l.link { + return ClusterResourcesListLinkKind + } + return ClusterResourcesListKind +} + +// Link returns true iif this is a link. +func (l *ClusterResourcesList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ClusterResourcesList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ClusterResourcesList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ClusterResourcesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterResourcesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterResourcesList) Get(i int) *ClusterResources { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterResourcesList) Slice() []*ClusterResources { + var slice []*ClusterResources + if l == nil { + slice = make([]*ClusterResources, 0) + } else { + slice = make([]*ClusterResources, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterResourcesList) Each(f func(item *ClusterResources) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterResourcesList) Range(f func(index int, item *ClusterResources) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_resources_type_json.go b/clustersmgmt/v2alpha1/cluster_resources_type_json.go new file mode 100644 index 00000000..cb53b43c --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_resources_type_json.go @@ -0,0 +1,180 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterResources writes a value of the 'cluster_resources' type to the given writer. +func MarshalClusterResources(object *ClusterResources, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterResources(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterResources writes a value of the 'cluster_resources' type to the given stream. +func writeClusterResources(object *ClusterResources, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ClusterResourcesLinkKind) + } else { + stream.WriteString(ClusterResourcesKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_id") + stream.WriteString(object.clusterID) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&32 != 0 && object.resources != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resources") + if object.resources != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.resources)) + i := 0 + for key := range object.resources { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.resources[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterResources reads a value of the 'cluster_resources' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterResources(source interface{}) (object *ClusterResources, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterResources(iterator) + err = iterator.Error + return +} + +// readClusterResources reads a value of the 'cluster_resources' type from the given iterator. +func readClusterResources(iterator *jsoniter.Iterator) *ClusterResources { + object := &ClusterResources{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ClusterResourcesLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "cluster_id": + value := iterator.ReadString() + object.clusterID = value + object.bitmap_ |= 8 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 16 + case "resources": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.resources = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_state_list_type_json.go b/clustersmgmt/v2alpha1/cluster_state_list_type_json.go new file mode 100644 index 00000000..8eda9a5d --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterStateList writes a list of values of the 'cluster_state' type to +// the given writer. +func MarshalClusterStateList(list []ClusterState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterStateList writes a list of value of the 'cluster_state' type to +// the given stream. +func writeClusterStateList(list []ClusterState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterStateList reads a list of values of the 'cluster_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterStateList(source interface{}) (items []ClusterState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterStateList(iterator) + err = iterator.Error + return +} + +// readClusterStateList reads list of values of the ”cluster_state' type from +// the given iterator. +func readClusterStateList(iterator *jsoniter.Iterator) []ClusterState { + list := []ClusterState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ClusterState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_state_type.go b/clustersmgmt/v2alpha1/cluster_state_type.go new file mode 100644 index 00000000..b8181594 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_state_type.go @@ -0,0 +1,48 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterState represents the values of the 'cluster_state' enumerated type. +type ClusterState string + +const ( + // Error during installation. + ClusterStateError ClusterState = "error" + // The cluster will consume marginal cloud provider infrastructure but will be counted for quota. + ClusterStateHibernating ClusterState = "hibernating" + // The cluster is still being installed. + ClusterStateInstalling ClusterState = "installing" + // The cluster is pending resources before being provisioned. + ClusterStatePending ClusterState = "pending" + // The cluster is moving from 'Ready' state to 'Hibernating'. + ClusterStatePoweringDown ClusterState = "powering_down" + // The cluster is ready to use. + ClusterStateReady ClusterState = "ready" + // The cluster is moving from 'Hibernating' state to 'Ready'. + ClusterStateResuming ClusterState = "resuming" + // The cluster is being uninstalled. + ClusterStateUninstalling ClusterState = "uninstalling" + // The state of the cluster is unknown. + ClusterStateUnknown ClusterState = "unknown" + // The cluster is validating user input. + ClusterStateValidating ClusterState = "validating" + // The cluster is waiting for user action. + ClusterStateWaiting ClusterState = "waiting" +) diff --git a/clustersmgmt/v2alpha1/cluster_status_builder.go b/clustersmgmt/v2alpha1/cluster_status_builder.go new file mode 100644 index 00000000..36b9154e --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_builder.go @@ -0,0 +1,173 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterStatusBuilder contains the data and logic needed to build 'cluster_status' objects. +// +// Detailed status of a cluster. +type ClusterStatusBuilder struct { + bitmap_ uint32 + id string + href string + configurationMode ClusterConfigurationMode + currentCompute int + description string + limitedSupportReasonCount int + provisionErrorCode string + provisionErrorMessage string + state ClusterState + dnsReady bool + oidcReady bool +} + +// NewClusterStatus creates a new builder of 'cluster_status' objects. +func NewClusterStatus() *ClusterStatusBuilder { + return &ClusterStatusBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ClusterStatusBuilder) Link(value bool) *ClusterStatusBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ClusterStatusBuilder) ID(value string) *ClusterStatusBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ClusterStatusBuilder) HREF(value string) *ClusterStatusBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ClusterStatusBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// DNSReady sets the value of the 'DNS_ready' attribute to the given value. +func (b *ClusterStatusBuilder) DNSReady(value bool) *ClusterStatusBuilder { + b.dnsReady = value + b.bitmap_ |= 8 + return b +} + +// OIDCReady sets the value of the 'OIDC_ready' attribute to the given value. +func (b *ClusterStatusBuilder) OIDCReady(value bool) *ClusterStatusBuilder { + b.oidcReady = value + b.bitmap_ |= 16 + return b +} + +// ConfigurationMode sets the value of the 'configuration_mode' attribute to the given value. +// +// Configuration mode of a cluster. +func (b *ClusterStatusBuilder) ConfigurationMode(value ClusterConfigurationMode) *ClusterStatusBuilder { + b.configurationMode = value + b.bitmap_ |= 32 + return b +} + +// CurrentCompute sets the value of the 'current_compute' attribute to the given value. +func (b *ClusterStatusBuilder) CurrentCompute(value int) *ClusterStatusBuilder { + b.currentCompute = value + b.bitmap_ |= 64 + return b +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *ClusterStatusBuilder) Description(value string) *ClusterStatusBuilder { + b.description = value + b.bitmap_ |= 128 + return b +} + +// LimitedSupportReasonCount sets the value of the 'limited_support_reason_count' attribute to the given value. +func (b *ClusterStatusBuilder) LimitedSupportReasonCount(value int) *ClusterStatusBuilder { + b.limitedSupportReasonCount = value + b.bitmap_ |= 256 + return b +} + +// ProvisionErrorCode sets the value of the 'provision_error_code' attribute to the given value. +func (b *ClusterStatusBuilder) ProvisionErrorCode(value string) *ClusterStatusBuilder { + b.provisionErrorCode = value + b.bitmap_ |= 512 + return b +} + +// ProvisionErrorMessage sets the value of the 'provision_error_message' attribute to the given value. +func (b *ClusterStatusBuilder) ProvisionErrorMessage(value string) *ClusterStatusBuilder { + b.provisionErrorMessage = value + b.bitmap_ |= 1024 + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// Overall state of a cluster. +func (b *ClusterStatusBuilder) State(value ClusterState) *ClusterStatusBuilder { + b.state = value + b.bitmap_ |= 2048 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ClusterStatusBuilder) Copy(object *ClusterStatus) *ClusterStatusBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.dnsReady = object.dnsReady + b.oidcReady = object.oidcReady + b.configurationMode = object.configurationMode + b.currentCompute = object.currentCompute + b.description = object.description + b.limitedSupportReasonCount = object.limitedSupportReasonCount + b.provisionErrorCode = object.provisionErrorCode + b.provisionErrorMessage = object.provisionErrorMessage + b.state = object.state + return b +} + +// Build creates a 'cluster_status' object using the configuration stored in the builder. +func (b *ClusterStatusBuilder) Build() (object *ClusterStatus, err error) { + object = new(ClusterStatus) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.dnsReady = b.dnsReady + object.oidcReady = b.oidcReady + object.configurationMode = b.configurationMode + object.currentCompute = b.currentCompute + object.description = b.description + object.limitedSupportReasonCount = b.limitedSupportReasonCount + object.provisionErrorCode = b.provisionErrorCode + object.provisionErrorMessage = b.provisionErrorMessage + object.state = b.state + return +} diff --git a/clustersmgmt/v2alpha1/cluster_status_client.go b/clustersmgmt/v2alpha1/cluster_status_client.go new file mode 100644 index 00000000..f381ea17 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ClusterStatusClient is the client of the 'cluster_status' resource. +// +// Provides detailed information about the status of an specific cluster. +type ClusterStatusClient struct { + transport http.RoundTripper + path string +} + +// NewClusterStatusClient creates a new client for the 'cluster_status' +// resource using the given transport to send the requests and receive the +// responses. +func NewClusterStatusClient(transport http.RoundTripper, path string) *ClusterStatusClient { + return &ClusterStatusClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *ClusterStatusClient) Get() *ClusterStatusGetRequest { + return &ClusterStatusGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// ClusterStatusPollRequest is the request for the Poll method. +type ClusterStatusPollRequest struct { + request *ClusterStatusGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ClusterStatusPollRequest) Parameter(name string, value interface{}) *ClusterStatusPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ClusterStatusPollRequest) Header(name string, value interface{}) *ClusterStatusPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ClusterStatusPollRequest) Interval(value time.Duration) *ClusterStatusPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ClusterStatusPollRequest) Status(value int) *ClusterStatusPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ClusterStatusPollRequest) Predicate(value func(*ClusterStatusGetResponse) bool) *ClusterStatusPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ClusterStatusGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ClusterStatusPollRequest) StartContext(ctx context.Context) (response *ClusterStatusPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ClusterStatusPollResponse{ + response: result.(*ClusterStatusGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ClusterStatusPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ClusterStatusPollResponse is the response for the Poll method. +type ClusterStatusPollResponse struct { + response *ClusterStatusGetResponse +} + +// Status returns the response status code. +func (r *ClusterStatusPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ClusterStatusPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ClusterStatusPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterStatusPollResponse) Body() *ClusterStatus { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterStatusPollResponse) GetBody() (value *ClusterStatus, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ClusterStatusClient) Poll() *ClusterStatusPollRequest { + return &ClusterStatusPollRequest{ + request: c.Get(), + } +} + +// ClusterStatusGetRequest is the request for the 'get' method. +type ClusterStatusGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterStatusGetRequest) Parameter(name string, value interface{}) *ClusterStatusGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterStatusGetRequest) Header(name string, value interface{}) *ClusterStatusGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterStatusGetRequest) Impersonate(user string) *ClusterStatusGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterStatusGetRequest) Send() (result *ClusterStatusGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterStatusGetRequest) SendContext(ctx context.Context) (result *ClusterStatusGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterStatusGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClusterStatusGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ClusterStatusGetResponse is the response for the 'get' method. +type ClusterStatusGetResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterStatus +} + +// Status returns the response status code. +func (r *ClusterStatusGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterStatusGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterStatusGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ClusterStatusGetResponse) Body() *ClusterStatus { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ClusterStatusGetResponse) GetBody() (value *ClusterStatus, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cluster_status_list_builder.go b/clustersmgmt/v2alpha1/cluster_status_list_builder.go new file mode 100644 index 00000000..b3b95261 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterStatusListBuilder contains the data and logic needed to build +// 'cluster_status' objects. +type ClusterStatusListBuilder struct { + items []*ClusterStatusBuilder +} + +// NewClusterStatusList creates a new builder of 'cluster_status' objects. +func NewClusterStatusList() *ClusterStatusListBuilder { + return new(ClusterStatusListBuilder) +} + +// Items sets the items of the list. +func (b *ClusterStatusListBuilder) Items(values ...*ClusterStatusBuilder) *ClusterStatusListBuilder { + b.items = make([]*ClusterStatusBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ClusterStatusListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ClusterStatusListBuilder) Copy(list *ClusterStatusList) *ClusterStatusListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ClusterStatusBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewClusterStatus().Copy(v) + } + } + return b +} + +// Build creates a list of 'cluster_status' objects using the +// configuration stored in the builder. +func (b *ClusterStatusListBuilder) Build() (list *ClusterStatusList, err error) { + items := make([]*ClusterStatus, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ClusterStatusList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cluster_status_list_type_json.go b/clustersmgmt/v2alpha1/cluster_status_list_type_json.go new file mode 100644 index 00000000..635cef8a --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterStatusList writes a list of values of the 'cluster_status' type to +// the given writer. +func MarshalClusterStatusList(list []*ClusterStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterStatusList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterStatusList writes a list of value of the 'cluster_status' type to +// the given stream. +func writeClusterStatusList(list []*ClusterStatus, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeClusterStatus(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalClusterStatusList reads a list of values of the 'cluster_status' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalClusterStatusList(source interface{}) (items []*ClusterStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readClusterStatusList(iterator) + err = iterator.Error + return +} + +// readClusterStatusList reads list of values of the ”cluster_status' type from +// the given iterator. +func readClusterStatusList(iterator *jsoniter.Iterator) []*ClusterStatus { + list := []*ClusterStatus{} + for iterator.ReadArray() { + item := readClusterStatus(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cluster_status_resource_json.go b/clustersmgmt/v2alpha1/cluster_status_resource_json.go new file mode 100644 index 00000000..e6640a0e --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeClusterStatusGetRequest(request *ClusterStatusGetRequest, writer io.Writer) error { + return nil +} +func readClusterStatusGetResponse(response *ClusterStatusGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterStatus(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cluster_status_type.go b/clustersmgmt/v2alpha1/cluster_status_type.go new file mode 100644 index 00000000..17f46f5b --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_type.go @@ -0,0 +1,434 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ClusterStatusKind is the name of the type used to represent objects +// of type 'cluster_status'. +const ClusterStatusKind = "ClusterStatus" + +// ClusterStatusLinkKind is the name of the type used to represent links +// to objects of type 'cluster_status'. +const ClusterStatusLinkKind = "ClusterStatusLink" + +// ClusterStatusNilKind is the name of the type used to nil references +// to objects of type 'cluster_status'. +const ClusterStatusNilKind = "ClusterStatusNil" + +// ClusterStatus represents the values of the 'cluster_status' type. +// +// Detailed status of a cluster. +type ClusterStatus struct { + bitmap_ uint32 + id string + href string + configurationMode ClusterConfigurationMode + currentCompute int + description string + limitedSupportReasonCount int + provisionErrorCode string + provisionErrorMessage string + state ClusterState + dnsReady bool + oidcReady bool +} + +// Kind returns the name of the type of the object. +func (o *ClusterStatus) Kind() string { + if o == nil { + return ClusterStatusNilKind + } + if o.bitmap_&1 != 0 { + return ClusterStatusLinkKind + } + return ClusterStatusKind +} + +// Link returns true iif this is a link. +func (o *ClusterStatus) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ClusterStatus) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ClusterStatus) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ClusterStatus) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ClusterStatus) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ClusterStatus) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// DNSReady returns the value of the 'DNS_ready' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// DNSReady from Provisioner +func (o *ClusterStatus) DNSReady() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.dnsReady + } + return false +} + +// GetDNSReady returns the value of the 'DNS_ready' attribute and +// a flag indicating if the attribute has a value. +// +// DNSReady from Provisioner +func (o *ClusterStatus) GetDNSReady() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.dnsReady + } + return +} + +// OIDCReady returns the value of the 'OIDC_ready' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// OIDCReady from user configuration. +func (o *ClusterStatus) OIDCReady() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.oidcReady + } + return false +} + +// GetOIDCReady returns the value of the 'OIDC_ready' attribute and +// a flag indicating if the attribute has a value. +// +// OIDCReady from user configuration. +func (o *ClusterStatus) GetOIDCReady() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.oidcReady + } + return +} + +// ConfigurationMode returns the value of the 'configuration_mode' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Configuration mode +func (o *ClusterStatus) ConfigurationMode() ClusterConfigurationMode { + if o != nil && o.bitmap_&32 != 0 { + return o.configurationMode + } + return ClusterConfigurationMode("") +} + +// GetConfigurationMode returns the value of the 'configuration_mode' attribute and +// a flag indicating if the attribute has a value. +// +// Configuration mode +func (o *ClusterStatus) GetConfigurationMode() (value ClusterConfigurationMode, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.configurationMode + } + return +} + +// CurrentCompute returns the value of the 'current_compute' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Current Replicas available for a Hosted Cluster +func (o *ClusterStatus) CurrentCompute() int { + if o != nil && o.bitmap_&64 != 0 { + return o.currentCompute + } + return 0 +} + +// GetCurrentCompute returns the value of the 'current_compute' attribute and +// a flag indicating if the attribute has a value. +// +// Current Replicas available for a Hosted Cluster +func (o *ClusterStatus) GetCurrentCompute() (value int, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.currentCompute + } + return +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Detailed description of the cluster status. +func (o *ClusterStatus) Description() string { + if o != nil && o.bitmap_&128 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Detailed description of the cluster status. +func (o *ClusterStatus) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.description + } + return +} + +// LimitedSupportReasonCount returns the value of the 'limited_support_reason_count' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Limited Support Reason Count +func (o *ClusterStatus) LimitedSupportReasonCount() int { + if o != nil && o.bitmap_&256 != 0 { + return o.limitedSupportReasonCount + } + return 0 +} + +// GetLimitedSupportReasonCount returns the value of the 'limited_support_reason_count' attribute and +// a flag indicating if the attribute has a value. +// +// Limited Support Reason Count +func (o *ClusterStatus) GetLimitedSupportReasonCount() (value int, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.limitedSupportReasonCount + } + return +} + +// ProvisionErrorCode returns the value of the 'provision_error_code' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Provisioning Error Code +func (o *ClusterStatus) ProvisionErrorCode() string { + if o != nil && o.bitmap_&512 != 0 { + return o.provisionErrorCode + } + return "" +} + +// GetProvisionErrorCode returns the value of the 'provision_error_code' attribute and +// a flag indicating if the attribute has a value. +// +// Provisioning Error Code +func (o *ClusterStatus) GetProvisionErrorCode() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.provisionErrorCode + } + return +} + +// ProvisionErrorMessage returns the value of the 'provision_error_message' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Provisioning Error Message +func (o *ClusterStatus) ProvisionErrorMessage() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.provisionErrorMessage + } + return "" +} + +// GetProvisionErrorMessage returns the value of the 'provision_error_message' attribute and +// a flag indicating if the attribute has a value. +// +// Provisioning Error Message +func (o *ClusterStatus) GetProvisionErrorMessage() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.provisionErrorMessage + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The overall state of the cluster. +func (o *ClusterStatus) State() ClusterState { + if o != nil && o.bitmap_&2048 != 0 { + return o.state + } + return ClusterState("") +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// The overall state of the cluster. +func (o *ClusterStatus) GetState() (value ClusterState, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.state + } + return +} + +// ClusterStatusListKind is the name of the type used to represent list of objects of +// type 'cluster_status'. +const ClusterStatusListKind = "ClusterStatusList" + +// ClusterStatusListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster_status'. +const ClusterStatusListLinkKind = "ClusterStatusListLink" + +// ClusterStatusNilKind is the name of the type used to nil lists of objects of +// type 'cluster_status'. +const ClusterStatusListNilKind = "ClusterStatusListNil" + +// ClusterStatusList is a list of values of the 'cluster_status' type. +type ClusterStatusList struct { + href string + link bool + items []*ClusterStatus +} + +// Kind returns the name of the type of the object. +func (l *ClusterStatusList) Kind() string { + if l == nil { + return ClusterStatusListNilKind + } + if l.link { + return ClusterStatusListLinkKind + } + return ClusterStatusListKind +} + +// Link returns true iif this is a link. +func (l *ClusterStatusList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ClusterStatusList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ClusterStatusList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ClusterStatusList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterStatusList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterStatusList) Get(i int) *ClusterStatus { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterStatusList) Slice() []*ClusterStatus { + var slice []*ClusterStatus + if l == nil { + slice = make([]*ClusterStatus, 0) + } else { + slice = make([]*ClusterStatus, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterStatusList) Each(f func(item *ClusterStatus) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterStatusList) Range(f func(index int, item *ClusterStatus) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_status_type_json.go b/clustersmgmt/v2alpha1/cluster_status_type_json.go new file mode 100644 index 00000000..9a0c41fc --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_status_type_json.go @@ -0,0 +1,226 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalClusterStatus writes a value of the 'cluster_status' type to the given writer. +func MarshalClusterStatus(object *ClusterStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeClusterStatus(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeClusterStatus writes a value of the 'cluster_status' type to the given stream. +func writeClusterStatus(object *ClusterStatus, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ClusterStatusLinkKind) + } else { + stream.WriteString(ClusterStatusKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("dns_ready") + stream.WriteBool(object.dnsReady) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("oidc_ready") + stream.WriteBool(object.oidcReady) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("configuration_mode") + stream.WriteString(string(object.configurationMode)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("current_compute") + stream.WriteInt(object.currentCompute) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("limited_support_reason_count") + stream.WriteInt(object.limitedSupportReasonCount) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("provision_error_code") + stream.WriteString(object.provisionErrorCode) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("provision_error_message") + stream.WriteString(object.provisionErrorMessage) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(string(object.state)) + } + stream.WriteObjectEnd() +} + +// UnmarshalClusterStatus reads a value of the 'cluster_status' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalClusterStatus(source interface{}) (object *ClusterStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readClusterStatus(iterator) + err = iterator.Error + return +} + +// readClusterStatus reads a value of the 'cluster_status' type from the given iterator. +func readClusterStatus(iterator *jsoniter.Iterator) *ClusterStatus { + object := &ClusterStatus{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ClusterStatusLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "dns_ready": + value := iterator.ReadBool() + object.dnsReady = value + object.bitmap_ |= 8 + case "oidc_ready": + value := iterator.ReadBool() + object.oidcReady = value + object.bitmap_ |= 16 + case "configuration_mode": + text := iterator.ReadString() + value := ClusterConfigurationMode(text) + object.configurationMode = value + object.bitmap_ |= 32 + case "current_compute": + value := iterator.ReadInt() + object.currentCompute = value + object.bitmap_ |= 64 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 128 + case "limited_support_reason_count": + value := iterator.ReadInt() + object.limitedSupportReasonCount = value + object.bitmap_ |= 256 + case "provision_error_code": + value := iterator.ReadString() + object.provisionErrorCode = value + object.bitmap_ |= 512 + case "provision_error_message": + value := iterator.ReadString() + object.provisionErrorMessage = value + object.bitmap_ |= 1024 + case "state": + text := iterator.ReadString() + value := ClusterState(text) + object.state = value + object.bitmap_ |= 2048 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cluster_type.go b/clustersmgmt/v2alpha1/cluster_type.go new file mode 100644 index 00000000..0305391a --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_type.go @@ -0,0 +1,1690 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ClusterKind is the name of the type used to represent objects +// of type 'cluster'. +const ClusterKind = "Cluster" + +// ClusterLinkKind is the name of the type used to represent links +// to objects of type 'cluster'. +const ClusterLinkKind = "ClusterLink" + +// ClusterNilKind is the name of the type used to nil references +// to objects of type 'cluster'. +const ClusterNilKind = "ClusterNil" + +// Cluster represents the values of the 'cluster' type. +// +// Definition of an _OpenShift_ cluster. +// +// The `cloud_provider` attribute is a reference to the cloud provider. When a +// cluster is retrieved it will be a link to the cloud provider, containing only +// the kind, id and href attributes: +// +// ```json +// +// { +// "cloud_provider": { +// "kind": "CloudProviderLink", +// "id": "123", +// "href": "/api/clusters_mgmt/v1/cloud_providers/123" +// } +// } +// +// ``` +// +// When a cluster is created this is optional, and if used it should contain the +// identifier of the cloud provider to use: +// +// ```json +// +// { +// "cloud_provider": { +// "id": "123", +// } +// } +// +// ``` +// +// If not included, then the cluster will be created using the default cloud +// provider, which is currently Amazon Web Services. +// +// The region attribute is mandatory when a cluster is created. +// +// The `aws.access_key_id`, `aws.secret_access_key` and `dns.base_domain` +// attributes are mandatory when creation a cluster with your own Amazon Web +// Services account. +type Cluster struct { + bitmap_ uint64 + id string + href string + api *ClusterAPI + aws *AWS + awsInfrastructureAccessRoleGrants *AWSInfrastructureAccessRoleGrantList + ccs *CCS + dns *DNS + gcp *GCP + gcpEncryptionKey *GCPEncryptionKey + gcpNetwork *GCPNetwork + additionalTrustBundle string + addons *AddOnInstallationList + autoscaler *ClusterAutoscaler + azure *Azure + billingModel BillingModel + byoOidc *ByoOidc + cloudProvider *CloudProvider + console *ClusterConsole + creationTimestamp time.Time + deleteProtection *DeleteProtection + domainPrefix string + expirationTimestamp time.Time + externalID string + externalAuthConfig *ExternalAuthConfig + externalConfiguration *ExternalConfiguration + flavour *Flavour + groups *GroupList + healthState ClusterHealthState + htpasswd *HTPasswdIdentityProvider + hypershift *Hypershift + identityProviders *IdentityProviderList + inflightChecks *InflightCheckList + infraID string + ingresses *IngressList + kubeletConfig *KubeletConfig + loadBalancerQuota int + machinePools *MachinePoolList + managedService *ManagedService + name string + network *Network + nodeDrainGracePeriod *Value + nodePools *NodePoolList + nodes *ClusterNodes + openshiftVersion string + product *Product + properties map[string]string + provisionShard *ProvisionShard + proxy *Proxy + region *CloudRegion + state ClusterState + status *ClusterStatus + storageQuota *Value + subscription *Subscription + version *Version + fips bool + disableUserWorkloadMonitoring bool + etcdEncryption bool + managed bool + multiAZ bool + multiArchEnabled bool +} + +// Kind returns the name of the type of the object. +func (o *Cluster) Kind() string { + if o == nil { + return ClusterNilKind + } + if o.bitmap_&1 != 0 { + return ClusterLinkKind + } + return ClusterKind +} + +// Link returns true iif this is a link. +func (o *Cluster) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Cluster) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Cluster) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Cluster) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Cluster) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Cluster) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// API returns the value of the 'API' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Information about the API of the cluster. +func (o *Cluster) API() *ClusterAPI { + if o != nil && o.bitmap_&8 != 0 { + return o.api + } + return nil +} + +// GetAPI returns the value of the 'API' attribute and +// a flag indicating if the attribute has a value. +// +// Information about the API of the cluster. +func (o *Cluster) GetAPI() (value *ClusterAPI, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.api + } + return +} + +// AWS returns the value of the 'AWS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Amazon Web Services settings of the cluster. +func (o *Cluster) AWS() *AWS { + if o != nil && o.bitmap_&16 != 0 { + return o.aws + } + return nil +} + +// GetAWS returns the value of the 'AWS' attribute and +// a flag indicating if the attribute has a value. +// +// Amazon Web Services settings of the cluster. +func (o *Cluster) GetAWS() (value *AWS, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.aws + } + return +} + +// AWSInfrastructureAccessRoleGrants returns the value of the 'AWS_infrastructure_access_role_grants' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of AWS infrastructure access role grants on this cluster. +func (o *Cluster) AWSInfrastructureAccessRoleGrants() *AWSInfrastructureAccessRoleGrantList { + if o != nil && o.bitmap_&32 != 0 { + return o.awsInfrastructureAccessRoleGrants + } + return nil +} + +// GetAWSInfrastructureAccessRoleGrants returns the value of the 'AWS_infrastructure_access_role_grants' attribute and +// a flag indicating if the attribute has a value. +// +// List of AWS infrastructure access role grants on this cluster. +func (o *Cluster) GetAWSInfrastructureAccessRoleGrants() (value *AWSInfrastructureAccessRoleGrantList, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.awsInfrastructureAccessRoleGrants + } + return +} + +// CCS returns the value of the 'CCS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains configuration of a Customer Cloud Subscription cluster. +func (o *Cluster) CCS() *CCS { + if o != nil && o.bitmap_&64 != 0 { + return o.ccs + } + return nil +} + +// GetCCS returns the value of the 'CCS' attribute and +// a flag indicating if the attribute has a value. +// +// Contains configuration of a Customer Cloud Subscription cluster. +func (o *Cluster) GetCCS() (value *CCS, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.ccs + } + return +} + +// DNS returns the value of the 'DNS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// DNS settings of the cluster. +func (o *Cluster) DNS() *DNS { + if o != nil && o.bitmap_&128 != 0 { + return o.dns + } + return nil +} + +// GetDNS returns the value of the 'DNS' attribute and +// a flag indicating if the attribute has a value. +// +// DNS settings of the cluster. +func (o *Cluster) GetDNS() (value *DNS, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.dns + } + return +} + +// FIPS returns the value of the 'FIPS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Create cluster that uses FIPS Validated / Modules in Process cryptographic libraries. +func (o *Cluster) FIPS() bool { + if o != nil && o.bitmap_&256 != 0 { + return o.fips + } + return false +} + +// GetFIPS returns the value of the 'FIPS' attribute and +// a flag indicating if the attribute has a value. +// +// Create cluster that uses FIPS Validated / Modules in Process cryptographic libraries. +func (o *Cluster) GetFIPS() (value bool, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.fips + } + return +} + +// GCP returns the value of the 'GCP' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Google cloud platform settings of the cluster. +func (o *Cluster) GCP() *GCP { + if o != nil && o.bitmap_&512 != 0 { + return o.gcp + } + return nil +} + +// GetGCP returns the value of the 'GCP' attribute and +// a flag indicating if the attribute has a value. +// +// Google cloud platform settings of the cluster. +func (o *Cluster) GetGCP() (value *GCP, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.gcp + } + return +} + +// GCPEncryptionKey returns the value of the 'GCP_encryption_key' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Key used for encryption of GCP cluster nodes. +func (o *Cluster) GCPEncryptionKey() *GCPEncryptionKey { + if o != nil && o.bitmap_&1024 != 0 { + return o.gcpEncryptionKey + } + return nil +} + +// GetGCPEncryptionKey returns the value of the 'GCP_encryption_key' attribute and +// a flag indicating if the attribute has a value. +// +// Key used for encryption of GCP cluster nodes. +func (o *Cluster) GetGCPEncryptionKey() (value *GCPEncryptionKey, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.gcpEncryptionKey + } + return +} + +// GCPNetwork returns the value of the 'GCP_network' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP Network. +func (o *Cluster) GCPNetwork() *GCPNetwork { + if o != nil && o.bitmap_&2048 != 0 { + return o.gcpNetwork + } + return nil +} + +// GetGCPNetwork returns the value of the 'GCP_network' attribute and +// a flag indicating if the attribute has a value. +// +// GCP Network. +func (o *Cluster) GetGCPNetwork() (value *GCPNetwork, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.gcpNetwork + } + return +} + +// AdditionalTrustBundle returns the value of the 'additional_trust_bundle' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Additional trust bundle. +func (o *Cluster) AdditionalTrustBundle() string { + if o != nil && o.bitmap_&4096 != 0 { + return o.additionalTrustBundle + } + return "" +} + +// GetAdditionalTrustBundle returns the value of the 'additional_trust_bundle' attribute and +// a flag indicating if the attribute has a value. +// +// Additional trust bundle. +func (o *Cluster) GetAdditionalTrustBundle() (value string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.additionalTrustBundle + } + return +} + +// Addons returns the value of the 'addons' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of add-ons on this cluster. +func (o *Cluster) Addons() *AddOnInstallationList { + if o != nil && o.bitmap_&8192 != 0 { + return o.addons + } + return nil +} + +// GetAddons returns the value of the 'addons' attribute and +// a flag indicating if the attribute has a value. +// +// List of add-ons on this cluster. +func (o *Cluster) GetAddons() (value *AddOnInstallationList, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.addons + } + return +} + +// Autoscaler returns the value of the 'autoscaler' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to an optional _ClusterAutoscaler_ that is coupled with the cluster. +func (o *Cluster) Autoscaler() *ClusterAutoscaler { + if o != nil && o.bitmap_&16384 != 0 { + return o.autoscaler + } + return nil +} + +// GetAutoscaler returns the value of the 'autoscaler' attribute and +// a flag indicating if the attribute has a value. +// +// Link to an optional _ClusterAutoscaler_ that is coupled with the cluster. +func (o *Cluster) GetAutoscaler() (value *ClusterAutoscaler, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.autoscaler + } + return +} + +// Azure returns the value of the 'azure' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Microsoft Azure settings of the cluster. +func (o *Cluster) Azure() *Azure { + if o != nil && o.bitmap_&32768 != 0 { + return o.azure + } + return nil +} + +// GetAzure returns the value of the 'azure' attribute and +// a flag indicating if the attribute has a value. +// +// Microsoft Azure settings of the cluster. +func (o *Cluster) GetAzure() (value *Azure, ok bool) { + ok = o != nil && o.bitmap_&32768 != 0 + if ok { + value = o.azure + } + return +} + +// BillingModel returns the value of the 'billing_model' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Billing model for cluster resources. +func (o *Cluster) BillingModel() BillingModel { + if o != nil && o.bitmap_&65536 != 0 { + return o.billingModel + } + return BillingModel("") +} + +// GetBillingModel returns the value of the 'billing_model' attribute and +// a flag indicating if the attribute has a value. +// +// Billing model for cluster resources. +func (o *Cluster) GetBillingModel() (value BillingModel, ok bool) { + ok = o != nil && o.bitmap_&65536 != 0 + if ok { + value = o.billingModel + } + return +} + +// ByoOidc returns the value of the 'byo_oidc' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains information about BYO OIDC. +func (o *Cluster) ByoOidc() *ByoOidc { + if o != nil && o.bitmap_&131072 != 0 { + return o.byoOidc + } + return nil +} + +// GetByoOidc returns the value of the 'byo_oidc' attribute and +// a flag indicating if the attribute has a value. +// +// Contains information about BYO OIDC. +func (o *Cluster) GetByoOidc() (value *ByoOidc, ok bool) { + ok = o != nil && o.bitmap_&131072 != 0 + if ok { + value = o.byoOidc + } + return +} + +// CloudProvider returns the value of the 'cloud_provider' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the cloud provider where the cluster is installed. +func (o *Cluster) CloudProvider() *CloudProvider { + if o != nil && o.bitmap_&262144 != 0 { + return o.cloudProvider + } + return nil +} + +// GetCloudProvider returns the value of the 'cloud_provider' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the cloud provider where the cluster is installed. +func (o *Cluster) GetCloudProvider() (value *CloudProvider, ok bool) { + ok = o != nil && o.bitmap_&262144 != 0 + if ok { + value = o.cloudProvider + } + return +} + +// Console returns the value of the 'console' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Information about the console of the cluster. +func (o *Cluster) Console() *ClusterConsole { + if o != nil && o.bitmap_&524288 != 0 { + return o.console + } + return nil +} + +// GetConsole returns the value of the 'console' attribute and +// a flag indicating if the attribute has a value. +// +// Information about the console of the cluster. +func (o *Cluster) GetConsole() (value *ClusterConsole, ok bool) { + ok = o != nil && o.bitmap_&524288 != 0 + if ok { + value = o.console + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the cluster was initially created, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *Cluster) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&1048576 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the cluster was initially created, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *Cluster) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&1048576 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// DeleteProtection returns the value of the 'delete_protection' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Delete protection +func (o *Cluster) DeleteProtection() *DeleteProtection { + if o != nil && o.bitmap_&2097152 != 0 { + return o.deleteProtection + } + return nil +} + +// GetDeleteProtection returns the value of the 'delete_protection' attribute and +// a flag indicating if the attribute has a value. +// +// Delete protection +func (o *Cluster) GetDeleteProtection() (value *DeleteProtection, ok bool) { + ok = o != nil && o.bitmap_&2097152 != 0 + if ok { + value = o.deleteProtection + } + return +} + +// DisableUserWorkloadMonitoring returns the value of the 'disable_user_workload_monitoring' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates whether the User workload monitoring is enabled or not +// It is enabled by default +func (o *Cluster) DisableUserWorkloadMonitoring() bool { + if o != nil && o.bitmap_&4194304 != 0 { + return o.disableUserWorkloadMonitoring + } + return false +} + +// GetDisableUserWorkloadMonitoring returns the value of the 'disable_user_workload_monitoring' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates whether the User workload monitoring is enabled or not +// It is enabled by default +func (o *Cluster) GetDisableUserWorkloadMonitoring() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4194304 != 0 + if ok { + value = o.disableUserWorkloadMonitoring + } + return +} + +// DomainPrefix returns the value of the 'domain_prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// DomainPrefix of the cluster. This prefix is optionally assigned by the user when the +// cluster is created. It will appear in the Cluster's domain when the cluster is provisioned. +func (o *Cluster) DomainPrefix() string { + if o != nil && o.bitmap_&8388608 != 0 { + return o.domainPrefix + } + return "" +} + +// GetDomainPrefix returns the value of the 'domain_prefix' attribute and +// a flag indicating if the attribute has a value. +// +// DomainPrefix of the cluster. This prefix is optionally assigned by the user when the +// cluster is created. It will appear in the Cluster's domain when the cluster is provisioned. +func (o *Cluster) GetDomainPrefix() (value string, ok bool) { + ok = o != nil && o.bitmap_&8388608 != 0 + if ok { + value = o.domainPrefix + } + return +} + +// EtcdEncryption returns the value of the 'etcd_encryption' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates whether that etcd is encrypted or not. +// This is set only during cluster creation. +func (o *Cluster) EtcdEncryption() bool { + if o != nil && o.bitmap_&16777216 != 0 { + return o.etcdEncryption + } + return false +} + +// GetEtcdEncryption returns the value of the 'etcd_encryption' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates whether that etcd is encrypted or not. +// This is set only during cluster creation. +func (o *Cluster) GetEtcdEncryption() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16777216 != 0 + if ok { + value = o.etcdEncryption + } + return +} + +// ExpirationTimestamp returns the value of the 'expiration_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the cluster will be automatically deleted, using the format defined in +// [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). If no timestamp is provided, the cluster +// will never expire. +// +// This option is unsupported. +func (o *Cluster) ExpirationTimestamp() time.Time { + if o != nil && o.bitmap_&33554432 != 0 { + return o.expirationTimestamp + } + return time.Time{} +} + +// GetExpirationTimestamp returns the value of the 'expiration_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the cluster will be automatically deleted, using the format defined in +// [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). If no timestamp is provided, the cluster +// will never expire. +// +// This option is unsupported. +func (o *Cluster) GetExpirationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&33554432 != 0 + if ok { + value = o.expirationTimestamp + } + return +} + +// ExternalID returns the value of the 'external_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// External identifier of the cluster, generated by the installer. +func (o *Cluster) ExternalID() string { + if o != nil && o.bitmap_&67108864 != 0 { + return o.externalID + } + return "" +} + +// GetExternalID returns the value of the 'external_ID' attribute and +// a flag indicating if the attribute has a value. +// +// External identifier of the cluster, generated by the installer. +func (o *Cluster) GetExternalID() (value string, ok bool) { + ok = o != nil && o.bitmap_&67108864 != 0 + if ok { + value = o.externalID + } + return +} + +// ExternalAuthConfig returns the value of the 'external_auth_config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// External authentication configuration +func (o *Cluster) ExternalAuthConfig() *ExternalAuthConfig { + if o != nil && o.bitmap_&134217728 != 0 { + return o.externalAuthConfig + } + return nil +} + +// GetExternalAuthConfig returns the value of the 'external_auth_config' attribute and +// a flag indicating if the attribute has a value. +// +// External authentication configuration +func (o *Cluster) GetExternalAuthConfig() (value *ExternalAuthConfig, ok bool) { + ok = o != nil && o.bitmap_&134217728 != 0 + if ok { + value = o.externalAuthConfig + } + return +} + +// ExternalConfiguration returns the value of the 'external_configuration' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ExternalConfiguration shows external configuration on the cluster. +func (o *Cluster) ExternalConfiguration() *ExternalConfiguration { + if o != nil && o.bitmap_&268435456 != 0 { + return o.externalConfiguration + } + return nil +} + +// GetExternalConfiguration returns the value of the 'external_configuration' attribute and +// a flag indicating if the attribute has a value. +// +// ExternalConfiguration shows external configuration on the cluster. +func (o *Cluster) GetExternalConfiguration() (value *ExternalConfiguration, ok bool) { + ok = o != nil && o.bitmap_&268435456 != 0 + if ok { + value = o.externalConfiguration + } + return +} + +// Flavour returns the value of the 'flavour' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the _flavour_ that was used to create the cluster. +func (o *Cluster) Flavour() *Flavour { + if o != nil && o.bitmap_&536870912 != 0 { + return o.flavour + } + return nil +} + +// GetFlavour returns the value of the 'flavour' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the _flavour_ that was used to create the cluster. +func (o *Cluster) GetFlavour() (value *Flavour, ok bool) { + ok = o != nil && o.bitmap_&536870912 != 0 + if ok { + value = o.flavour + } + return +} + +// Groups returns the value of the 'groups' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the collection of groups of user of the cluster. +func (o *Cluster) Groups() *GroupList { + if o != nil && o.bitmap_&1073741824 != 0 { + return o.groups + } + return nil +} + +// GetGroups returns the value of the 'groups' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the collection of groups of user of the cluster. +func (o *Cluster) GetGroups() (value *GroupList, ok bool) { + ok = o != nil && o.bitmap_&1073741824 != 0 + if ok { + value = o.groups + } + return +} + +// HealthState returns the value of the 'health_state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HealthState indicates the overall health state of the cluster. +func (o *Cluster) HealthState() ClusterHealthState { + if o != nil && o.bitmap_&2147483648 != 0 { + return o.healthState + } + return ClusterHealthState("") +} + +// GetHealthState returns the value of the 'health_state' attribute and +// a flag indicating if the attribute has a value. +// +// HealthState indicates the overall health state of the cluster. +func (o *Cluster) GetHealthState() (value ClusterHealthState, ok bool) { + ok = o != nil && o.bitmap_&2147483648 != 0 + if ok { + value = o.healthState + } + return +} + +// Htpasswd returns the value of the 'htpasswd' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `htpasswd` identity provider. +func (o *Cluster) Htpasswd() *HTPasswdIdentityProvider { + if o != nil && o.bitmap_&4294967296 != 0 { + return o.htpasswd + } + return nil +} + +// GetHtpasswd returns the value of the 'htpasswd' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `htpasswd` identity provider. +func (o *Cluster) GetHtpasswd() (value *HTPasswdIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&4294967296 != 0 + if ok { + value = o.htpasswd + } + return +} + +// Hypershift returns the value of the 'hypershift' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Hypershift configuration. +func (o *Cluster) Hypershift() *Hypershift { + if o != nil && o.bitmap_&8589934592 != 0 { + return o.hypershift + } + return nil +} + +// GetHypershift returns the value of the 'hypershift' attribute and +// a flag indicating if the attribute has a value. +// +// Hypershift configuration. +func (o *Cluster) GetHypershift() (value *Hypershift, ok bool) { + ok = o != nil && o.bitmap_&8589934592 != 0 + if ok { + value = o.hypershift + } + return +} + +// IdentityProviders returns the value of the 'identity_providers' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the collection of identity providers of the cluster. +func (o *Cluster) IdentityProviders() *IdentityProviderList { + if o != nil && o.bitmap_&17179869184 != 0 { + return o.identityProviders + } + return nil +} + +// GetIdentityProviders returns the value of the 'identity_providers' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the collection of identity providers of the cluster. +func (o *Cluster) GetIdentityProviders() (value *IdentityProviderList, ok bool) { + ok = o != nil && o.bitmap_&17179869184 != 0 + if ok { + value = o.identityProviders + } + return +} + +// InflightChecks returns the value of the 'inflight_checks' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of inflight checks on this cluster. +func (o *Cluster) InflightChecks() *InflightCheckList { + if o != nil && o.bitmap_&34359738368 != 0 { + return o.inflightChecks + } + return nil +} + +// GetInflightChecks returns the value of the 'inflight_checks' attribute and +// a flag indicating if the attribute has a value. +// +// List of inflight checks on this cluster. +func (o *Cluster) GetInflightChecks() (value *InflightCheckList, ok bool) { + ok = o != nil && o.bitmap_&34359738368 != 0 + if ok { + value = o.inflightChecks + } + return +} + +// InfraID returns the value of the 'infra_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// InfraID is used for example to name the VPCs. +func (o *Cluster) InfraID() string { + if o != nil && o.bitmap_&68719476736 != 0 { + return o.infraID + } + return "" +} + +// GetInfraID returns the value of the 'infra_ID' attribute and +// a flag indicating if the attribute has a value. +// +// InfraID is used for example to name the VPCs. +func (o *Cluster) GetInfraID() (value string, ok bool) { + ok = o != nil && o.bitmap_&68719476736 != 0 + if ok { + value = o.infraID + } + return +} + +// Ingresses returns the value of the 'ingresses' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of ingresses on this cluster. +func (o *Cluster) Ingresses() *IngressList { + if o != nil && o.bitmap_&137438953472 != 0 { + return o.ingresses + } + return nil +} + +// GetIngresses returns the value of the 'ingresses' attribute and +// a flag indicating if the attribute has a value. +// +// List of ingresses on this cluster. +func (o *Cluster) GetIngresses() (value *IngressList, ok bool) { + ok = o != nil && o.bitmap_&137438953472 != 0 + if ok { + value = o.ingresses + } + return +} + +// KubeletConfig returns the value of the 'kubelet_config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details of cluster-wide KubeletConfig +func (o *Cluster) KubeletConfig() *KubeletConfig { + if o != nil && o.bitmap_&274877906944 != 0 { + return o.kubeletConfig + } + return nil +} + +// GetKubeletConfig returns the value of the 'kubelet_config' attribute and +// a flag indicating if the attribute has a value. +// +// Details of cluster-wide KubeletConfig +func (o *Cluster) GetKubeletConfig() (value *KubeletConfig, ok bool) { + ok = o != nil && o.bitmap_&274877906944 != 0 + if ok { + value = o.kubeletConfig + } + return +} + +// LoadBalancerQuota returns the value of the 'load_balancer_quota' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Load Balancer quota to be assigned to the cluster. +func (o *Cluster) LoadBalancerQuota() int { + if o != nil && o.bitmap_&549755813888 != 0 { + return o.loadBalancerQuota + } + return 0 +} + +// GetLoadBalancerQuota returns the value of the 'load_balancer_quota' attribute and +// a flag indicating if the attribute has a value. +// +// Load Balancer quota to be assigned to the cluster. +func (o *Cluster) GetLoadBalancerQuota() (value int, ok bool) { + ok = o != nil && o.bitmap_&549755813888 != 0 + if ok { + value = o.loadBalancerQuota + } + return +} + +// MachinePools returns the value of the 'machine_pools' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of machine pools on this cluster. +func (o *Cluster) MachinePools() *MachinePoolList { + if o != nil && o.bitmap_&1099511627776 != 0 { + return o.machinePools + } + return nil +} + +// GetMachinePools returns the value of the 'machine_pools' attribute and +// a flag indicating if the attribute has a value. +// +// List of machine pools on this cluster. +func (o *Cluster) GetMachinePools() (value *MachinePoolList, ok bool) { + ok = o != nil && o.bitmap_&1099511627776 != 0 + if ok { + value = o.machinePools + } + return +} + +// Managed returns the value of the 'managed' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Flag indicating if the cluster is managed (by Red Hat) or +// self-managed by the user. +func (o *Cluster) Managed() bool { + if o != nil && o.bitmap_&2199023255552 != 0 { + return o.managed + } + return false +} + +// GetManaged returns the value of the 'managed' attribute and +// a flag indicating if the attribute has a value. +// +// Flag indicating if the cluster is managed (by Red Hat) or +// self-managed by the user. +func (o *Cluster) GetManaged() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2199023255552 != 0 + if ok { + value = o.managed + } + return +} + +// ManagedService returns the value of the 'managed_service' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains information about Managed Service +func (o *Cluster) ManagedService() *ManagedService { + if o != nil && o.bitmap_&4398046511104 != 0 { + return o.managedService + } + return nil +} + +// GetManagedService returns the value of the 'managed_service' attribute and +// a flag indicating if the attribute has a value. +// +// Contains information about Managed Service +func (o *Cluster) GetManagedService() (value *ManagedService, ok bool) { + ok = o != nil && o.bitmap_&4398046511104 != 0 + if ok { + value = o.managedService + } + return +} + +// MultiAZ returns the value of the 'multi_AZ' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Flag indicating if the cluster should be created with nodes in +// different availability zones or all the nodes in a single one +// randomly selected. +func (o *Cluster) MultiAZ() bool { + if o != nil && o.bitmap_&8796093022208 != 0 { + return o.multiAZ + } + return false +} + +// GetMultiAZ returns the value of the 'multi_AZ' attribute and +// a flag indicating if the attribute has a value. +// +// Flag indicating if the cluster should be created with nodes in +// different availability zones or all the nodes in a single one +// randomly selected. +func (o *Cluster) GetMultiAZ() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8796093022208 != 0 + if ok { + value = o.multiAZ + } + return +} + +// MultiArchEnabled returns the value of the 'multi_arch_enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicate whether the cluster is enabled for multi arch workers +func (o *Cluster) MultiArchEnabled() bool { + if o != nil && o.bitmap_&17592186044416 != 0 { + return o.multiArchEnabled + } + return false +} + +// GetMultiArchEnabled returns the value of the 'multi_arch_enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicate whether the cluster is enabled for multi arch workers +func (o *Cluster) GetMultiArchEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&17592186044416 != 0 + if ok { + value = o.multiArchEnabled + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the cluster. This name is assigned by the user when the +// cluster is created. This is used to uniquely identify the cluster +func (o *Cluster) Name() string { + if o != nil && o.bitmap_&35184372088832 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the cluster. This name is assigned by the user when the +// cluster is created. This is used to uniquely identify the cluster +func (o *Cluster) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&35184372088832 != 0 + if ok { + value = o.name + } + return +} + +// Network returns the value of the 'network' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Network settings of the cluster. +func (o *Cluster) Network() *Network { + if o != nil && o.bitmap_&70368744177664 != 0 { + return o.network + } + return nil +} + +// GetNetwork returns the value of the 'network' attribute and +// a flag indicating if the attribute has a value. +// +// Network settings of the cluster. +func (o *Cluster) GetNetwork() (value *Network, ok bool) { + ok = o != nil && o.bitmap_&70368744177664 != 0 + if ok { + value = o.network + } + return +} + +// NodeDrainGracePeriod returns the value of the 'node_drain_grace_period' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Node drain grace period. +func (o *Cluster) NodeDrainGracePeriod() *Value { + if o != nil && o.bitmap_&140737488355328 != 0 { + return o.nodeDrainGracePeriod + } + return nil +} + +// GetNodeDrainGracePeriod returns the value of the 'node_drain_grace_period' attribute and +// a flag indicating if the attribute has a value. +// +// Node drain grace period. +func (o *Cluster) GetNodeDrainGracePeriod() (value *Value, ok bool) { + ok = o != nil && o.bitmap_&140737488355328 != 0 + if ok { + value = o.nodeDrainGracePeriod + } + return +} + +// NodePools returns the value of the 'node_pools' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of node pools on this cluster. +// NodePool is a scalable set of worker nodes attached to a hosted cluster. +func (o *Cluster) NodePools() *NodePoolList { + if o != nil && o.bitmap_&281474976710656 != 0 { + return o.nodePools + } + return nil +} + +// GetNodePools returns the value of the 'node_pools' attribute and +// a flag indicating if the attribute has a value. +// +// List of node pools on this cluster. +// NodePool is a scalable set of worker nodes attached to a hosted cluster. +func (o *Cluster) GetNodePools() (value *NodePoolList, ok bool) { + ok = o != nil && o.bitmap_&281474976710656 != 0 + if ok { + value = o.nodePools + } + return +} + +// Nodes returns the value of the 'nodes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Information about the nodes of the cluster. +func (o *Cluster) Nodes() *ClusterNodes { + if o != nil && o.bitmap_&562949953421312 != 0 { + return o.nodes + } + return nil +} + +// GetNodes returns the value of the 'nodes' attribute and +// a flag indicating if the attribute has a value. +// +// Information about the nodes of the cluster. +func (o *Cluster) GetNodes() (value *ClusterNodes, ok bool) { + ok = o != nil && o.bitmap_&562949953421312 != 0 + if ok { + value = o.nodes + } + return +} + +// OpenshiftVersion returns the value of the 'openshift_version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version of _OpenShift_ installed in the cluster, for example `4.0.0-0.2`. +// +// When retrieving a cluster this will always be reported. +// +// When provisioning a cluster this will be ignored, as the version to +// deploy will be determined internally. +func (o *Cluster) OpenshiftVersion() string { + if o != nil && o.bitmap_&1125899906842624 != 0 { + return o.openshiftVersion + } + return "" +} + +// GetOpenshiftVersion returns the value of the 'openshift_version' attribute and +// a flag indicating if the attribute has a value. +// +// Version of _OpenShift_ installed in the cluster, for example `4.0.0-0.2`. +// +// When retrieving a cluster this will always be reported. +// +// When provisioning a cluster this will be ignored, as the version to +// deploy will be determined internally. +func (o *Cluster) GetOpenshiftVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&1125899906842624 != 0 + if ok { + value = o.openshiftVersion + } + return +} + +// Product returns the value of the 'product' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the product type of this cluster. +func (o *Cluster) Product() *Product { + if o != nil && o.bitmap_&2251799813685248 != 0 { + return o.product + } + return nil +} + +// GetProduct returns the value of the 'product' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the product type of this cluster. +func (o *Cluster) GetProduct() (value *Product, ok bool) { + ok = o != nil && o.bitmap_&2251799813685248 != 0 + if ok { + value = o.product + } + return +} + +// Properties returns the value of the 'properties' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// User defined properties for tagging and querying. +func (o *Cluster) Properties() map[string]string { + if o != nil && o.bitmap_&4503599627370496 != 0 { + return o.properties + } + return nil +} + +// GetProperties returns the value of the 'properties' attribute and +// a flag indicating if the attribute has a value. +// +// User defined properties for tagging and querying. +func (o *Cluster) GetProperties() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&4503599627370496 != 0 + if ok { + value = o.properties + } + return +} + +// ProvisionShard returns the value of the 'provision_shard' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ProvisionShard contains the properties of the provision shard, including AWS and GCP related configurations +func (o *Cluster) ProvisionShard() *ProvisionShard { + if o != nil && o.bitmap_&9007199254740992 != 0 { + return o.provisionShard + } + return nil +} + +// GetProvisionShard returns the value of the 'provision_shard' attribute and +// a flag indicating if the attribute has a value. +// +// ProvisionShard contains the properties of the provision shard, including AWS and GCP related configurations +func (o *Cluster) GetProvisionShard() (value *ProvisionShard, ok bool) { + ok = o != nil && o.bitmap_&9007199254740992 != 0 + if ok { + value = o.provisionShard + } + return +} + +// Proxy returns the value of the 'proxy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Proxy. +func (o *Cluster) Proxy() *Proxy { + if o != nil && o.bitmap_&18014398509481984 != 0 { + return o.proxy + } + return nil +} + +// GetProxy returns the value of the 'proxy' attribute and +// a flag indicating if the attribute has a value. +// +// Proxy. +func (o *Cluster) GetProxy() (value *Proxy, ok bool) { + ok = o != nil && o.bitmap_&18014398509481984 != 0 + if ok { + value = o.proxy + } + return +} + +// Region returns the value of the 'region' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the cloud provider region where the cluster is installed. +func (o *Cluster) Region() *CloudRegion { + if o != nil && o.bitmap_&36028797018963968 != 0 { + return o.region + } + return nil +} + +// GetRegion returns the value of the 'region' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the cloud provider region where the cluster is installed. +func (o *Cluster) GetRegion() (value *CloudRegion, ok bool) { + ok = o != nil && o.bitmap_&36028797018963968 != 0 + if ok { + value = o.region + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Overall state of the cluster. +func (o *Cluster) State() ClusterState { + if o != nil && o.bitmap_&72057594037927936 != 0 { + return o.state + } + return ClusterState("") +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// Overall state of the cluster. +func (o *Cluster) GetState() (value ClusterState, ok bool) { + ok = o != nil && o.bitmap_&72057594037927936 != 0 + if ok { + value = o.state + } + return +} + +// Status returns the value of the 'status' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Status of cluster +func (o *Cluster) Status() *ClusterStatus { + if o != nil && o.bitmap_&144115188075855872 != 0 { + return o.status + } + return nil +} + +// GetStatus returns the value of the 'status' attribute and +// a flag indicating if the attribute has a value. +// +// Status of cluster +func (o *Cluster) GetStatus() (value *ClusterStatus, ok bool) { + ok = o != nil && o.bitmap_&144115188075855872 != 0 + if ok { + value = o.status + } + return +} + +// StorageQuota returns the value of the 'storage_quota' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Storage quota to be assigned to the cluster. +func (o *Cluster) StorageQuota() *Value { + if o != nil && o.bitmap_&288230376151711744 != 0 { + return o.storageQuota + } + return nil +} + +// GetStorageQuota returns the value of the 'storage_quota' attribute and +// a flag indicating if the attribute has a value. +// +// Storage quota to be assigned to the cluster. +func (o *Cluster) GetStorageQuota() (value *Value, ok bool) { + ok = o != nil && o.bitmap_&288230376151711744 != 0 + if ok { + value = o.storageQuota + } + return +} + +// Subscription returns the value of the 'subscription' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the subscription that comes from the account management service when the cluster +// is registered. +func (o *Cluster) Subscription() *Subscription { + if o != nil && o.bitmap_&576460752303423488 != 0 { + return o.subscription + } + return nil +} + +// GetSubscription returns the value of the 'subscription' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the subscription that comes from the account management service when the cluster +// is registered. +func (o *Cluster) GetSubscription() (value *Subscription, ok bool) { + ok = o != nil && o.bitmap_&576460752303423488 != 0 + if ok { + value = o.subscription + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the version of _OpenShift_ that will be used to install the cluster. +func (o *Cluster) Version() *Version { + if o != nil && o.bitmap_&1152921504606846976 != 0 { + return o.version + } + return nil +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the version of _OpenShift_ that will be used to install the cluster. +func (o *Cluster) GetVersion() (value *Version, ok bool) { + ok = o != nil && o.bitmap_&1152921504606846976 != 0 + if ok { + value = o.version + } + return +} + +// ClusterListKind is the name of the type used to represent list of objects of +// type 'cluster'. +const ClusterListKind = "ClusterList" + +// ClusterListLinkKind is the name of the type used to represent links to list +// of objects of type 'cluster'. +const ClusterListLinkKind = "ClusterListLink" + +// ClusterNilKind is the name of the type used to nil lists of objects of +// type 'cluster'. +const ClusterListNilKind = "ClusterListNil" + +// ClusterList is a list of values of the 'cluster' type. +type ClusterList struct { + href string + link bool + items []*Cluster +} + +// Kind returns the name of the type of the object. +func (l *ClusterList) Kind() string { + if l == nil { + return ClusterListNilKind + } + if l.link { + return ClusterListLinkKind + } + return ClusterListKind +} + +// Link returns true iif this is a link. +func (l *ClusterList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ClusterList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ClusterList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ClusterList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ClusterList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ClusterList) Get(i int) *Cluster { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ClusterList) Slice() []*Cluster { + var slice []*Cluster + if l == nil { + slice = make([]*Cluster, 0) + } else { + slice = make([]*Cluster, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ClusterList) Each(f func(item *Cluster) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ClusterList) Range(f func(index int, item *Cluster) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cluster_type_json.go b/clustersmgmt/v2alpha1/cluster_type_json.go new file mode 100644 index 00000000..b57137d6 --- /dev/null +++ b/clustersmgmt/v2alpha1/cluster_type_json.go @@ -0,0 +1,1062 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCluster writes a value of the 'cluster' type to the given writer. +func MarshalCluster(object *Cluster, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCluster(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCluster writes a value of the 'cluster' type to the given stream. +func writeCluster(object *Cluster, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ClusterLinkKind) + } else { + stream.WriteString(ClusterKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.api != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("api") + writeClusterAPI(object.api, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.aws != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws") + writeAWS(object.aws, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.awsInfrastructureAccessRoleGrants != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws_infrastructure_access_role_grants") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeAWSInfrastructureAccessRoleGrantList(object.awsInfrastructureAccessRoleGrants.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&64 != 0 && object.ccs != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ccs") + writeCCS(object.ccs, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.dns != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("dns") + writeDNS(object.dns, stream) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("fips") + stream.WriteBool(object.fips) + count++ + } + present_ = object.bitmap_&512 != 0 && object.gcp != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp") + writeGCP(object.gcp, stream) + count++ + } + present_ = object.bitmap_&1024 != 0 && object.gcpEncryptionKey != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp_encryption_key") + writeGCPEncryptionKey(object.gcpEncryptionKey, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.gcpNetwork != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp_network") + writeGCPNetwork(object.gcpNetwork, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_trust_bundle") + stream.WriteString(object.additionalTrustBundle) + count++ + } + present_ = object.bitmap_&8192 != 0 && object.addons != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("addons") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeAddOnInstallationList(object.addons.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&16384 != 0 && object.autoscaler != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("autoscaler") + writeClusterAutoscaler(object.autoscaler, stream) + count++ + } + present_ = object.bitmap_&32768 != 0 && object.azure != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("azure") + writeAzure(object.azure, stream) + count++ + } + present_ = object.bitmap_&65536 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing_model") + stream.WriteString(string(object.billingModel)) + count++ + } + present_ = object.bitmap_&131072 != 0 && object.byoOidc != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("byo_oidc") + writeByoOidc(object.byoOidc, stream) + count++ + } + present_ = object.bitmap_&262144 != 0 && object.cloudProvider != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cloud_provider") + writeCloudProvider(object.cloudProvider, stream) + count++ + } + present_ = object.bitmap_&524288 != 0 && object.console != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("console") + writeClusterConsole(object.console, stream) + count++ + } + present_ = object.bitmap_&1048576 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&2097152 != 0 && object.deleteProtection != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("delete_protection") + writeDeleteProtection(object.deleteProtection, stream) + count++ + } + present_ = object.bitmap_&4194304 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("disable_user_workload_monitoring") + stream.WriteBool(object.disableUserWorkloadMonitoring) + count++ + } + present_ = object.bitmap_&8388608 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("domain_prefix") + stream.WriteString(object.domainPrefix) + count++ + } + present_ = object.bitmap_&16777216 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("etcd_encryption") + stream.WriteBool(object.etcdEncryption) + count++ + } + present_ = object.bitmap_&33554432 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("expiration_timestamp") + stream.WriteString((object.expirationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&67108864 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("external_id") + stream.WriteString(object.externalID) + count++ + } + present_ = object.bitmap_&134217728 != 0 && object.externalAuthConfig != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("external_auth_config") + writeExternalAuthConfig(object.externalAuthConfig, stream) + count++ + } + present_ = object.bitmap_&268435456 != 0 && object.externalConfiguration != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("external_configuration") + writeExternalConfiguration(object.externalConfiguration, stream) + count++ + } + present_ = object.bitmap_&536870912 != 0 && object.flavour != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("flavour") + writeFlavour(object.flavour, stream) + count++ + } + present_ = object.bitmap_&1073741824 != 0 && object.groups != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("groups") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeGroupList(object.groups.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&2147483648 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("health_state") + stream.WriteString(string(object.healthState)) + count++ + } + present_ = object.bitmap_&4294967296 != 0 && object.htpasswd != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("htpasswd") + writeHTPasswdIdentityProvider(object.htpasswd, stream) + count++ + } + present_ = object.bitmap_&8589934592 != 0 && object.hypershift != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hypershift") + writeHypershift(object.hypershift, stream) + count++ + } + present_ = object.bitmap_&17179869184 != 0 && object.identityProviders != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("identity_providers") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeIdentityProviderList(object.identityProviders.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&34359738368 != 0 && object.inflightChecks != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("inflight_checks") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeInflightCheckList(object.inflightChecks.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&68719476736 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra_id") + stream.WriteString(object.infraID) + count++ + } + present_ = object.bitmap_&137438953472 != 0 && object.ingresses != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ingresses") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeIngressList(object.ingresses.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&274877906944 != 0 && object.kubeletConfig != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kubelet_config") + writeKubeletConfig(object.kubeletConfig, stream) + count++ + } + present_ = object.bitmap_&549755813888 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("load_balancer_quota") + stream.WriteInt(object.loadBalancerQuota) + count++ + } + present_ = object.bitmap_&1099511627776 != 0 && object.machinePools != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("machine_pools") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeMachinePoolList(object.machinePools.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&2199023255552 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managed") + stream.WriteBool(object.managed) + count++ + } + present_ = object.bitmap_&4398046511104 != 0 && object.managedService != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managed_service") + writeManagedService(object.managedService, stream) + count++ + } + present_ = object.bitmap_&8796093022208 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("multi_az") + stream.WriteBool(object.multiAZ) + count++ + } + present_ = object.bitmap_&17592186044416 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("multi_arch_enabled") + stream.WriteBool(object.multiArchEnabled) + count++ + } + present_ = object.bitmap_&35184372088832 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&70368744177664 != 0 && object.network != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("network") + writeNetwork(object.network, stream) + count++ + } + present_ = object.bitmap_&140737488355328 != 0 && object.nodeDrainGracePeriod != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("node_drain_grace_period") + writeValue(object.nodeDrainGracePeriod, stream) + count++ + } + present_ = object.bitmap_&281474976710656 != 0 && object.nodePools != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("node_pools") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeNodePoolList(object.nodePools.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&562949953421312 != 0 && object.nodes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("nodes") + writeClusterNodes(object.nodes, stream) + count++ + } + present_ = object.bitmap_&1125899906842624 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("openshift_version") + stream.WriteString(object.openshiftVersion) + count++ + } + present_ = object.bitmap_&2251799813685248 != 0 && object.product != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("product") + writeProduct(object.product, stream) + count++ + } + present_ = object.bitmap_&4503599627370496 != 0 && object.properties != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("properties") + if object.properties != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.properties)) + i := 0 + for key := range object.properties { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.properties[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&9007199254740992 != 0 && object.provisionShard != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("provision_shard") + writeProvisionShard(object.provisionShard, stream) + count++ + } + present_ = object.bitmap_&18014398509481984 != 0 && object.proxy != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("proxy") + writeProxy(object.proxy, stream) + count++ + } + present_ = object.bitmap_&36028797018963968 != 0 && object.region != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("region") + writeCloudRegion(object.region, stream) + count++ + } + present_ = object.bitmap_&72057594037927936 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(string(object.state)) + count++ + } + present_ = object.bitmap_&144115188075855872 != 0 && object.status != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("status") + writeClusterStatus(object.status, stream) + count++ + } + present_ = object.bitmap_&288230376151711744 != 0 && object.storageQuota != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("storage_quota") + writeValue(object.storageQuota, stream) + count++ + } + present_ = object.bitmap_&576460752303423488 != 0 && object.subscription != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subscription") + writeSubscription(object.subscription, stream) + count++ + } + present_ = object.bitmap_&1152921504606846976 != 0 && object.version != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + writeVersion(object.version, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalCluster reads a value of the 'cluster' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCluster(source interface{}) (object *Cluster, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCluster(iterator) + err = iterator.Error + return +} + +// readCluster reads a value of the 'cluster' type from the given iterator. +func readCluster(iterator *jsoniter.Iterator) *Cluster { + object := &Cluster{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ClusterLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "api": + value := readClusterAPI(iterator) + object.api = value + object.bitmap_ |= 8 + case "aws": + value := readAWS(iterator) + object.aws = value + object.bitmap_ |= 16 + case "aws_infrastructure_access_role_grants": + value := &AWSInfrastructureAccessRoleGrantList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == AWSInfrastructureAccessRoleGrantListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readAWSInfrastructureAccessRoleGrantList(iterator) + default: + iterator.ReadAny() + } + } + object.awsInfrastructureAccessRoleGrants = value + object.bitmap_ |= 32 + case "ccs": + value := readCCS(iterator) + object.ccs = value + object.bitmap_ |= 64 + case "dns": + value := readDNS(iterator) + object.dns = value + object.bitmap_ |= 128 + case "fips": + value := iterator.ReadBool() + object.fips = value + object.bitmap_ |= 256 + case "gcp": + value := readGCP(iterator) + object.gcp = value + object.bitmap_ |= 512 + case "gcp_encryption_key": + value := readGCPEncryptionKey(iterator) + object.gcpEncryptionKey = value + object.bitmap_ |= 1024 + case "gcp_network": + value := readGCPNetwork(iterator) + object.gcpNetwork = value + object.bitmap_ |= 2048 + case "additional_trust_bundle": + value := iterator.ReadString() + object.additionalTrustBundle = value + object.bitmap_ |= 4096 + case "addons": + value := &AddOnInstallationList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == AddOnInstallationListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readAddOnInstallationList(iterator) + default: + iterator.ReadAny() + } + } + object.addons = value + object.bitmap_ |= 8192 + case "autoscaler": + value := readClusterAutoscaler(iterator) + object.autoscaler = value + object.bitmap_ |= 16384 + case "azure": + value := readAzure(iterator) + object.azure = value + object.bitmap_ |= 32768 + case "billing_model": + text := iterator.ReadString() + value := BillingModel(text) + object.billingModel = value + object.bitmap_ |= 65536 + case "byo_oidc": + value := readByoOidc(iterator) + object.byoOidc = value + object.bitmap_ |= 131072 + case "cloud_provider": + value := readCloudProvider(iterator) + object.cloudProvider = value + object.bitmap_ |= 262144 + case "console": + value := readClusterConsole(iterator) + object.console = value + object.bitmap_ |= 524288 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 1048576 + case "delete_protection": + value := readDeleteProtection(iterator) + object.deleteProtection = value + object.bitmap_ |= 2097152 + case "disable_user_workload_monitoring": + value := iterator.ReadBool() + object.disableUserWorkloadMonitoring = value + object.bitmap_ |= 4194304 + case "domain_prefix": + value := iterator.ReadString() + object.domainPrefix = value + object.bitmap_ |= 8388608 + case "etcd_encryption": + value := iterator.ReadBool() + object.etcdEncryption = value + object.bitmap_ |= 16777216 + case "expiration_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.expirationTimestamp = value + object.bitmap_ |= 33554432 + case "external_id": + value := iterator.ReadString() + object.externalID = value + object.bitmap_ |= 67108864 + case "external_auth_config": + value := readExternalAuthConfig(iterator) + object.externalAuthConfig = value + object.bitmap_ |= 134217728 + case "external_configuration": + value := readExternalConfiguration(iterator) + object.externalConfiguration = value + object.bitmap_ |= 268435456 + case "flavour": + value := readFlavour(iterator) + object.flavour = value + object.bitmap_ |= 536870912 + case "groups": + value := &GroupList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == GroupListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readGroupList(iterator) + default: + iterator.ReadAny() + } + } + object.groups = value + object.bitmap_ |= 1073741824 + case "health_state": + text := iterator.ReadString() + value := ClusterHealthState(text) + object.healthState = value + object.bitmap_ |= 2147483648 + case "htpasswd": + value := readHTPasswdIdentityProvider(iterator) + object.htpasswd = value + object.bitmap_ |= 4294967296 + case "hypershift": + value := readHypershift(iterator) + object.hypershift = value + object.bitmap_ |= 8589934592 + case "identity_providers": + value := &IdentityProviderList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == IdentityProviderListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readIdentityProviderList(iterator) + default: + iterator.ReadAny() + } + } + object.identityProviders = value + object.bitmap_ |= 17179869184 + case "inflight_checks": + value := &InflightCheckList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == InflightCheckListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readInflightCheckList(iterator) + default: + iterator.ReadAny() + } + } + object.inflightChecks = value + object.bitmap_ |= 34359738368 + case "infra_id": + value := iterator.ReadString() + object.infraID = value + object.bitmap_ |= 68719476736 + case "ingresses": + value := &IngressList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == IngressListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readIngressList(iterator) + default: + iterator.ReadAny() + } + } + object.ingresses = value + object.bitmap_ |= 137438953472 + case "kubelet_config": + value := readKubeletConfig(iterator) + object.kubeletConfig = value + object.bitmap_ |= 274877906944 + case "load_balancer_quota": + value := iterator.ReadInt() + object.loadBalancerQuota = value + object.bitmap_ |= 549755813888 + case "machine_pools": + value := &MachinePoolList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == MachinePoolListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readMachinePoolList(iterator) + default: + iterator.ReadAny() + } + } + object.machinePools = value + object.bitmap_ |= 1099511627776 + case "managed": + value := iterator.ReadBool() + object.managed = value + object.bitmap_ |= 2199023255552 + case "managed_service": + value := readManagedService(iterator) + object.managedService = value + object.bitmap_ |= 4398046511104 + case "multi_az": + value := iterator.ReadBool() + object.multiAZ = value + object.bitmap_ |= 8796093022208 + case "multi_arch_enabled": + value := iterator.ReadBool() + object.multiArchEnabled = value + object.bitmap_ |= 17592186044416 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 35184372088832 + case "network": + value := readNetwork(iterator) + object.network = value + object.bitmap_ |= 70368744177664 + case "node_drain_grace_period": + value := readValue(iterator) + object.nodeDrainGracePeriod = value + object.bitmap_ |= 140737488355328 + case "node_pools": + value := &NodePoolList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == NodePoolListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readNodePoolList(iterator) + default: + iterator.ReadAny() + } + } + object.nodePools = value + object.bitmap_ |= 281474976710656 + case "nodes": + value := readClusterNodes(iterator) + object.nodes = value + object.bitmap_ |= 562949953421312 + case "openshift_version": + value := iterator.ReadString() + object.openshiftVersion = value + object.bitmap_ |= 1125899906842624 + case "product": + value := readProduct(iterator) + object.product = value + object.bitmap_ |= 2251799813685248 + case "properties": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.properties = value + object.bitmap_ |= 4503599627370496 + case "provision_shard": + value := readProvisionShard(iterator) + object.provisionShard = value + object.bitmap_ |= 9007199254740992 + case "proxy": + value := readProxy(iterator) + object.proxy = value + object.bitmap_ |= 18014398509481984 + case "region": + value := readCloudRegion(iterator) + object.region = value + object.bitmap_ |= 36028797018963968 + case "state": + text := iterator.ReadString() + value := ClusterState(text) + object.state = value + object.bitmap_ |= 72057594037927936 + case "status": + value := readClusterStatus(iterator) + object.status = value + object.bitmap_ |= 144115188075855872 + case "storage_quota": + value := readValue(iterator) + object.storageQuota = value + object.bitmap_ |= 288230376151711744 + case "subscription": + value := readSubscription(iterator) + object.subscription = value + object.bitmap_ |= 576460752303423488 + case "version": + value := readVersion(iterator) + object.version = value + object.bitmap_ |= 1152921504606846976 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/clusterdeployment_client.go b/clustersmgmt/v2alpha1/clusterdeployment_client.go new file mode 100644 index 00000000..355349ee --- /dev/null +++ b/clustersmgmt/v2alpha1/clusterdeployment_client.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ClusterdeploymentClient is the client of the 'clusterdeployment' resource. +// +// Manages a specific clusterdeployment. +type ClusterdeploymentClient struct { + transport http.RoundTripper + path string +} + +// NewClusterdeploymentClient creates a new client for the 'clusterdeployment' +// resource using the given transport to send the requests and receive the +// responses. +func NewClusterdeploymentClient(transport http.RoundTripper, path string) *ClusterdeploymentClient { + return &ClusterdeploymentClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the clusterdeployment. +func (c *ClusterdeploymentClient) Delete() *ClusterdeploymentDeleteRequest { + return &ClusterdeploymentDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// ClusterdeploymentDeleteRequest is the request for the 'delete' method. +type ClusterdeploymentDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ClusterdeploymentDeleteRequest) Parameter(name string, value interface{}) *ClusterdeploymentDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClusterdeploymentDeleteRequest) Header(name string, value interface{}) *ClusterdeploymentDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClusterdeploymentDeleteRequest) Impersonate(user string) *ClusterdeploymentDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClusterdeploymentDeleteRequest) Send() (result *ClusterdeploymentDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClusterdeploymentDeleteRequest) SendContext(ctx context.Context) (result *ClusterdeploymentDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClusterdeploymentDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ClusterdeploymentDeleteResponse is the response for the 'delete' method. +type ClusterdeploymentDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ClusterdeploymentDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClusterdeploymentDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClusterdeploymentDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} diff --git a/clustersmgmt/v2alpha1/clusterdeployment_resource_json.go b/clustersmgmt/v2alpha1/clusterdeployment_resource_json.go new file mode 100644 index 00000000..06dafb4c --- /dev/null +++ b/clustersmgmt/v2alpha1/clusterdeployment_resource_json.go @@ -0,0 +1,29 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeClusterdeploymentDeleteRequest(request *ClusterdeploymentDeleteRequest, writer io.Writer) error { + return nil +} +func readClusterdeploymentDeleteResponse(response *ClusterdeploymentDeleteResponse, reader io.Reader) error { + return nil +} diff --git a/clustersmgmt/v2alpha1/clusters_client.go b/clustersmgmt/v2alpha1/clusters_client.go new file mode 100644 index 00000000..f21a2921 --- /dev/null +++ b/clustersmgmt/v2alpha1/clusters_client.go @@ -0,0 +1,510 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ClustersClient is the client of the 'clusters' resource. +// +// Manages the collection of clusters. +type ClustersClient struct { + transport http.RoundTripper + path string +} + +// NewClustersClient creates a new client for the 'clusters' +// resource using the given transport to send the requests and receive the +// responses. +func NewClustersClient(transport http.RoundTripper, path string) *ClustersClient { + return &ClustersClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Provision a new cluster and add it to the collection of clusters. +// +// See the `register_cluster` method for adding an existing cluster. +func (c *ClustersClient) Add() *ClustersAddRequest { + return &ClustersAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of clusters. +func (c *ClustersClient) List() *ClustersListRequest { + return &ClustersListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Cluster returns the target 'cluster' resource for the given identifier. +// +// Returns a reference to the service that manages an specific cluster. +func (c *ClustersClient) Cluster(id string) *ClusterClient { + return NewClusterClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ClustersAddRequest is the request for the 'add' method. +type ClustersAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Cluster +} + +// Parameter adds a query parameter. +func (r *ClustersAddRequest) Parameter(name string, value interface{}) *ClustersAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClustersAddRequest) Header(name string, value interface{}) *ClustersAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClustersAddRequest) Impersonate(user string) *ClustersAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the cluster. +func (r *ClustersAddRequest) Body(value *Cluster) *ClustersAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClustersAddRequest) Send() (result *ClustersAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClustersAddRequest) SendContext(ctx context.Context) (result *ClustersAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeClustersAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClustersAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClustersAddResponse(result, reader) + if err != nil { + return + } + return +} + +// ClustersAddResponse is the response for the 'add' method. +type ClustersAddResponse struct { + status int + header http.Header + err *errors.Error + body *Cluster +} + +// Status returns the response status code. +func (r *ClustersAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClustersAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClustersAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the cluster. +func (r *ClustersAddResponse) Body() *Cluster { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the cluster. +func (r *ClustersAddResponse) GetBody() (value *Cluster, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ClustersListRequest is the request for the 'list' method. +type ClustersListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *ClustersListRequest) Parameter(name string, value interface{}) *ClustersListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ClustersListRequest) Header(name string, value interface{}) *ClustersListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ClustersListRequest) Impersonate(user string) *ClustersListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to sort the clusters +// descending by region identifier the value should be: +// +// ```sql +// region.id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *ClustersListRequest) Order(value string) *ClustersListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ClustersListRequest) Page(value int) *ClustersListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to retrieve all the +// clusters with a name starting with `my` in the `us-east-1` region the value +// should be: +// +// ```sql +// name like 'my%' and region.id = 'us-east-1' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// clusters that the user has permission to see will be returned. +func (r *ClustersListRequest) Search(value string) *ClustersListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ClustersListRequest) Size(value int) *ClustersListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ClustersListRequest) Send() (result *ClustersListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ClustersListRequest) SendContext(ctx context.Context) (result *ClustersListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ClustersListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readClustersListResponse(result, reader) + if err != nil { + return + } + return +} + +// ClustersListResponse is the response for the 'list' method. +type ClustersListResponse struct { + status int + header http.Header + err *errors.Error + items *ClusterList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ClustersListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ClustersListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ClustersListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of clusters. +func (r *ClustersListResponse) Items() *ClusterList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of clusters. +func (r *ClustersListResponse) GetItems() (value *ClusterList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ClustersListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ClustersListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ClustersListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *ClustersListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ClustersListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ClustersListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/clusters_resource_json.go b/clustersmgmt/v2alpha1/clusters_resource_json.go new file mode 100644 index 00000000..5fbcda9c --- /dev/null +++ b/clustersmgmt/v2alpha1/clusters_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeClustersAddRequest(request *ClustersAddRequest, writer io.Writer) error { + return MarshalCluster(request.body, writer) +} +func readClustersAddResponse(response *ClustersAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCluster(reader) + return err +} +func writeClustersListRequest(request *ClustersListRequest, writer io.Writer) error { + return nil +} +func readClustersListResponse(response *ClustersListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readClusterList(iterator) + response.items = &ClusterList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/component_route_builder.go b/clustersmgmt/v2alpha1/component_route_builder.go new file mode 100644 index 00000000..9cd01427 --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ComponentRouteBuilder contains the data and logic needed to build 'component_route' objects. +// +// Representation of a Component Route. +type ComponentRouteBuilder struct { + bitmap_ uint32 + id string + href string + hostname string + tlsSecretRef string +} + +// NewComponentRoute creates a new builder of 'component_route' objects. +func NewComponentRoute() *ComponentRouteBuilder { + return &ComponentRouteBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ComponentRouteBuilder) Link(value bool) *ComponentRouteBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ComponentRouteBuilder) ID(value string) *ComponentRouteBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ComponentRouteBuilder) HREF(value string) *ComponentRouteBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ComponentRouteBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Hostname sets the value of the 'hostname' attribute to the given value. +func (b *ComponentRouteBuilder) Hostname(value string) *ComponentRouteBuilder { + b.hostname = value + b.bitmap_ |= 8 + return b +} + +// TlsSecretRef sets the value of the 'tls_secret_ref' attribute to the given value. +func (b *ComponentRouteBuilder) TlsSecretRef(value string) *ComponentRouteBuilder { + b.tlsSecretRef = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ComponentRouteBuilder) Copy(object *ComponentRoute) *ComponentRouteBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.hostname = object.hostname + b.tlsSecretRef = object.tlsSecretRef + return b +} + +// Build creates a 'component_route' object using the configuration stored in the builder. +func (b *ComponentRouteBuilder) Build() (object *ComponentRoute, err error) { + object = new(ComponentRoute) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.hostname = b.hostname + object.tlsSecretRef = b.tlsSecretRef + return +} diff --git a/clustersmgmt/v2alpha1/component_route_list_builder.go b/clustersmgmt/v2alpha1/component_route_list_builder.go new file mode 100644 index 00000000..3cfd0386 --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ComponentRouteListBuilder contains the data and logic needed to build +// 'component_route' objects. +type ComponentRouteListBuilder struct { + items []*ComponentRouteBuilder +} + +// NewComponentRouteList creates a new builder of 'component_route' objects. +func NewComponentRouteList() *ComponentRouteListBuilder { + return new(ComponentRouteListBuilder) +} + +// Items sets the items of the list. +func (b *ComponentRouteListBuilder) Items(values ...*ComponentRouteBuilder) *ComponentRouteListBuilder { + b.items = make([]*ComponentRouteBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ComponentRouteListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ComponentRouteListBuilder) Copy(list *ComponentRouteList) *ComponentRouteListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ComponentRouteBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewComponentRoute().Copy(v) + } + } + return b +} + +// Build creates a list of 'component_route' objects using the +// configuration stored in the builder. +func (b *ComponentRouteListBuilder) Build() (list *ComponentRouteList, err error) { + items := make([]*ComponentRoute, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ComponentRouteList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/component_route_list_type_json.go b/clustersmgmt/v2alpha1/component_route_list_type_json.go new file mode 100644 index 00000000..ac6f375d --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalComponentRouteList writes a list of values of the 'component_route' type to +// the given writer. +func MarshalComponentRouteList(list []*ComponentRoute, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeComponentRouteList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeComponentRouteList writes a list of value of the 'component_route' type to +// the given stream. +func writeComponentRouteList(list []*ComponentRoute, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeComponentRoute(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalComponentRouteList reads a list of values of the 'component_route' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalComponentRouteList(source interface{}) (items []*ComponentRoute, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readComponentRouteList(iterator) + err = iterator.Error + return +} + +// readComponentRouteList reads list of values of the ”component_route' type from +// the given iterator. +func readComponentRouteList(iterator *jsoniter.Iterator) []*ComponentRoute { + list := []*ComponentRoute{} + for iterator.ReadArray() { + item := readComponentRoute(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/component_route_type.go b/clustersmgmt/v2alpha1/component_route_type.go new file mode 100644 index 00000000..dc0f655d --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ComponentRouteKind is the name of the type used to represent objects +// of type 'component_route'. +const ComponentRouteKind = "ComponentRoute" + +// ComponentRouteLinkKind is the name of the type used to represent links +// to objects of type 'component_route'. +const ComponentRouteLinkKind = "ComponentRouteLink" + +// ComponentRouteNilKind is the name of the type used to nil references +// to objects of type 'component_route'. +const ComponentRouteNilKind = "ComponentRouteNil" + +// ComponentRoute represents the values of the 'component_route' type. +// +// Representation of a Component Route. +type ComponentRoute struct { + bitmap_ uint32 + id string + href string + hostname string + tlsSecretRef string +} + +// Kind returns the name of the type of the object. +func (o *ComponentRoute) Kind() string { + if o == nil { + return ComponentRouteNilKind + } + if o.bitmap_&1 != 0 { + return ComponentRouteLinkKind + } + return ComponentRouteKind +} + +// Link returns true iif this is a link. +func (o *ComponentRoute) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ComponentRoute) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ComponentRoute) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ComponentRoute) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ComponentRoute) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ComponentRoute) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Hostname returns the value of the 'hostname' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Hostname of the route. +func (o *ComponentRoute) Hostname() string { + if o != nil && o.bitmap_&8 != 0 { + return o.hostname + } + return "" +} + +// GetHostname returns the value of the 'hostname' attribute and +// a flag indicating if the attribute has a value. +// +// Hostname of the route. +func (o *ComponentRoute) GetHostname() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.hostname + } + return +} + +// TlsSecretRef returns the value of the 'tls_secret_ref' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// TLS Secret reference of the route. +func (o *ComponentRoute) TlsSecretRef() string { + if o != nil && o.bitmap_&16 != 0 { + return o.tlsSecretRef + } + return "" +} + +// GetTlsSecretRef returns the value of the 'tls_secret_ref' attribute and +// a flag indicating if the attribute has a value. +// +// TLS Secret reference of the route. +func (o *ComponentRoute) GetTlsSecretRef() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.tlsSecretRef + } + return +} + +// ComponentRouteListKind is the name of the type used to represent list of objects of +// type 'component_route'. +const ComponentRouteListKind = "ComponentRouteList" + +// ComponentRouteListLinkKind is the name of the type used to represent links to list +// of objects of type 'component_route'. +const ComponentRouteListLinkKind = "ComponentRouteListLink" + +// ComponentRouteNilKind is the name of the type used to nil lists of objects of +// type 'component_route'. +const ComponentRouteListNilKind = "ComponentRouteListNil" + +// ComponentRouteList is a list of values of the 'component_route' type. +type ComponentRouteList struct { + href string + link bool + items []*ComponentRoute +} + +// Kind returns the name of the type of the object. +func (l *ComponentRouteList) Kind() string { + if l == nil { + return ComponentRouteListNilKind + } + if l.link { + return ComponentRouteListLinkKind + } + return ComponentRouteListKind +} + +// Link returns true iif this is a link. +func (l *ComponentRouteList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ComponentRouteList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ComponentRouteList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ComponentRouteList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ComponentRouteList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ComponentRouteList) Get(i int) *ComponentRoute { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ComponentRouteList) Slice() []*ComponentRoute { + var slice []*ComponentRoute + if l == nil { + slice = make([]*ComponentRoute, 0) + } else { + slice = make([]*ComponentRoute, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ComponentRouteList) Each(f func(item *ComponentRoute) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ComponentRouteList) Range(f func(index int, item *ComponentRoute) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/component_route_type_json.go b/clustersmgmt/v2alpha1/component_route_type_json.go new file mode 100644 index 00000000..4fa61a9f --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalComponentRoute writes a value of the 'component_route' type to the given writer. +func MarshalComponentRoute(object *ComponentRoute, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeComponentRoute(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeComponentRoute writes a value of the 'component_route' type to the given stream. +func writeComponentRoute(object *ComponentRoute, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ComponentRouteLinkKind) + } else { + stream.WriteString(ComponentRouteKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hostname") + stream.WriteString(object.hostname) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tls_secret_ref") + stream.WriteString(object.tlsSecretRef) + } + stream.WriteObjectEnd() +} + +// UnmarshalComponentRoute reads a value of the 'component_route' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalComponentRoute(source interface{}) (object *ComponentRoute, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readComponentRoute(iterator) + err = iterator.Error + return +} + +// readComponentRoute reads a value of the 'component_route' type from the given iterator. +func readComponentRoute(iterator *jsoniter.Iterator) *ComponentRoute { + object := &ComponentRoute{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ComponentRouteLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "hostname": + value := iterator.ReadString() + object.hostname = value + object.bitmap_ |= 8 + case "tls_secret_ref": + value := iterator.ReadString() + object.tlsSecretRef = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/component_route_type_list_type_json.go b/clustersmgmt/v2alpha1/component_route_type_list_type_json.go new file mode 100644 index 00000000..8b0f13d4 --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalComponentRouteTypeList writes a list of values of the 'component_route_type' type to +// the given writer. +func MarshalComponentRouteTypeList(list []ComponentRouteType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeComponentRouteTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeComponentRouteTypeList writes a list of value of the 'component_route_type' type to +// the given stream. +func writeComponentRouteTypeList(list []ComponentRouteType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalComponentRouteTypeList reads a list of values of the 'component_route_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalComponentRouteTypeList(source interface{}) (items []ComponentRouteType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readComponentRouteTypeList(iterator) + err = iterator.Error + return +} + +// readComponentRouteTypeList reads list of values of the ”component_route_type' type from +// the given iterator. +func readComponentRouteTypeList(iterator *jsoniter.Iterator) []ComponentRouteType { + list := []ComponentRouteType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ComponentRouteType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/component_route_type_type.go b/clustersmgmt/v2alpha1/component_route_type_type.go new file mode 100644 index 00000000..73b7e159 --- /dev/null +++ b/clustersmgmt/v2alpha1/component_route_type_type.go @@ -0,0 +1,32 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ComponentRouteType represents the values of the 'component_route_type' enumerated type. +type ComponentRouteType string + +const ( + // + ComponentRouteTypeConsole ComponentRouteType = "console" + // + ComponentRouteTypeDownloads ComponentRouteType = "downloads" + // + ComponentRouteTypeOauth ComponentRouteType = "oauth" +) diff --git a/clustersmgmt/v2alpha1/control_plane_client.go b/clustersmgmt/v2alpha1/control_plane_client.go new file mode 100644 index 00000000..4b25dd5c --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_client.go @@ -0,0 +1,53 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "net/http" + "path" +) + +// ControlPlaneClient is the client of the 'control_plane' resource. +// +// Manages a specific upgrade policy. +type ControlPlaneClient struct { + transport http.RoundTripper + path string +} + +// NewControlPlaneClient creates a new client for the 'control_plane' +// resource using the given transport to send the requests and receive the +// responses. +func NewControlPlaneClient(transport http.RoundTripper, path string) *ControlPlaneClient { + return &ControlPlaneClient{ + transport: transport, + path: path, + } +} + +// UpgradePolicies returns the target 'control_plane_upgrade_policies' resource. +// +// Reference to the state of the upgrade policy. +func (c *ControlPlaneClient) UpgradePolicies() *ControlPlaneUpgradePoliciesClient { + return NewControlPlaneUpgradePoliciesClient( + c.transport, + path.Join(c.path, "upgrade_policies"), + ) +} diff --git a/clustersmgmt/v2alpha1/control_plane_resource_json.go b/clustersmgmt/v2alpha1/control_plane_resource_json.go new file mode 100644 index 00000000..45f0dd4e --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_resource_json.go @@ -0,0 +1,20 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policies_client.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policies_client.go new file mode 100644 index 00000000..02d5874f --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policies_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ControlPlaneUpgradePoliciesClient is the client of the 'control_plane_upgrade_policies' resource. +// +// Manages the collection of upgrade policies for the control plane of a cluster. +type ControlPlaneUpgradePoliciesClient struct { + transport http.RoundTripper + path string +} + +// NewControlPlaneUpgradePoliciesClient creates a new client for the 'control_plane_upgrade_policies' +// resource using the given transport to send the requests and receive the +// responses. +func NewControlPlaneUpgradePoliciesClient(transport http.RoundTripper, path string) *ControlPlaneUpgradePoliciesClient { + return &ControlPlaneUpgradePoliciesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new upgrade policy to the control plane of the cluster. +func (c *ControlPlaneUpgradePoliciesClient) Add() *ControlPlaneUpgradePoliciesAddRequest { + return &ControlPlaneUpgradePoliciesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of upgrade policies for the control plane. +func (c *ControlPlaneUpgradePoliciesClient) List() *ControlPlaneUpgradePoliciesListRequest { + return &ControlPlaneUpgradePoliciesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// ControlPlaneUpgradePolicy returns the target 'control_plane_upgrade_policy' resource for the given identifier. +// +// Reference to the service that manages an specific upgrade policy for the control plane. +func (c *ControlPlaneUpgradePoliciesClient) ControlPlaneUpgradePolicy(id string) *ControlPlaneUpgradePolicyClient { + return NewControlPlaneUpgradePolicyClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ControlPlaneUpgradePoliciesAddRequest is the request for the 'add' method. +type ControlPlaneUpgradePoliciesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ControlPlaneUpgradePolicy +} + +// Parameter adds a query parameter. +func (r *ControlPlaneUpgradePoliciesAddRequest) Parameter(name string, value interface{}) *ControlPlaneUpgradePoliciesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ControlPlaneUpgradePoliciesAddRequest) Header(name string, value interface{}) *ControlPlaneUpgradePoliciesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ControlPlaneUpgradePoliciesAddRequest) Impersonate(user string) *ControlPlaneUpgradePoliciesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *ControlPlaneUpgradePoliciesAddRequest) Body(value *ControlPlaneUpgradePolicy) *ControlPlaneUpgradePoliciesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ControlPlaneUpgradePoliciesAddRequest) Send() (result *ControlPlaneUpgradePoliciesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ControlPlaneUpgradePoliciesAddRequest) SendContext(ctx context.Context) (result *ControlPlaneUpgradePoliciesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeControlPlaneUpgradePoliciesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ControlPlaneUpgradePoliciesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readControlPlaneUpgradePoliciesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// ControlPlaneUpgradePoliciesAddResponse is the response for the 'add' method. +type ControlPlaneUpgradePoliciesAddResponse struct { + status int + header http.Header + err *errors.Error + body *ControlPlaneUpgradePolicy +} + +// Status returns the response status code. +func (r *ControlPlaneUpgradePoliciesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ControlPlaneUpgradePoliciesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ControlPlaneUpgradePoliciesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *ControlPlaneUpgradePoliciesAddResponse) Body() *ControlPlaneUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the upgrade policy. +func (r *ControlPlaneUpgradePoliciesAddResponse) GetBody() (value *ControlPlaneUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ControlPlaneUpgradePoliciesListRequest is the request for the 'list' method. +type ControlPlaneUpgradePoliciesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *ControlPlaneUpgradePoliciesListRequest) Parameter(name string, value interface{}) *ControlPlaneUpgradePoliciesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ControlPlaneUpgradePoliciesListRequest) Header(name string, value interface{}) *ControlPlaneUpgradePoliciesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ControlPlaneUpgradePoliciesListRequest) Impersonate(user string) *ControlPlaneUpgradePoliciesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ControlPlaneUpgradePoliciesListRequest) Page(value int) *ControlPlaneUpgradePoliciesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *ControlPlaneUpgradePoliciesListRequest) Size(value int) *ControlPlaneUpgradePoliciesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ControlPlaneUpgradePoliciesListRequest) Send() (result *ControlPlaneUpgradePoliciesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ControlPlaneUpgradePoliciesListRequest) SendContext(ctx context.Context) (result *ControlPlaneUpgradePoliciesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ControlPlaneUpgradePoliciesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readControlPlaneUpgradePoliciesListResponse(result, reader) + if err != nil { + return + } + return +} + +// ControlPlaneUpgradePoliciesListResponse is the response for the 'list' method. +type ControlPlaneUpgradePoliciesListResponse struct { + status int + header http.Header + err *errors.Error + items *ControlPlaneUpgradePolicyList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ControlPlaneUpgradePoliciesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ControlPlaneUpgradePoliciesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ControlPlaneUpgradePoliciesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of upgrade policy. +func (r *ControlPlaneUpgradePoliciesListResponse) Items() *ControlPlaneUpgradePolicyList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of upgrade policy. +func (r *ControlPlaneUpgradePoliciesListResponse) GetItems() (value *ControlPlaneUpgradePolicyList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ControlPlaneUpgradePoliciesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ControlPlaneUpgradePoliciesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *ControlPlaneUpgradePoliciesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *ControlPlaneUpgradePoliciesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *ControlPlaneUpgradePoliciesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *ControlPlaneUpgradePoliciesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policies_resource_json.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policies_resource_json.go new file mode 100644 index 00000000..5aa2b6c5 --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policies_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeControlPlaneUpgradePoliciesAddRequest(request *ControlPlaneUpgradePoliciesAddRequest, writer io.Writer) error { + return MarshalControlPlaneUpgradePolicy(request.body, writer) +} +func readControlPlaneUpgradePoliciesAddResponse(response *ControlPlaneUpgradePoliciesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalControlPlaneUpgradePolicy(reader) + return err +} +func writeControlPlaneUpgradePoliciesListRequest(request *ControlPlaneUpgradePoliciesListRequest, writer io.Writer) error { + return nil +} +func readControlPlaneUpgradePoliciesListResponse(response *ControlPlaneUpgradePoliciesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readControlPlaneUpgradePolicyList(iterator) + response.items = &ControlPlaneUpgradePolicyList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_builder.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_builder.go new file mode 100644 index 00000000..10dca3a3 --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_builder.go @@ -0,0 +1,202 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ControlPlaneUpgradePolicyBuilder contains the data and logic needed to build 'control_plane_upgrade_policy' objects. +// +// Representation of an upgrade policy that can be set for a cluster. +type ControlPlaneUpgradePolicyBuilder struct { + bitmap_ uint32 + id string + href string + clusterID string + creationTimestamp time.Time + lastUpdateTimestamp time.Time + nextRun time.Time + schedule string + scheduleType ScheduleType + state *UpgradePolicyStateBuilder + upgradeType UpgradeType + version string + enableMinorVersionUpgrades bool +} + +// NewControlPlaneUpgradePolicy creates a new builder of 'control_plane_upgrade_policy' objects. +func NewControlPlaneUpgradePolicy() *ControlPlaneUpgradePolicyBuilder { + return &ControlPlaneUpgradePolicyBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ControlPlaneUpgradePolicyBuilder) Link(value bool) *ControlPlaneUpgradePolicyBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ControlPlaneUpgradePolicyBuilder) ID(value string) *ControlPlaneUpgradePolicyBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ControlPlaneUpgradePolicyBuilder) HREF(value string) *ControlPlaneUpgradePolicyBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ControlPlaneUpgradePolicyBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ClusterID sets the value of the 'cluster_ID' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) ClusterID(value string) *ControlPlaneUpgradePolicyBuilder { + b.clusterID = value + b.bitmap_ |= 8 + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) CreationTimestamp(value time.Time) *ControlPlaneUpgradePolicyBuilder { + b.creationTimestamp = value + b.bitmap_ |= 16 + return b +} + +// EnableMinorVersionUpgrades sets the value of the 'enable_minor_version_upgrades' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) EnableMinorVersionUpgrades(value bool) *ControlPlaneUpgradePolicyBuilder { + b.enableMinorVersionUpgrades = value + b.bitmap_ |= 32 + return b +} + +// LastUpdateTimestamp sets the value of the 'last_update_timestamp' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) LastUpdateTimestamp(value time.Time) *ControlPlaneUpgradePolicyBuilder { + b.lastUpdateTimestamp = value + b.bitmap_ |= 64 + return b +} + +// NextRun sets the value of the 'next_run' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) NextRun(value time.Time) *ControlPlaneUpgradePolicyBuilder { + b.nextRun = value + b.bitmap_ |= 128 + return b +} + +// Schedule sets the value of the 'schedule' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) Schedule(value string) *ControlPlaneUpgradePolicyBuilder { + b.schedule = value + b.bitmap_ |= 256 + return b +} + +// ScheduleType sets the value of the 'schedule_type' attribute to the given value. +// +// ScheduleType defines which type of scheduling should be used for the upgrade policy. +func (b *ControlPlaneUpgradePolicyBuilder) ScheduleType(value ScheduleType) *ControlPlaneUpgradePolicyBuilder { + b.scheduleType = value + b.bitmap_ |= 512 + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// Representation of an upgrade policy state that that is set for a cluster. +func (b *ControlPlaneUpgradePolicyBuilder) State(value *UpgradePolicyStateBuilder) *ControlPlaneUpgradePolicyBuilder { + b.state = value + if value != nil { + b.bitmap_ |= 1024 + } else { + b.bitmap_ &^= 1024 + } + return b +} + +// UpgradeType sets the value of the 'upgrade_type' attribute to the given value. +// +// UpgradeType defines which type of upgrade should be used. +func (b *ControlPlaneUpgradePolicyBuilder) UpgradeType(value UpgradeType) *ControlPlaneUpgradePolicyBuilder { + b.upgradeType = value + b.bitmap_ |= 2048 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +func (b *ControlPlaneUpgradePolicyBuilder) Version(value string) *ControlPlaneUpgradePolicyBuilder { + b.version = value + b.bitmap_ |= 4096 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ControlPlaneUpgradePolicyBuilder) Copy(object *ControlPlaneUpgradePolicy) *ControlPlaneUpgradePolicyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.clusterID = object.clusterID + b.creationTimestamp = object.creationTimestamp + b.enableMinorVersionUpgrades = object.enableMinorVersionUpgrades + b.lastUpdateTimestamp = object.lastUpdateTimestamp + b.nextRun = object.nextRun + b.schedule = object.schedule + b.scheduleType = object.scheduleType + if object.state != nil { + b.state = NewUpgradePolicyState().Copy(object.state) + } else { + b.state = nil + } + b.upgradeType = object.upgradeType + b.version = object.version + return b +} + +// Build creates a 'control_plane_upgrade_policy' object using the configuration stored in the builder. +func (b *ControlPlaneUpgradePolicyBuilder) Build() (object *ControlPlaneUpgradePolicy, err error) { + object = new(ControlPlaneUpgradePolicy) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.clusterID = b.clusterID + object.creationTimestamp = b.creationTimestamp + object.enableMinorVersionUpgrades = b.enableMinorVersionUpgrades + object.lastUpdateTimestamp = b.lastUpdateTimestamp + object.nextRun = b.nextRun + object.schedule = b.schedule + object.scheduleType = b.scheduleType + if b.state != nil { + object.state, err = b.state.Build() + if err != nil { + return + } + } + object.upgradeType = b.upgradeType + object.version = b.version + return +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_client.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_client.go new file mode 100644 index 00000000..3936d9aa --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ControlPlaneUpgradePolicyClient is the client of the 'control_plane_upgrade_policy' resource. +// +// Manages a specific upgrade policy for the control plane. +type ControlPlaneUpgradePolicyClient struct { + transport http.RoundTripper + path string +} + +// NewControlPlaneUpgradePolicyClient creates a new client for the 'control_plane_upgrade_policy' +// resource using the given transport to send the requests and receive the +// responses. +func NewControlPlaneUpgradePolicyClient(transport http.RoundTripper, path string) *ControlPlaneUpgradePolicyClient { + return &ControlPlaneUpgradePolicyClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the upgrade policy for the control plane. +func (c *ControlPlaneUpgradePolicyClient) Delete() *ControlPlaneUpgradePolicyDeleteRequest { + return &ControlPlaneUpgradePolicyDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the upgrade policy for the control plane. +func (c *ControlPlaneUpgradePolicyClient) Get() *ControlPlaneUpgradePolicyGetRequest { + return &ControlPlaneUpgradePolicyGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the upgrade policy for the control plane. +func (c *ControlPlaneUpgradePolicyClient) Update() *ControlPlaneUpgradePolicyUpdateRequest { + return &ControlPlaneUpgradePolicyUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// ControlPlaneUpgradePolicyPollRequest is the request for the Poll method. +type ControlPlaneUpgradePolicyPollRequest struct { + request *ControlPlaneUpgradePolicyGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ControlPlaneUpgradePolicyPollRequest) Parameter(name string, value interface{}) *ControlPlaneUpgradePolicyPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ControlPlaneUpgradePolicyPollRequest) Header(name string, value interface{}) *ControlPlaneUpgradePolicyPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ControlPlaneUpgradePolicyPollRequest) Interval(value time.Duration) *ControlPlaneUpgradePolicyPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ControlPlaneUpgradePolicyPollRequest) Status(value int) *ControlPlaneUpgradePolicyPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ControlPlaneUpgradePolicyPollRequest) Predicate(value func(*ControlPlaneUpgradePolicyGetResponse) bool) *ControlPlaneUpgradePolicyPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ControlPlaneUpgradePolicyGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ControlPlaneUpgradePolicyPollRequest) StartContext(ctx context.Context) (response *ControlPlaneUpgradePolicyPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ControlPlaneUpgradePolicyPollResponse{ + response: result.(*ControlPlaneUpgradePolicyGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ControlPlaneUpgradePolicyPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ControlPlaneUpgradePolicyPollResponse is the response for the Poll method. +type ControlPlaneUpgradePolicyPollResponse struct { + response *ControlPlaneUpgradePolicyGetResponse +} + +// Status returns the response status code. +func (r *ControlPlaneUpgradePolicyPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ControlPlaneUpgradePolicyPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ControlPlaneUpgradePolicyPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ControlPlaneUpgradePolicyPollResponse) Body() *ControlPlaneUpgradePolicy { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ControlPlaneUpgradePolicyPollResponse) GetBody() (value *ControlPlaneUpgradePolicy, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ControlPlaneUpgradePolicyClient) Poll() *ControlPlaneUpgradePolicyPollRequest { + return &ControlPlaneUpgradePolicyPollRequest{ + request: c.Get(), + } +} + +// ControlPlaneUpgradePolicyDeleteRequest is the request for the 'delete' method. +type ControlPlaneUpgradePolicyDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ControlPlaneUpgradePolicyDeleteRequest) Parameter(name string, value interface{}) *ControlPlaneUpgradePolicyDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ControlPlaneUpgradePolicyDeleteRequest) Header(name string, value interface{}) *ControlPlaneUpgradePolicyDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ControlPlaneUpgradePolicyDeleteRequest) Impersonate(user string) *ControlPlaneUpgradePolicyDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ControlPlaneUpgradePolicyDeleteRequest) Send() (result *ControlPlaneUpgradePolicyDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ControlPlaneUpgradePolicyDeleteRequest) SendContext(ctx context.Context) (result *ControlPlaneUpgradePolicyDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ControlPlaneUpgradePolicyDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ControlPlaneUpgradePolicyDeleteResponse is the response for the 'delete' method. +type ControlPlaneUpgradePolicyDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ControlPlaneUpgradePolicyDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ControlPlaneUpgradePolicyDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ControlPlaneUpgradePolicyDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ControlPlaneUpgradePolicyGetRequest is the request for the 'get' method. +type ControlPlaneUpgradePolicyGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ControlPlaneUpgradePolicyGetRequest) Parameter(name string, value interface{}) *ControlPlaneUpgradePolicyGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ControlPlaneUpgradePolicyGetRequest) Header(name string, value interface{}) *ControlPlaneUpgradePolicyGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ControlPlaneUpgradePolicyGetRequest) Impersonate(user string) *ControlPlaneUpgradePolicyGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ControlPlaneUpgradePolicyGetRequest) Send() (result *ControlPlaneUpgradePolicyGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ControlPlaneUpgradePolicyGetRequest) SendContext(ctx context.Context) (result *ControlPlaneUpgradePolicyGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ControlPlaneUpgradePolicyGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readControlPlaneUpgradePolicyGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ControlPlaneUpgradePolicyGetResponse is the response for the 'get' method. +type ControlPlaneUpgradePolicyGetResponse struct { + status int + header http.Header + err *errors.Error + body *ControlPlaneUpgradePolicy +} + +// Status returns the response status code. +func (r *ControlPlaneUpgradePolicyGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ControlPlaneUpgradePolicyGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ControlPlaneUpgradePolicyGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ControlPlaneUpgradePolicyGetResponse) Body() *ControlPlaneUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ControlPlaneUpgradePolicyGetResponse) GetBody() (value *ControlPlaneUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ControlPlaneUpgradePolicyUpdateRequest is the request for the 'update' method. +type ControlPlaneUpgradePolicyUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ControlPlaneUpgradePolicy +} + +// Parameter adds a query parameter. +func (r *ControlPlaneUpgradePolicyUpdateRequest) Parameter(name string, value interface{}) *ControlPlaneUpgradePolicyUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ControlPlaneUpgradePolicyUpdateRequest) Header(name string, value interface{}) *ControlPlaneUpgradePolicyUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ControlPlaneUpgradePolicyUpdateRequest) Impersonate(user string) *ControlPlaneUpgradePolicyUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *ControlPlaneUpgradePolicyUpdateRequest) Body(value *ControlPlaneUpgradePolicy) *ControlPlaneUpgradePolicyUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ControlPlaneUpgradePolicyUpdateRequest) Send() (result *ControlPlaneUpgradePolicyUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ControlPlaneUpgradePolicyUpdateRequest) SendContext(ctx context.Context) (result *ControlPlaneUpgradePolicyUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeControlPlaneUpgradePolicyUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ControlPlaneUpgradePolicyUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readControlPlaneUpgradePolicyUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// ControlPlaneUpgradePolicyUpdateResponse is the response for the 'update' method. +type ControlPlaneUpgradePolicyUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *ControlPlaneUpgradePolicy +} + +// Status returns the response status code. +func (r *ControlPlaneUpgradePolicyUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ControlPlaneUpgradePolicyUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ControlPlaneUpgradePolicyUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ControlPlaneUpgradePolicyUpdateResponse) Body() *ControlPlaneUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ControlPlaneUpgradePolicyUpdateResponse) GetBody() (value *ControlPlaneUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_list_builder.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_list_builder.go new file mode 100644 index 00000000..ab9a048f --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ControlPlaneUpgradePolicyListBuilder contains the data and logic needed to build +// 'control_plane_upgrade_policy' objects. +type ControlPlaneUpgradePolicyListBuilder struct { + items []*ControlPlaneUpgradePolicyBuilder +} + +// NewControlPlaneUpgradePolicyList creates a new builder of 'control_plane_upgrade_policy' objects. +func NewControlPlaneUpgradePolicyList() *ControlPlaneUpgradePolicyListBuilder { + return new(ControlPlaneUpgradePolicyListBuilder) +} + +// Items sets the items of the list. +func (b *ControlPlaneUpgradePolicyListBuilder) Items(values ...*ControlPlaneUpgradePolicyBuilder) *ControlPlaneUpgradePolicyListBuilder { + b.items = make([]*ControlPlaneUpgradePolicyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ControlPlaneUpgradePolicyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ControlPlaneUpgradePolicyListBuilder) Copy(list *ControlPlaneUpgradePolicyList) *ControlPlaneUpgradePolicyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ControlPlaneUpgradePolicyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewControlPlaneUpgradePolicy().Copy(v) + } + } + return b +} + +// Build creates a list of 'control_plane_upgrade_policy' objects using the +// configuration stored in the builder. +func (b *ControlPlaneUpgradePolicyListBuilder) Build() (list *ControlPlaneUpgradePolicyList, err error) { + items := make([]*ControlPlaneUpgradePolicy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ControlPlaneUpgradePolicyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_list_type_json.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_list_type_json.go new file mode 100644 index 00000000..a31fe7d9 --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalControlPlaneUpgradePolicyList writes a list of values of the 'control_plane_upgrade_policy' type to +// the given writer. +func MarshalControlPlaneUpgradePolicyList(list []*ControlPlaneUpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeControlPlaneUpgradePolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeControlPlaneUpgradePolicyList writes a list of value of the 'control_plane_upgrade_policy' type to +// the given stream. +func writeControlPlaneUpgradePolicyList(list []*ControlPlaneUpgradePolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeControlPlaneUpgradePolicy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalControlPlaneUpgradePolicyList reads a list of values of the 'control_plane_upgrade_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalControlPlaneUpgradePolicyList(source interface{}) (items []*ControlPlaneUpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readControlPlaneUpgradePolicyList(iterator) + err = iterator.Error + return +} + +// readControlPlaneUpgradePolicyList reads list of values of the ”control_plane_upgrade_policy' type from +// the given iterator. +func readControlPlaneUpgradePolicyList(iterator *jsoniter.Iterator) []*ControlPlaneUpgradePolicy { + list := []*ControlPlaneUpgradePolicy{} + for iterator.ReadArray() { + item := readControlPlaneUpgradePolicy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_resource_json.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_resource_json.go new file mode 100644 index 00000000..8fe77b61 --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeControlPlaneUpgradePolicyDeleteRequest(request *ControlPlaneUpgradePolicyDeleteRequest, writer io.Writer) error { + return nil +} +func readControlPlaneUpgradePolicyDeleteResponse(response *ControlPlaneUpgradePolicyDeleteResponse, reader io.Reader) error { + return nil +} +func writeControlPlaneUpgradePolicyGetRequest(request *ControlPlaneUpgradePolicyGetRequest, writer io.Writer) error { + return nil +} +func readControlPlaneUpgradePolicyGetResponse(response *ControlPlaneUpgradePolicyGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalControlPlaneUpgradePolicy(reader) + return err +} +func writeControlPlaneUpgradePolicyUpdateRequest(request *ControlPlaneUpgradePolicyUpdateRequest, writer io.Writer) error { + return MarshalControlPlaneUpgradePolicy(request.body, writer) +} +func readControlPlaneUpgradePolicyUpdateResponse(response *ControlPlaneUpgradePolicyUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalControlPlaneUpgradePolicy(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_type.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_type.go new file mode 100644 index 00000000..cab28fdf --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_type.go @@ -0,0 +1,462 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ControlPlaneUpgradePolicyKind is the name of the type used to represent objects +// of type 'control_plane_upgrade_policy'. +const ControlPlaneUpgradePolicyKind = "ControlPlaneUpgradePolicy" + +// ControlPlaneUpgradePolicyLinkKind is the name of the type used to represent links +// to objects of type 'control_plane_upgrade_policy'. +const ControlPlaneUpgradePolicyLinkKind = "ControlPlaneUpgradePolicyLink" + +// ControlPlaneUpgradePolicyNilKind is the name of the type used to nil references +// to objects of type 'control_plane_upgrade_policy'. +const ControlPlaneUpgradePolicyNilKind = "ControlPlaneUpgradePolicyNil" + +// ControlPlaneUpgradePolicy represents the values of the 'control_plane_upgrade_policy' type. +// +// Representation of an upgrade policy that can be set for a cluster. +type ControlPlaneUpgradePolicy struct { + bitmap_ uint32 + id string + href string + clusterID string + creationTimestamp time.Time + lastUpdateTimestamp time.Time + nextRun time.Time + schedule string + scheduleType ScheduleType + state *UpgradePolicyState + upgradeType UpgradeType + version string + enableMinorVersionUpgrades bool +} + +// Kind returns the name of the type of the object. +func (o *ControlPlaneUpgradePolicy) Kind() string { + if o == nil { + return ControlPlaneUpgradePolicyNilKind + } + if o.bitmap_&1 != 0 { + return ControlPlaneUpgradePolicyLinkKind + } + return ControlPlaneUpgradePolicyKind +} + +// Link returns true iif this is a link. +func (o *ControlPlaneUpgradePolicy) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ControlPlaneUpgradePolicy) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ControlPlaneUpgradePolicy) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ControlPlaneUpgradePolicy) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ControlPlaneUpgradePolicy) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ControlPlaneUpgradePolicy) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ClusterID returns the value of the 'cluster_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster ID this upgrade policy for control plane is defined for. +func (o *ControlPlaneUpgradePolicy) ClusterID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clusterID + } + return "" +} + +// GetClusterID returns the value of the 'cluster_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster ID this upgrade policy for control plane is defined for. +func (o *ControlPlaneUpgradePolicy) GetClusterID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clusterID + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Timestamp for creation of resource. +func (o *ControlPlaneUpgradePolicy) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Timestamp for creation of resource. +func (o *ControlPlaneUpgradePolicy) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// EnableMinorVersionUpgrades returns the value of the 'enable_minor_version_upgrades' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed). +func (o *ControlPlaneUpgradePolicy) EnableMinorVersionUpgrades() bool { + if o != nil && o.bitmap_&32 != 0 { + return o.enableMinorVersionUpgrades + } + return false +} + +// GetEnableMinorVersionUpgrades returns the value of the 'enable_minor_version_upgrades' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed). +func (o *ControlPlaneUpgradePolicy) GetEnableMinorVersionUpgrades() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.enableMinorVersionUpgrades + } + return +} + +// LastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Timestamp for last update that happened to resource. +func (o *ControlPlaneUpgradePolicy) LastUpdateTimestamp() time.Time { + if o != nil && o.bitmap_&64 != 0 { + return o.lastUpdateTimestamp + } + return time.Time{} +} + +// GetLastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Timestamp for last update that happened to resource. +func (o *ControlPlaneUpgradePolicy) GetLastUpdateTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.lastUpdateTimestamp + } + return +} + +// NextRun returns the value of the 'next_run' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Next time the upgrade should run. +func (o *ControlPlaneUpgradePolicy) NextRun() time.Time { + if o != nil && o.bitmap_&128 != 0 { + return o.nextRun + } + return time.Time{} +} + +// GetNextRun returns the value of the 'next_run' attribute and +// a flag indicating if the attribute has a value. +// +// Next time the upgrade should run. +func (o *ControlPlaneUpgradePolicy) GetNextRun() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.nextRun + } + return +} + +// Schedule returns the value of the 'schedule' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *ControlPlaneUpgradePolicy) Schedule() string { + if o != nil && o.bitmap_&256 != 0 { + return o.schedule + } + return "" +} + +// GetSchedule returns the value of the 'schedule' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *ControlPlaneUpgradePolicy) GetSchedule() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.schedule + } + return +} + +// ScheduleType returns the value of the 'schedule_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule type of the control plane upgrade. +func (o *ControlPlaneUpgradePolicy) ScheduleType() ScheduleType { + if o != nil && o.bitmap_&512 != 0 { + return o.scheduleType + } + return ScheduleType("") +} + +// GetScheduleType returns the value of the 'schedule_type' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule type of the control plane upgrade. +func (o *ControlPlaneUpgradePolicy) GetScheduleType() (value ScheduleType, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.scheduleType + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State of the upgrade policy for the hosted control plane. +func (o *ControlPlaneUpgradePolicy) State() *UpgradePolicyState { + if o != nil && o.bitmap_&1024 != 0 { + return o.state + } + return nil +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// State of the upgrade policy for the hosted control plane. +func (o *ControlPlaneUpgradePolicy) GetState() (value *UpgradePolicyState, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.state + } + return +} + +// UpgradeType returns the value of the 'upgrade_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Upgrade type of the control plane. +func (o *ControlPlaneUpgradePolicy) UpgradeType() UpgradeType { + if o != nil && o.bitmap_&2048 != 0 { + return o.upgradeType + } + return UpgradeType("") +} + +// GetUpgradeType returns the value of the 'upgrade_type' attribute and +// a flag indicating if the attribute has a value. +// +// Upgrade type of the control plane. +func (o *ControlPlaneUpgradePolicy) GetUpgradeType() (value UpgradeType, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.upgradeType + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version is the desired upgrade version. +func (o *ControlPlaneUpgradePolicy) Version() string { + if o != nil && o.bitmap_&4096 != 0 { + return o.version + } + return "" +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Version is the desired upgrade version. +func (o *ControlPlaneUpgradePolicy) GetVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.version + } + return +} + +// ControlPlaneUpgradePolicyListKind is the name of the type used to represent list of objects of +// type 'control_plane_upgrade_policy'. +const ControlPlaneUpgradePolicyListKind = "ControlPlaneUpgradePolicyList" + +// ControlPlaneUpgradePolicyListLinkKind is the name of the type used to represent links to list +// of objects of type 'control_plane_upgrade_policy'. +const ControlPlaneUpgradePolicyListLinkKind = "ControlPlaneUpgradePolicyListLink" + +// ControlPlaneUpgradePolicyNilKind is the name of the type used to nil lists of objects of +// type 'control_plane_upgrade_policy'. +const ControlPlaneUpgradePolicyListNilKind = "ControlPlaneUpgradePolicyListNil" + +// ControlPlaneUpgradePolicyList is a list of values of the 'control_plane_upgrade_policy' type. +type ControlPlaneUpgradePolicyList struct { + href string + link bool + items []*ControlPlaneUpgradePolicy +} + +// Kind returns the name of the type of the object. +func (l *ControlPlaneUpgradePolicyList) Kind() string { + if l == nil { + return ControlPlaneUpgradePolicyListNilKind + } + if l.link { + return ControlPlaneUpgradePolicyListLinkKind + } + return ControlPlaneUpgradePolicyListKind +} + +// Link returns true iif this is a link. +func (l *ControlPlaneUpgradePolicyList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ControlPlaneUpgradePolicyList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ControlPlaneUpgradePolicyList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ControlPlaneUpgradePolicyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ControlPlaneUpgradePolicyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ControlPlaneUpgradePolicyList) Get(i int) *ControlPlaneUpgradePolicy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ControlPlaneUpgradePolicyList) Slice() []*ControlPlaneUpgradePolicy { + var slice []*ControlPlaneUpgradePolicy + if l == nil { + slice = make([]*ControlPlaneUpgradePolicy, 0) + } else { + slice = make([]*ControlPlaneUpgradePolicy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ControlPlaneUpgradePolicyList) Each(f func(item *ControlPlaneUpgradePolicy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ControlPlaneUpgradePolicyList) Range(f func(index int, item *ControlPlaneUpgradePolicy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/control_plane_upgrade_policy_type_json.go b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_type_json.go new file mode 100644 index 00000000..244e5551 --- /dev/null +++ b/clustersmgmt/v2alpha1/control_plane_upgrade_policy_type_json.go @@ -0,0 +1,252 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalControlPlaneUpgradePolicy writes a value of the 'control_plane_upgrade_policy' type to the given writer. +func MarshalControlPlaneUpgradePolicy(object *ControlPlaneUpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeControlPlaneUpgradePolicy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeControlPlaneUpgradePolicy writes a value of the 'control_plane_upgrade_policy' type to the given stream. +func writeControlPlaneUpgradePolicy(object *ControlPlaneUpgradePolicy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ControlPlaneUpgradePolicyLinkKind) + } else { + stream.WriteString(ControlPlaneUpgradePolicyKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_id") + stream.WriteString(object.clusterID) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enable_minor_version_upgrades") + stream.WriteBool(object.enableMinorVersionUpgrades) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_update_timestamp") + stream.WriteString((object.lastUpdateTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("next_run") + stream.WriteString((object.nextRun).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule") + stream.WriteString(object.schedule) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule_type") + stream.WriteString(string(object.scheduleType)) + count++ + } + present_ = object.bitmap_&1024 != 0 && object.state != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + writeUpgradePolicyState(object.state, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("upgrade_type") + stream.WriteString(string(object.upgradeType)) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + stream.WriteString(object.version) + } + stream.WriteObjectEnd() +} + +// UnmarshalControlPlaneUpgradePolicy reads a value of the 'control_plane_upgrade_policy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalControlPlaneUpgradePolicy(source interface{}) (object *ControlPlaneUpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readControlPlaneUpgradePolicy(iterator) + err = iterator.Error + return +} + +// readControlPlaneUpgradePolicy reads a value of the 'control_plane_upgrade_policy' type from the given iterator. +func readControlPlaneUpgradePolicy(iterator *jsoniter.Iterator) *ControlPlaneUpgradePolicy { + object := &ControlPlaneUpgradePolicy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ControlPlaneUpgradePolicyLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "cluster_id": + value := iterator.ReadString() + object.clusterID = value + object.bitmap_ |= 8 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 16 + case "enable_minor_version_upgrades": + value := iterator.ReadBool() + object.enableMinorVersionUpgrades = value + object.bitmap_ |= 32 + case "last_update_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUpdateTimestamp = value + object.bitmap_ |= 64 + case "next_run": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.nextRun = value + object.bitmap_ |= 128 + case "schedule": + value := iterator.ReadString() + object.schedule = value + object.bitmap_ |= 256 + case "schedule_type": + text := iterator.ReadString() + value := ScheduleType(text) + object.scheduleType = value + object.bitmap_ |= 512 + case "state": + value := readUpgradePolicyState(iterator) + object.state = value + object.bitmap_ |= 1024 + case "upgrade_type": + text := iterator.ReadString() + value := UpgradeType(text) + object.upgradeType = value + object.bitmap_ |= 2048 + case "version": + value := iterator.ReadString() + object.version = value + object.bitmap_ |= 4096 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cpu_total_by_node_roles_os_metric_query_client.go b/clustersmgmt/v2alpha1/cpu_total_by_node_roles_os_metric_query_client.go new file mode 100644 index 00000000..54a03e51 --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_by_node_roles_os_metric_query_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// CPUTotalByNodeRolesOSMetricQueryClient is the client of the 'CPU_total_by_node_roles_OS_metric_query' resource. +// +// Total cpu capacity in the cluster by node role and operating system. +type CPUTotalByNodeRolesOSMetricQueryClient struct { + transport http.RoundTripper + path string +} + +// NewCPUTotalByNodeRolesOSMetricQueryClient creates a new client for the 'CPU_total_by_node_roles_OS_metric_query' +// resource using the given transport to send the requests and receive the +// responses. +func NewCPUTotalByNodeRolesOSMetricQueryClient(transport http.RoundTripper, path string) *CPUTotalByNodeRolesOSMetricQueryClient { + return &CPUTotalByNodeRolesOSMetricQueryClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the metrics. +func (c *CPUTotalByNodeRolesOSMetricQueryClient) Get() *CPUTotalByNodeRolesOSMetricQueryGetRequest { + return &CPUTotalByNodeRolesOSMetricQueryGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// CPUTotalByNodeRolesOSMetricQueryPollRequest is the request for the Poll method. +type CPUTotalByNodeRolesOSMetricQueryPollRequest struct { + request *CPUTotalByNodeRolesOSMetricQueryGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) Parameter(name string, value interface{}) *CPUTotalByNodeRolesOSMetricQueryPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) Header(name string, value interface{}) *CPUTotalByNodeRolesOSMetricQueryPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) Interval(value time.Duration) *CPUTotalByNodeRolesOSMetricQueryPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) Status(value int) *CPUTotalByNodeRolesOSMetricQueryPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) Predicate(value func(*CPUTotalByNodeRolesOSMetricQueryGetResponse) bool) *CPUTotalByNodeRolesOSMetricQueryPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*CPUTotalByNodeRolesOSMetricQueryGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) StartContext(ctx context.Context) (response *CPUTotalByNodeRolesOSMetricQueryPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &CPUTotalByNodeRolesOSMetricQueryPollResponse{ + response: result.(*CPUTotalByNodeRolesOSMetricQueryGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *CPUTotalByNodeRolesOSMetricQueryPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// CPUTotalByNodeRolesOSMetricQueryPollResponse is the response for the Poll method. +type CPUTotalByNodeRolesOSMetricQueryPollResponse struct { + response *CPUTotalByNodeRolesOSMetricQueryGetResponse +} + +// Status returns the response status code. +func (r *CPUTotalByNodeRolesOSMetricQueryPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *CPUTotalByNodeRolesOSMetricQueryPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *CPUTotalByNodeRolesOSMetricQueryPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *CPUTotalByNodeRolesOSMetricQueryPollResponse) Body() *CPUTotalsNodeRoleOSMetricNode { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CPUTotalByNodeRolesOSMetricQueryPollResponse) GetBody() (value *CPUTotalsNodeRoleOSMetricNode, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *CPUTotalByNodeRolesOSMetricQueryClient) Poll() *CPUTotalByNodeRolesOSMetricQueryPollRequest { + return &CPUTotalByNodeRolesOSMetricQueryPollRequest{ + request: c.Get(), + } +} + +// CPUTotalByNodeRolesOSMetricQueryGetRequest is the request for the 'get' method. +type CPUTotalByNodeRolesOSMetricQueryGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *CPUTotalByNodeRolesOSMetricQueryGetRequest) Parameter(name string, value interface{}) *CPUTotalByNodeRolesOSMetricQueryGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CPUTotalByNodeRolesOSMetricQueryGetRequest) Header(name string, value interface{}) *CPUTotalByNodeRolesOSMetricQueryGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CPUTotalByNodeRolesOSMetricQueryGetRequest) Impersonate(user string) *CPUTotalByNodeRolesOSMetricQueryGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CPUTotalByNodeRolesOSMetricQueryGetRequest) Send() (result *CPUTotalByNodeRolesOSMetricQueryGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CPUTotalByNodeRolesOSMetricQueryGetRequest) SendContext(ctx context.Context) (result *CPUTotalByNodeRolesOSMetricQueryGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CPUTotalByNodeRolesOSMetricQueryGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCPUTotalByNodeRolesOSMetricQueryGetResponse(result, reader) + if err != nil { + return + } + return +} + +// CPUTotalByNodeRolesOSMetricQueryGetResponse is the response for the 'get' method. +type CPUTotalByNodeRolesOSMetricQueryGetResponse struct { + status int + header http.Header + err *errors.Error + body *CPUTotalsNodeRoleOSMetricNode +} + +// Status returns the response status code. +func (r *CPUTotalByNodeRolesOSMetricQueryGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CPUTotalByNodeRolesOSMetricQueryGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CPUTotalByNodeRolesOSMetricQueryGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *CPUTotalByNodeRolesOSMetricQueryGetResponse) Body() *CPUTotalsNodeRoleOSMetricNode { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CPUTotalByNodeRolesOSMetricQueryGetResponse) GetBody() (value *CPUTotalsNodeRoleOSMetricNode, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/cpu_total_by_node_roles_os_metric_query_resource_json.go b/clustersmgmt/v2alpha1/cpu_total_by_node_roles_os_metric_query_resource_json.go new file mode 100644 index 00000000..44d59f5c --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_by_node_roles_os_metric_query_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeCPUTotalByNodeRolesOSMetricQueryGetRequest(request *CPUTotalByNodeRolesOSMetricQueryGetRequest, writer io.Writer) error { + return nil +} +func readCPUTotalByNodeRolesOSMetricQueryGetResponse(response *CPUTotalByNodeRolesOSMetricQueryGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCPUTotalsNodeRoleOSMetricNode(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_builder.go b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_builder.go new file mode 100644 index 00000000..239ecd04 --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_builder.go @@ -0,0 +1,106 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// CPUTotalNodeRoleOSMetricNodeBuilder contains the data and logic needed to build 'CPU_total_node_role_OS_metric_node' objects. +// +// Representation of information from telemetry about a the CPU capacity by node role and OS. +type CPUTotalNodeRoleOSMetricNodeBuilder struct { + bitmap_ uint32 + cpuTotal float64 + nodeRoles []string + operatingSystem string + time time.Time +} + +// NewCPUTotalNodeRoleOSMetricNode creates a new builder of 'CPU_total_node_role_OS_metric_node' objects. +func NewCPUTotalNodeRoleOSMetricNode() *CPUTotalNodeRoleOSMetricNodeBuilder { + return &CPUTotalNodeRoleOSMetricNodeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CPUTotal sets the value of the 'CPU_total' attribute to the given value. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) CPUTotal(value float64) *CPUTotalNodeRoleOSMetricNodeBuilder { + b.cpuTotal = value + b.bitmap_ |= 1 + return b +} + +// NodeRoles sets the value of the 'node_roles' attribute to the given values. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) NodeRoles(values ...string) *CPUTotalNodeRoleOSMetricNodeBuilder { + b.nodeRoles = make([]string, len(values)) + copy(b.nodeRoles, values) + b.bitmap_ |= 2 + return b +} + +// OperatingSystem sets the value of the 'operating_system' attribute to the given value. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) OperatingSystem(value string) *CPUTotalNodeRoleOSMetricNodeBuilder { + b.operatingSystem = value + b.bitmap_ |= 4 + return b +} + +// Time sets the value of the 'time' attribute to the given value. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) Time(value time.Time) *CPUTotalNodeRoleOSMetricNodeBuilder { + b.time = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) Copy(object *CPUTotalNodeRoleOSMetricNode) *CPUTotalNodeRoleOSMetricNodeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.cpuTotal = object.cpuTotal + if object.nodeRoles != nil { + b.nodeRoles = make([]string, len(object.nodeRoles)) + copy(b.nodeRoles, object.nodeRoles) + } else { + b.nodeRoles = nil + } + b.operatingSystem = object.operatingSystem + b.time = object.time + return b +} + +// Build creates a 'CPU_total_node_role_OS_metric_node' object using the configuration stored in the builder. +func (b *CPUTotalNodeRoleOSMetricNodeBuilder) Build() (object *CPUTotalNodeRoleOSMetricNode, err error) { + object = new(CPUTotalNodeRoleOSMetricNode) + object.bitmap_ = b.bitmap_ + object.cpuTotal = b.cpuTotal + if b.nodeRoles != nil { + object.nodeRoles = make([]string, len(b.nodeRoles)) + copy(object.nodeRoles, b.nodeRoles) + } + object.operatingSystem = b.operatingSystem + object.time = b.time + return +} diff --git a/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_list_builder.go b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_list_builder.go new file mode 100644 index 00000000..dc2af26e --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CPUTotalNodeRoleOSMetricNodeListBuilder contains the data and logic needed to build +// 'CPU_total_node_role_OS_metric_node' objects. +type CPUTotalNodeRoleOSMetricNodeListBuilder struct { + items []*CPUTotalNodeRoleOSMetricNodeBuilder +} + +// NewCPUTotalNodeRoleOSMetricNodeList creates a new builder of 'CPU_total_node_role_OS_metric_node' objects. +func NewCPUTotalNodeRoleOSMetricNodeList() *CPUTotalNodeRoleOSMetricNodeListBuilder { + return new(CPUTotalNodeRoleOSMetricNodeListBuilder) +} + +// Items sets the items of the list. +func (b *CPUTotalNodeRoleOSMetricNodeListBuilder) Items(values ...*CPUTotalNodeRoleOSMetricNodeBuilder) *CPUTotalNodeRoleOSMetricNodeListBuilder { + b.items = make([]*CPUTotalNodeRoleOSMetricNodeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CPUTotalNodeRoleOSMetricNodeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CPUTotalNodeRoleOSMetricNodeListBuilder) Copy(list *CPUTotalNodeRoleOSMetricNodeList) *CPUTotalNodeRoleOSMetricNodeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CPUTotalNodeRoleOSMetricNodeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCPUTotalNodeRoleOSMetricNode().Copy(v) + } + } + return b +} + +// Build creates a list of 'CPU_total_node_role_OS_metric_node' objects using the +// configuration stored in the builder. +func (b *CPUTotalNodeRoleOSMetricNodeListBuilder) Build() (list *CPUTotalNodeRoleOSMetricNodeList, err error) { + items := make([]*CPUTotalNodeRoleOSMetricNode, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CPUTotalNodeRoleOSMetricNodeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_list_type_json.go b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_list_type_json.go new file mode 100644 index 00000000..53c74883 --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCPUTotalNodeRoleOSMetricNodeList writes a list of values of the 'CPU_total_node_role_OS_metric_node' type to +// the given writer. +func MarshalCPUTotalNodeRoleOSMetricNodeList(list []*CPUTotalNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCPUTotalNodeRoleOSMetricNodeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCPUTotalNodeRoleOSMetricNodeList writes a list of value of the 'CPU_total_node_role_OS_metric_node' type to +// the given stream. +func writeCPUTotalNodeRoleOSMetricNodeList(list []*CPUTotalNodeRoleOSMetricNode, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCPUTotalNodeRoleOSMetricNode(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCPUTotalNodeRoleOSMetricNodeList reads a list of values of the 'CPU_total_node_role_OS_metric_node' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCPUTotalNodeRoleOSMetricNodeList(source interface{}) (items []*CPUTotalNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCPUTotalNodeRoleOSMetricNodeList(iterator) + err = iterator.Error + return +} + +// readCPUTotalNodeRoleOSMetricNodeList reads list of values of the ”CPU_total_node_role_OS_metric_node' type from +// the given iterator. +func readCPUTotalNodeRoleOSMetricNodeList(iterator *jsoniter.Iterator) []*CPUTotalNodeRoleOSMetricNode { + list := []*CPUTotalNodeRoleOSMetricNode{} + for iterator.ReadArray() { + item := readCPUTotalNodeRoleOSMetricNode(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_type.go b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_type.go new file mode 100644 index 00000000..8c4becc6 --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// CPUTotalNodeRoleOSMetricNode represents the values of the 'CPU_total_node_role_OS_metric_node' type. +// +// Representation of information from telemetry about a the CPU capacity by node role and OS. +type CPUTotalNodeRoleOSMetricNode struct { + bitmap_ uint32 + cpuTotal float64 + nodeRoles []string + operatingSystem string + time time.Time +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CPUTotalNodeRoleOSMetricNode) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CPUTotal returns the value of the 'CPU_total' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The total CPU capacity of nodes with this set of roles and operating system. +func (o *CPUTotalNodeRoleOSMetricNode) CPUTotal() float64 { + if o != nil && o.bitmap_&1 != 0 { + return o.cpuTotal + } + return 0.0 +} + +// GetCPUTotal returns the value of the 'CPU_total' attribute and +// a flag indicating if the attribute has a value. +// +// The total CPU capacity of nodes with this set of roles and operating system. +func (o *CPUTotalNodeRoleOSMetricNode) GetCPUTotal() (value float64, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.cpuTotal + } + return +} + +// NodeRoles returns the value of the 'node_roles' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Representation of the node role for a cluster. +func (o *CPUTotalNodeRoleOSMetricNode) NodeRoles() []string { + if o != nil && o.bitmap_&2 != 0 { + return o.nodeRoles + } + return nil +} + +// GetNodeRoles returns the value of the 'node_roles' attribute and +// a flag indicating if the attribute has a value. +// +// Representation of the node role for a cluster. +func (o *CPUTotalNodeRoleOSMetricNode) GetNodeRoles() (value []string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.nodeRoles + } + return +} + +// OperatingSystem returns the value of the 'operating_system' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The operating system. +func (o *CPUTotalNodeRoleOSMetricNode) OperatingSystem() string { + if o != nil && o.bitmap_&4 != 0 { + return o.operatingSystem + } + return "" +} + +// GetOperatingSystem returns the value of the 'operating_system' attribute and +// a flag indicating if the attribute has a value. +// +// The operating system. +func (o *CPUTotalNodeRoleOSMetricNode) GetOperatingSystem() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.operatingSystem + } + return +} + +// Time returns the value of the 'time' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *CPUTotalNodeRoleOSMetricNode) Time() time.Time { + if o != nil && o.bitmap_&8 != 0 { + return o.time + } + return time.Time{} +} + +// GetTime returns the value of the 'time' attribute and +// a flag indicating if the attribute has a value. +func (o *CPUTotalNodeRoleOSMetricNode) GetTime() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.time + } + return +} + +// CPUTotalNodeRoleOSMetricNodeListKind is the name of the type used to represent list of objects of +// type 'CPU_total_node_role_OS_metric_node'. +const CPUTotalNodeRoleOSMetricNodeListKind = "CPUTotalNodeRoleOSMetricNodeList" + +// CPUTotalNodeRoleOSMetricNodeListLinkKind is the name of the type used to represent links to list +// of objects of type 'CPU_total_node_role_OS_metric_node'. +const CPUTotalNodeRoleOSMetricNodeListLinkKind = "CPUTotalNodeRoleOSMetricNodeListLink" + +// CPUTotalNodeRoleOSMetricNodeNilKind is the name of the type used to nil lists of objects of +// type 'CPU_total_node_role_OS_metric_node'. +const CPUTotalNodeRoleOSMetricNodeListNilKind = "CPUTotalNodeRoleOSMetricNodeListNil" + +// CPUTotalNodeRoleOSMetricNodeList is a list of values of the 'CPU_total_node_role_OS_metric_node' type. +type CPUTotalNodeRoleOSMetricNodeList struct { + href string + link bool + items []*CPUTotalNodeRoleOSMetricNode +} + +// Len returns the length of the list. +func (l *CPUTotalNodeRoleOSMetricNodeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CPUTotalNodeRoleOSMetricNodeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CPUTotalNodeRoleOSMetricNodeList) Get(i int) *CPUTotalNodeRoleOSMetricNode { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CPUTotalNodeRoleOSMetricNodeList) Slice() []*CPUTotalNodeRoleOSMetricNode { + var slice []*CPUTotalNodeRoleOSMetricNode + if l == nil { + slice = make([]*CPUTotalNodeRoleOSMetricNode, 0) + } else { + slice = make([]*CPUTotalNodeRoleOSMetricNode, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CPUTotalNodeRoleOSMetricNodeList) Each(f func(item *CPUTotalNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CPUTotalNodeRoleOSMetricNodeList) Range(f func(index int, item *CPUTotalNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_type_json.go b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_type_json.go new file mode 100644 index 00000000..067c80fd --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_total_node_role_os_metric_node_type_json.go @@ -0,0 +1,130 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCPUTotalNodeRoleOSMetricNode writes a value of the 'CPU_total_node_role_OS_metric_node' type to the given writer. +func MarshalCPUTotalNodeRoleOSMetricNode(object *CPUTotalNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCPUTotalNodeRoleOSMetricNode(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCPUTotalNodeRoleOSMetricNode writes a value of the 'CPU_total_node_role_OS_metric_node' type to the given stream. +func writeCPUTotalNodeRoleOSMetricNode(object *CPUTotalNodeRoleOSMetricNode, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cpu_total") + stream.WriteFloat64(object.cpuTotal) + count++ + } + present_ = object.bitmap_&2 != 0 && object.nodeRoles != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("node_roles") + writeStringList(object.nodeRoles, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operating_system") + stream.WriteString(object.operatingSystem) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("time") + stream.WriteString((object.time).Format(time.RFC3339)) + } + stream.WriteObjectEnd() +} + +// UnmarshalCPUTotalNodeRoleOSMetricNode reads a value of the 'CPU_total_node_role_OS_metric_node' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCPUTotalNodeRoleOSMetricNode(source interface{}) (object *CPUTotalNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCPUTotalNodeRoleOSMetricNode(iterator) + err = iterator.Error + return +} + +// readCPUTotalNodeRoleOSMetricNode reads a value of the 'CPU_total_node_role_OS_metric_node' type from the given iterator. +func readCPUTotalNodeRoleOSMetricNode(iterator *jsoniter.Iterator) *CPUTotalNodeRoleOSMetricNode { + object := &CPUTotalNodeRoleOSMetricNode{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "cpu_total": + value := iterator.ReadFloat64() + object.cpuTotal = value + object.bitmap_ |= 1 + case "node_roles": + value := readStringList(iterator) + object.nodeRoles = value + object.bitmap_ |= 2 + case "operating_system": + value := iterator.ReadString() + object.operatingSystem = value + object.bitmap_ |= 4 + case "time": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.time = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_builder.go b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_builder.go new file mode 100644 index 00000000..1764df03 --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_builder.go @@ -0,0 +1,80 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CPUTotalsNodeRoleOSMetricNodeBuilder contains the data and logic needed to build 'CPU_totals_node_role_OS_metric_node' objects. +// +// Representation of information from telemetry about the CPU capacity by node +// role and OS of a cluster. +type CPUTotalsNodeRoleOSMetricNodeBuilder struct { + bitmap_ uint32 + cpuTotals []*CPUTotalNodeRoleOSMetricNodeBuilder +} + +// NewCPUTotalsNodeRoleOSMetricNode creates a new builder of 'CPU_totals_node_role_OS_metric_node' objects. +func NewCPUTotalsNodeRoleOSMetricNode() *CPUTotalsNodeRoleOSMetricNodeBuilder { + return &CPUTotalsNodeRoleOSMetricNodeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CPUTotalsNodeRoleOSMetricNodeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CPUTotals sets the value of the 'CPU_totals' attribute to the given values. +func (b *CPUTotalsNodeRoleOSMetricNodeBuilder) CPUTotals(values ...*CPUTotalNodeRoleOSMetricNodeBuilder) *CPUTotalsNodeRoleOSMetricNodeBuilder { + b.cpuTotals = make([]*CPUTotalNodeRoleOSMetricNodeBuilder, len(values)) + copy(b.cpuTotals, values) + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CPUTotalsNodeRoleOSMetricNodeBuilder) Copy(object *CPUTotalsNodeRoleOSMetricNode) *CPUTotalsNodeRoleOSMetricNodeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.cpuTotals != nil { + b.cpuTotals = make([]*CPUTotalNodeRoleOSMetricNodeBuilder, len(object.cpuTotals)) + for i, v := range object.cpuTotals { + b.cpuTotals[i] = NewCPUTotalNodeRoleOSMetricNode().Copy(v) + } + } else { + b.cpuTotals = nil + } + return b +} + +// Build creates a 'CPU_totals_node_role_OS_metric_node' object using the configuration stored in the builder. +func (b *CPUTotalsNodeRoleOSMetricNodeBuilder) Build() (object *CPUTotalsNodeRoleOSMetricNode, err error) { + object = new(CPUTotalsNodeRoleOSMetricNode) + object.bitmap_ = b.bitmap_ + if b.cpuTotals != nil { + object.cpuTotals = make([]*CPUTotalNodeRoleOSMetricNode, len(b.cpuTotals)) + for i, v := range b.cpuTotals { + object.cpuTotals[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_list_builder.go b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_list_builder.go new file mode 100644 index 00000000..7772a7fb --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CPUTotalsNodeRoleOSMetricNodeListBuilder contains the data and logic needed to build +// 'CPU_totals_node_role_OS_metric_node' objects. +type CPUTotalsNodeRoleOSMetricNodeListBuilder struct { + items []*CPUTotalsNodeRoleOSMetricNodeBuilder +} + +// NewCPUTotalsNodeRoleOSMetricNodeList creates a new builder of 'CPU_totals_node_role_OS_metric_node' objects. +func NewCPUTotalsNodeRoleOSMetricNodeList() *CPUTotalsNodeRoleOSMetricNodeListBuilder { + return new(CPUTotalsNodeRoleOSMetricNodeListBuilder) +} + +// Items sets the items of the list. +func (b *CPUTotalsNodeRoleOSMetricNodeListBuilder) Items(values ...*CPUTotalsNodeRoleOSMetricNodeBuilder) *CPUTotalsNodeRoleOSMetricNodeListBuilder { + b.items = make([]*CPUTotalsNodeRoleOSMetricNodeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CPUTotalsNodeRoleOSMetricNodeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CPUTotalsNodeRoleOSMetricNodeListBuilder) Copy(list *CPUTotalsNodeRoleOSMetricNodeList) *CPUTotalsNodeRoleOSMetricNodeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CPUTotalsNodeRoleOSMetricNodeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCPUTotalsNodeRoleOSMetricNode().Copy(v) + } + } + return b +} + +// Build creates a list of 'CPU_totals_node_role_OS_metric_node' objects using the +// configuration stored in the builder. +func (b *CPUTotalsNodeRoleOSMetricNodeListBuilder) Build() (list *CPUTotalsNodeRoleOSMetricNodeList, err error) { + items := make([]*CPUTotalsNodeRoleOSMetricNode, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CPUTotalsNodeRoleOSMetricNodeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_list_type_json.go b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_list_type_json.go new file mode 100644 index 00000000..513240df --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCPUTotalsNodeRoleOSMetricNodeList writes a list of values of the 'CPU_totals_node_role_OS_metric_node' type to +// the given writer. +func MarshalCPUTotalsNodeRoleOSMetricNodeList(list []*CPUTotalsNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCPUTotalsNodeRoleOSMetricNodeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCPUTotalsNodeRoleOSMetricNodeList writes a list of value of the 'CPU_totals_node_role_OS_metric_node' type to +// the given stream. +func writeCPUTotalsNodeRoleOSMetricNodeList(list []*CPUTotalsNodeRoleOSMetricNode, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCPUTotalsNodeRoleOSMetricNode(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCPUTotalsNodeRoleOSMetricNodeList reads a list of values of the 'CPU_totals_node_role_OS_metric_node' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCPUTotalsNodeRoleOSMetricNodeList(source interface{}) (items []*CPUTotalsNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCPUTotalsNodeRoleOSMetricNodeList(iterator) + err = iterator.Error + return +} + +// readCPUTotalsNodeRoleOSMetricNodeList reads list of values of the ”CPU_totals_node_role_OS_metric_node' type from +// the given iterator. +func readCPUTotalsNodeRoleOSMetricNodeList(iterator *jsoniter.Iterator) []*CPUTotalsNodeRoleOSMetricNode { + list := []*CPUTotalsNodeRoleOSMetricNode{} + for iterator.ReadArray() { + item := readCPUTotalsNodeRoleOSMetricNode(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_type.go b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_type.go new file mode 100644 index 00000000..1c8d15dc --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_type.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CPUTotalsNodeRoleOSMetricNode represents the values of the 'CPU_totals_node_role_OS_metric_node' type. +// +// Representation of information from telemetry about the CPU capacity by node +// role and OS of a cluster. +type CPUTotalsNodeRoleOSMetricNode struct { + bitmap_ uint32 + cpuTotals []*CPUTotalNodeRoleOSMetricNode +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CPUTotalsNodeRoleOSMetricNode) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CPUTotals returns the value of the 'CPU_totals' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *CPUTotalsNodeRoleOSMetricNode) CPUTotals() []*CPUTotalNodeRoleOSMetricNode { + if o != nil && o.bitmap_&1 != 0 { + return o.cpuTotals + } + return nil +} + +// GetCPUTotals returns the value of the 'CPU_totals' attribute and +// a flag indicating if the attribute has a value. +func (o *CPUTotalsNodeRoleOSMetricNode) GetCPUTotals() (value []*CPUTotalNodeRoleOSMetricNode, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.cpuTotals + } + return +} + +// CPUTotalsNodeRoleOSMetricNodeListKind is the name of the type used to represent list of objects of +// type 'CPU_totals_node_role_OS_metric_node'. +const CPUTotalsNodeRoleOSMetricNodeListKind = "CPUTotalsNodeRoleOSMetricNodeList" + +// CPUTotalsNodeRoleOSMetricNodeListLinkKind is the name of the type used to represent links to list +// of objects of type 'CPU_totals_node_role_OS_metric_node'. +const CPUTotalsNodeRoleOSMetricNodeListLinkKind = "CPUTotalsNodeRoleOSMetricNodeListLink" + +// CPUTotalsNodeRoleOSMetricNodeNilKind is the name of the type used to nil lists of objects of +// type 'CPU_totals_node_role_OS_metric_node'. +const CPUTotalsNodeRoleOSMetricNodeListNilKind = "CPUTotalsNodeRoleOSMetricNodeListNil" + +// CPUTotalsNodeRoleOSMetricNodeList is a list of values of the 'CPU_totals_node_role_OS_metric_node' type. +type CPUTotalsNodeRoleOSMetricNodeList struct { + href string + link bool + items []*CPUTotalsNodeRoleOSMetricNode +} + +// Len returns the length of the list. +func (l *CPUTotalsNodeRoleOSMetricNodeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CPUTotalsNodeRoleOSMetricNodeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CPUTotalsNodeRoleOSMetricNodeList) Get(i int) *CPUTotalsNodeRoleOSMetricNode { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CPUTotalsNodeRoleOSMetricNodeList) Slice() []*CPUTotalsNodeRoleOSMetricNode { + var slice []*CPUTotalsNodeRoleOSMetricNode + if l == nil { + slice = make([]*CPUTotalsNodeRoleOSMetricNode, 0) + } else { + slice = make([]*CPUTotalsNodeRoleOSMetricNode, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CPUTotalsNodeRoleOSMetricNodeList) Each(f func(item *CPUTotalsNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CPUTotalsNodeRoleOSMetricNodeList) Range(f func(index int, item *CPUTotalsNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_type_json.go b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_type_json.go new file mode 100644 index 00000000..9d869abb --- /dev/null +++ b/clustersmgmt/v2alpha1/cpu_totals_node_role_os_metric_node_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCPUTotalsNodeRoleOSMetricNode writes a value of the 'CPU_totals_node_role_OS_metric_node' type to the given writer. +func MarshalCPUTotalsNodeRoleOSMetricNode(object *CPUTotalsNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCPUTotalsNodeRoleOSMetricNode(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCPUTotalsNodeRoleOSMetricNode writes a value of the 'CPU_totals_node_role_OS_metric_node' type to the given stream. +func writeCPUTotalsNodeRoleOSMetricNode(object *CPUTotalsNodeRoleOSMetricNode, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.cpuTotals != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cpu_totals") + writeCPUTotalNodeRoleOSMetricNodeList(object.cpuTotals, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalCPUTotalsNodeRoleOSMetricNode reads a value of the 'CPU_totals_node_role_OS_metric_node' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCPUTotalsNodeRoleOSMetricNode(source interface{}) (object *CPUTotalsNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCPUTotalsNodeRoleOSMetricNode(iterator) + err = iterator.Error + return +} + +// readCPUTotalsNodeRoleOSMetricNode reads a value of the 'CPU_totals_node_role_OS_metric_node' type from the given iterator. +func readCPUTotalsNodeRoleOSMetricNode(iterator *jsoniter.Iterator) *CPUTotalsNodeRoleOSMetricNode { + object := &CPUTotalsNodeRoleOSMetricNode{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "cpu_totals": + value := readCPUTotalNodeRoleOSMetricNodeList(iterator) + object.cpuTotals = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/credential_request_builder.go b/clustersmgmt/v2alpha1/credential_request_builder.go new file mode 100644 index 00000000..25efe748 --- /dev/null +++ b/clustersmgmt/v2alpha1/credential_request_builder.go @@ -0,0 +1,102 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CredentialRequestBuilder contains the data and logic needed to build 'credential_request' objects. +// +// Contains the necessary attributes to allow each operator to access the necessary AWS resources +type CredentialRequestBuilder struct { + bitmap_ uint32 + name string + namespace string + policyPermissions []string + serviceAccount string +} + +// NewCredentialRequest creates a new builder of 'credential_request' objects. +func NewCredentialRequest() *CredentialRequestBuilder { + return &CredentialRequestBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *CredentialRequestBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *CredentialRequestBuilder) Name(value string) *CredentialRequestBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Namespace sets the value of the 'namespace' attribute to the given value. +func (b *CredentialRequestBuilder) Namespace(value string) *CredentialRequestBuilder { + b.namespace = value + b.bitmap_ |= 2 + return b +} + +// PolicyPermissions sets the value of the 'policy_permissions' attribute to the given values. +func (b *CredentialRequestBuilder) PolicyPermissions(values ...string) *CredentialRequestBuilder { + b.policyPermissions = make([]string, len(values)) + copy(b.policyPermissions, values) + b.bitmap_ |= 4 + return b +} + +// ServiceAccount sets the value of the 'service_account' attribute to the given value. +func (b *CredentialRequestBuilder) ServiceAccount(value string) *CredentialRequestBuilder { + b.serviceAccount = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *CredentialRequestBuilder) Copy(object *CredentialRequest) *CredentialRequestBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + b.namespace = object.namespace + if object.policyPermissions != nil { + b.policyPermissions = make([]string, len(object.policyPermissions)) + copy(b.policyPermissions, object.policyPermissions) + } else { + b.policyPermissions = nil + } + b.serviceAccount = object.serviceAccount + return b +} + +// Build creates a 'credential_request' object using the configuration stored in the builder. +func (b *CredentialRequestBuilder) Build() (object *CredentialRequest, err error) { + object = new(CredentialRequest) + object.bitmap_ = b.bitmap_ + object.name = b.name + object.namespace = b.namespace + if b.policyPermissions != nil { + object.policyPermissions = make([]string, len(b.policyPermissions)) + copy(object.policyPermissions, b.policyPermissions) + } + object.serviceAccount = b.serviceAccount + return +} diff --git a/clustersmgmt/v2alpha1/credential_request_list_builder.go b/clustersmgmt/v2alpha1/credential_request_list_builder.go new file mode 100644 index 00000000..5f82dd15 --- /dev/null +++ b/clustersmgmt/v2alpha1/credential_request_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CredentialRequestListBuilder contains the data and logic needed to build +// 'credential_request' objects. +type CredentialRequestListBuilder struct { + items []*CredentialRequestBuilder +} + +// NewCredentialRequestList creates a new builder of 'credential_request' objects. +func NewCredentialRequestList() *CredentialRequestListBuilder { + return new(CredentialRequestListBuilder) +} + +// Items sets the items of the list. +func (b *CredentialRequestListBuilder) Items(values ...*CredentialRequestBuilder) *CredentialRequestListBuilder { + b.items = make([]*CredentialRequestBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *CredentialRequestListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *CredentialRequestListBuilder) Copy(list *CredentialRequestList) *CredentialRequestListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*CredentialRequestBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewCredentialRequest().Copy(v) + } + } + return b +} + +// Build creates a list of 'credential_request' objects using the +// configuration stored in the builder. +func (b *CredentialRequestListBuilder) Build() (list *CredentialRequestList, err error) { + items := make([]*CredentialRequest, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(CredentialRequestList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/credential_request_list_type_json.go b/clustersmgmt/v2alpha1/credential_request_list_type_json.go new file mode 100644 index 00000000..5a84c27b --- /dev/null +++ b/clustersmgmt/v2alpha1/credential_request_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCredentialRequestList writes a list of values of the 'credential_request' type to +// the given writer. +func MarshalCredentialRequestList(list []*CredentialRequest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCredentialRequestList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCredentialRequestList writes a list of value of the 'credential_request' type to +// the given stream. +func writeCredentialRequestList(list []*CredentialRequest, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeCredentialRequest(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalCredentialRequestList reads a list of values of the 'credential_request' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalCredentialRequestList(source interface{}) (items []*CredentialRequest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readCredentialRequestList(iterator) + err = iterator.Error + return +} + +// readCredentialRequestList reads list of values of the ”credential_request' type from +// the given iterator. +func readCredentialRequestList(iterator *jsoniter.Iterator) []*CredentialRequest { + list := []*CredentialRequest{} + for iterator.ReadArray() { + item := readCredentialRequest(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/credential_request_type.go b/clustersmgmt/v2alpha1/credential_request_type.go new file mode 100644 index 00000000..e6120dec --- /dev/null +++ b/clustersmgmt/v2alpha1/credential_request_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// CredentialRequest represents the values of the 'credential_request' type. +// +// Contains the necessary attributes to allow each operator to access the necessary AWS resources +type CredentialRequest struct { + bitmap_ uint32 + name string + namespace string + policyPermissions []string + serviceAccount string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *CredentialRequest) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the credentials secret used to access cloud resources +func (o *CredentialRequest) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the credentials secret used to access cloud resources +func (o *CredentialRequest) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Namespace returns the value of the 'namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Namespace where the credentials secret lives in the cluster +func (o *CredentialRequest) Namespace() string { + if o != nil && o.bitmap_&2 != 0 { + return o.namespace + } + return "" +} + +// GetNamespace returns the value of the 'namespace' attribute and +// a flag indicating if the attribute has a value. +// +// Namespace where the credentials secret lives in the cluster +func (o *CredentialRequest) GetNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.namespace + } + return +} + +// PolicyPermissions returns the value of the 'policy_permissions' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of policy permissions needed to access cloud resources +func (o *CredentialRequest) PolicyPermissions() []string { + if o != nil && o.bitmap_&4 != 0 { + return o.policyPermissions + } + return nil +} + +// GetPolicyPermissions returns the value of the 'policy_permissions' attribute and +// a flag indicating if the attribute has a value. +// +// List of policy permissions needed to access cloud resources +func (o *CredentialRequest) GetPolicyPermissions() (value []string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.policyPermissions + } + return +} + +// ServiceAccount returns the value of the 'service_account' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Service account name to use when authenticating +func (o *CredentialRequest) ServiceAccount() string { + if o != nil && o.bitmap_&8 != 0 { + return o.serviceAccount + } + return "" +} + +// GetServiceAccount returns the value of the 'service_account' attribute and +// a flag indicating if the attribute has a value. +// +// Service account name to use when authenticating +func (o *CredentialRequest) GetServiceAccount() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.serviceAccount + } + return +} + +// CredentialRequestListKind is the name of the type used to represent list of objects of +// type 'credential_request'. +const CredentialRequestListKind = "CredentialRequestList" + +// CredentialRequestListLinkKind is the name of the type used to represent links to list +// of objects of type 'credential_request'. +const CredentialRequestListLinkKind = "CredentialRequestListLink" + +// CredentialRequestNilKind is the name of the type used to nil lists of objects of +// type 'credential_request'. +const CredentialRequestListNilKind = "CredentialRequestListNil" + +// CredentialRequestList is a list of values of the 'credential_request' type. +type CredentialRequestList struct { + href string + link bool + items []*CredentialRequest +} + +// Len returns the length of the list. +func (l *CredentialRequestList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *CredentialRequestList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *CredentialRequestList) Get(i int) *CredentialRequest { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *CredentialRequestList) Slice() []*CredentialRequest { + var slice []*CredentialRequest + if l == nil { + slice = make([]*CredentialRequest, 0) + } else { + slice = make([]*CredentialRequest, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *CredentialRequestList) Each(f func(item *CredentialRequest) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *CredentialRequestList) Range(f func(index int, item *CredentialRequest) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/credential_request_type_json.go b/clustersmgmt/v2alpha1/credential_request_type_json.go new file mode 100644 index 00000000..44baf904 --- /dev/null +++ b/clustersmgmt/v2alpha1/credential_request_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalCredentialRequest writes a value of the 'credential_request' type to the given writer. +func MarshalCredentialRequest(object *CredentialRequest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeCredentialRequest(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeCredentialRequest writes a value of the 'credential_request' type to the given stream. +func writeCredentialRequest(object *CredentialRequest, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("namespace") + stream.WriteString(object.namespace) + count++ + } + present_ = object.bitmap_&4 != 0 && object.policyPermissions != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("policy_permissions") + writeStringList(object.policyPermissions, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_account") + stream.WriteString(object.serviceAccount) + } + stream.WriteObjectEnd() +} + +// UnmarshalCredentialRequest reads a value of the 'credential_request' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalCredentialRequest(source interface{}) (object *CredentialRequest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readCredentialRequest(iterator) + err = iterator.Error + return +} + +// readCredentialRequest reads a value of the 'credential_request' type from the given iterator. +func readCredentialRequest(iterator *jsoniter.Iterator) *CredentialRequest { + object := &CredentialRequest{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "namespace": + value := iterator.ReadString() + object.namespace = value + object.bitmap_ |= 2 + case "policy_permissions": + value := readStringList(iterator) + object.policyPermissions = value + object.bitmap_ |= 4 + case "service_account": + value := iterator.ReadString() + object.serviceAccount = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/credentials_client.go b/clustersmgmt/v2alpha1/credentials_client.go new file mode 100644 index 00000000..413ba7ca --- /dev/null +++ b/clustersmgmt/v2alpha1/credentials_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// CredentialsClient is the client of the 'credentials' resource. +// +// Manages the credentials of a cluster. +type CredentialsClient struct { + transport http.RoundTripper + path string +} + +// NewCredentialsClient creates a new client for the 'credentials' +// resource using the given transport to send the requests and receive the +// responses. +func NewCredentialsClient(transport http.RoundTripper, path string) *CredentialsClient { + return &CredentialsClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the credentials of a cluster. +func (c *CredentialsClient) Get() *CredentialsGetRequest { + return &CredentialsGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// CredentialsPollRequest is the request for the Poll method. +type CredentialsPollRequest struct { + request *CredentialsGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *CredentialsPollRequest) Parameter(name string, value interface{}) *CredentialsPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *CredentialsPollRequest) Header(name string, value interface{}) *CredentialsPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *CredentialsPollRequest) Interval(value time.Duration) *CredentialsPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *CredentialsPollRequest) Status(value int) *CredentialsPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *CredentialsPollRequest) Predicate(value func(*CredentialsGetResponse) bool) *CredentialsPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*CredentialsGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *CredentialsPollRequest) StartContext(ctx context.Context) (response *CredentialsPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &CredentialsPollResponse{ + response: result.(*CredentialsGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *CredentialsPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// CredentialsPollResponse is the response for the Poll method. +type CredentialsPollResponse struct { + response *CredentialsGetResponse +} + +// Status returns the response status code. +func (r *CredentialsPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *CredentialsPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *CredentialsPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *CredentialsPollResponse) Body() *ClusterCredentials { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CredentialsPollResponse) GetBody() (value *ClusterCredentials, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *CredentialsClient) Poll() *CredentialsPollRequest { + return &CredentialsPollRequest{ + request: c.Get(), + } +} + +// CredentialsGetRequest is the request for the 'get' method. +type CredentialsGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *CredentialsGetRequest) Parameter(name string, value interface{}) *CredentialsGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *CredentialsGetRequest) Header(name string, value interface{}) *CredentialsGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *CredentialsGetRequest) Impersonate(user string) *CredentialsGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *CredentialsGetRequest) Send() (result *CredentialsGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *CredentialsGetRequest) SendContext(ctx context.Context) (result *CredentialsGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &CredentialsGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readCredentialsGetResponse(result, reader) + if err != nil { + return + } + return +} + +// CredentialsGetResponse is the response for the 'get' method. +type CredentialsGetResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterCredentials +} + +// Status returns the response status code. +func (r *CredentialsGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *CredentialsGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *CredentialsGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *CredentialsGetResponse) Body() *ClusterCredentials { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *CredentialsGetResponse) GetBody() (value *ClusterCredentials, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/credentials_resource_json.go b/clustersmgmt/v2alpha1/credentials_resource_json.go new file mode 100644 index 00000000..3508f482 --- /dev/null +++ b/clustersmgmt/v2alpha1/credentials_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeCredentialsGetRequest(request *CredentialsGetRequest, writer io.Writer) error { + return nil +} +func readCredentialsGetResponse(response *CredentialsGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterCredentials(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/date_list_type_json.go b/clustersmgmt/v2alpha1/date_list_type_json.go new file mode 100644 index 00000000..1414a71c --- /dev/null +++ b/clustersmgmt/v2alpha1/date_list_type_json.go @@ -0,0 +1,80 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDateList writes a list of values of the 'date' type to +// the given writer. +func MarshalDateList(list []time.Time, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDateList writes a list of value of the 'date' type to +// the given stream. +func writeDateList(list []time.Time, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString((value).Format(time.RFC3339)) + } + stream.WriteArrayEnd() +} + +// UnmarshalDateList reads a list of values of the 'date' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalDateList(source interface{}) (items []time.Time, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readDateList(iterator) + err = iterator.Error + return +} + +// readDateList reads list of values of the ”date' type from +// the given iterator. +func readDateList(iterator *jsoniter.Iterator) []time.Time { + list := []time.Time{} + for iterator.ReadArray() { + text := iterator.ReadString() + item, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/delete_protection_builder.go b/clustersmgmt/v2alpha1/delete_protection_builder.go new file mode 100644 index 00000000..c1a6a393 --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DeleteProtectionBuilder contains the data and logic needed to build 'delete_protection' objects. +// +// DeleteProtection configuration. +type DeleteProtectionBuilder struct { + bitmap_ uint32 + enabled bool +} + +// NewDeleteProtection creates a new builder of 'delete_protection' objects. +func NewDeleteProtection() *DeleteProtectionBuilder { + return &DeleteProtectionBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *DeleteProtectionBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *DeleteProtectionBuilder) Enabled(value bool) *DeleteProtectionBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *DeleteProtectionBuilder) Copy(object *DeleteProtection) *DeleteProtectionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + return b +} + +// Build creates a 'delete_protection' object using the configuration stored in the builder. +func (b *DeleteProtectionBuilder) Build() (object *DeleteProtection, err error) { + object = new(DeleteProtection) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + return +} diff --git a/clustersmgmt/v2alpha1/delete_protection_client.go b/clustersmgmt/v2alpha1/delete_protection_client.go new file mode 100644 index 00000000..523e33c8 --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// DeleteProtectionClient is the client of the 'delete_protection' resource. +// +// Manages delete protection specific parts for a specific cluster. +type DeleteProtectionClient struct { + transport http.RoundTripper + path string +} + +// NewDeleteProtectionClient creates a new client for the 'delete_protection' +// resource using the given transport to send the requests and receive the +// responses. +func NewDeleteProtectionClient(transport http.RoundTripper, path string) *DeleteProtectionClient { + return &DeleteProtectionClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *DeleteProtectionClient) Get() *DeleteProtectionGetRequest { + return &DeleteProtectionGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +func (c *DeleteProtectionClient) Update() *DeleteProtectionUpdateRequest { + return &DeleteProtectionUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// DeleteProtectionPollRequest is the request for the Poll method. +type DeleteProtectionPollRequest struct { + request *DeleteProtectionGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *DeleteProtectionPollRequest) Parameter(name string, value interface{}) *DeleteProtectionPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *DeleteProtectionPollRequest) Header(name string, value interface{}) *DeleteProtectionPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *DeleteProtectionPollRequest) Interval(value time.Duration) *DeleteProtectionPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *DeleteProtectionPollRequest) Status(value int) *DeleteProtectionPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *DeleteProtectionPollRequest) Predicate(value func(*DeleteProtectionGetResponse) bool) *DeleteProtectionPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*DeleteProtectionGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *DeleteProtectionPollRequest) StartContext(ctx context.Context) (response *DeleteProtectionPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &DeleteProtectionPollResponse{ + response: result.(*DeleteProtectionGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *DeleteProtectionPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// DeleteProtectionPollResponse is the response for the Poll method. +type DeleteProtectionPollResponse struct { + response *DeleteProtectionGetResponse +} + +// Status returns the response status code. +func (r *DeleteProtectionPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *DeleteProtectionPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *DeleteProtectionPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *DeleteProtectionPollResponse) Body() *DeleteProtection { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *DeleteProtectionPollResponse) GetBody() (value *DeleteProtection, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *DeleteProtectionClient) Poll() *DeleteProtectionPollRequest { + return &DeleteProtectionPollRequest{ + request: c.Get(), + } +} + +// DeleteProtectionGetRequest is the request for the 'get' method. +type DeleteProtectionGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *DeleteProtectionGetRequest) Parameter(name string, value interface{}) *DeleteProtectionGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *DeleteProtectionGetRequest) Header(name string, value interface{}) *DeleteProtectionGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *DeleteProtectionGetRequest) Impersonate(user string) *DeleteProtectionGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *DeleteProtectionGetRequest) Send() (result *DeleteProtectionGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *DeleteProtectionGetRequest) SendContext(ctx context.Context) (result *DeleteProtectionGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &DeleteProtectionGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readDeleteProtectionGetResponse(result, reader) + if err != nil { + return + } + return +} + +// DeleteProtectionGetResponse is the response for the 'get' method. +type DeleteProtectionGetResponse struct { + status int + header http.Header + err *errors.Error + body *DeleteProtection +} + +// Status returns the response status code. +func (r *DeleteProtectionGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *DeleteProtectionGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *DeleteProtectionGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *DeleteProtectionGetResponse) Body() *DeleteProtection { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *DeleteProtectionGetResponse) GetBody() (value *DeleteProtection, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// DeleteProtectionUpdateRequest is the request for the 'update' method. +type DeleteProtectionUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *DeleteProtection +} + +// Parameter adds a query parameter. +func (r *DeleteProtectionUpdateRequest) Parameter(name string, value interface{}) *DeleteProtectionUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *DeleteProtectionUpdateRequest) Header(name string, value interface{}) *DeleteProtectionUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *DeleteProtectionUpdateRequest) Impersonate(user string) *DeleteProtectionUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *DeleteProtectionUpdateRequest) Body(value *DeleteProtection) *DeleteProtectionUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *DeleteProtectionUpdateRequest) Send() (result *DeleteProtectionUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *DeleteProtectionUpdateRequest) SendContext(ctx context.Context) (result *DeleteProtectionUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeDeleteProtectionUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &DeleteProtectionUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readDeleteProtectionUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// DeleteProtectionUpdateResponse is the response for the 'update' method. +type DeleteProtectionUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *DeleteProtection +} + +// Status returns the response status code. +func (r *DeleteProtectionUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *DeleteProtectionUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *DeleteProtectionUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *DeleteProtectionUpdateResponse) Body() *DeleteProtection { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *DeleteProtectionUpdateResponse) GetBody() (value *DeleteProtection, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/delete_protection_list_builder.go b/clustersmgmt/v2alpha1/delete_protection_list_builder.go new file mode 100644 index 00000000..8e094ef5 --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DeleteProtectionListBuilder contains the data and logic needed to build +// 'delete_protection' objects. +type DeleteProtectionListBuilder struct { + items []*DeleteProtectionBuilder +} + +// NewDeleteProtectionList creates a new builder of 'delete_protection' objects. +func NewDeleteProtectionList() *DeleteProtectionListBuilder { + return new(DeleteProtectionListBuilder) +} + +// Items sets the items of the list. +func (b *DeleteProtectionListBuilder) Items(values ...*DeleteProtectionBuilder) *DeleteProtectionListBuilder { + b.items = make([]*DeleteProtectionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *DeleteProtectionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *DeleteProtectionListBuilder) Copy(list *DeleteProtectionList) *DeleteProtectionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*DeleteProtectionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewDeleteProtection().Copy(v) + } + } + return b +} + +// Build creates a list of 'delete_protection' objects using the +// configuration stored in the builder. +func (b *DeleteProtectionListBuilder) Build() (list *DeleteProtectionList, err error) { + items := make([]*DeleteProtection, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(DeleteProtectionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/delete_protection_list_type_json.go b/clustersmgmt/v2alpha1/delete_protection_list_type_json.go new file mode 100644 index 00000000..0c9abd7a --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDeleteProtectionList writes a list of values of the 'delete_protection' type to +// the given writer. +func MarshalDeleteProtectionList(list []*DeleteProtection, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDeleteProtectionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDeleteProtectionList writes a list of value of the 'delete_protection' type to +// the given stream. +func writeDeleteProtectionList(list []*DeleteProtection, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeDeleteProtection(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalDeleteProtectionList reads a list of values of the 'delete_protection' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalDeleteProtectionList(source interface{}) (items []*DeleteProtection, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readDeleteProtectionList(iterator) + err = iterator.Error + return +} + +// readDeleteProtectionList reads list of values of the ”delete_protection' type from +// the given iterator. +func readDeleteProtectionList(iterator *jsoniter.Iterator) []*DeleteProtection { + list := []*DeleteProtection{} + for iterator.ReadArray() { + item := readDeleteProtection(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/delete_protection_resource_json.go b/clustersmgmt/v2alpha1/delete_protection_resource_json.go new file mode 100644 index 00000000..56930cf7 --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeDeleteProtectionGetRequest(request *DeleteProtectionGetRequest, writer io.Writer) error { + return nil +} +func readDeleteProtectionGetResponse(response *DeleteProtectionGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalDeleteProtection(reader) + return err +} +func writeDeleteProtectionUpdateRequest(request *DeleteProtectionUpdateRequest, writer io.Writer) error { + return MarshalDeleteProtection(request.body, writer) +} +func readDeleteProtectionUpdateResponse(response *DeleteProtectionUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalDeleteProtection(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/delete_protection_type.go b/clustersmgmt/v2alpha1/delete_protection_type.go new file mode 100644 index 00000000..25d9e538 --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_type.go @@ -0,0 +1,150 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DeleteProtection represents the values of the 'delete_protection' type. +// +// DeleteProtection configuration. +type DeleteProtection struct { + bitmap_ uint32 + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *DeleteProtection) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Boolean flag indicating if the cluster should be be using _DeleteProtection_. +// +// By default this is `false`. +// +// To enable it a SREP needs to patch the value through OCM API +func (o *DeleteProtection) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Boolean flag indicating if the cluster should be be using _DeleteProtection_. +// +// By default this is `false`. +// +// To enable it a SREP needs to patch the value through OCM API +func (o *DeleteProtection) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// DeleteProtectionListKind is the name of the type used to represent list of objects of +// type 'delete_protection'. +const DeleteProtectionListKind = "DeleteProtectionList" + +// DeleteProtectionListLinkKind is the name of the type used to represent links to list +// of objects of type 'delete_protection'. +const DeleteProtectionListLinkKind = "DeleteProtectionListLink" + +// DeleteProtectionNilKind is the name of the type used to nil lists of objects of +// type 'delete_protection'. +const DeleteProtectionListNilKind = "DeleteProtectionListNil" + +// DeleteProtectionList is a list of values of the 'delete_protection' type. +type DeleteProtectionList struct { + href string + link bool + items []*DeleteProtection +} + +// Len returns the length of the list. +func (l *DeleteProtectionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *DeleteProtectionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *DeleteProtectionList) Get(i int) *DeleteProtection { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *DeleteProtectionList) Slice() []*DeleteProtection { + var slice []*DeleteProtection + if l == nil { + slice = make([]*DeleteProtection, 0) + } else { + slice = make([]*DeleteProtection, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *DeleteProtectionList) Each(f func(item *DeleteProtection) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *DeleteProtectionList) Range(f func(index int, item *DeleteProtection) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/delete_protection_type_json.go b/clustersmgmt/v2alpha1/delete_protection_type_json.go new file mode 100644 index 00000000..460fd2c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/delete_protection_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDeleteProtection writes a value of the 'delete_protection' type to the given writer. +func MarshalDeleteProtection(object *DeleteProtection, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDeleteProtection(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDeleteProtection writes a value of the 'delete_protection' type to the given stream. +func writeDeleteProtection(object *DeleteProtection, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + } + stream.WriteObjectEnd() +} + +// UnmarshalDeleteProtection reads a value of the 'delete_protection' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalDeleteProtection(source interface{}) (object *DeleteProtection, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readDeleteProtection(iterator) + err = iterator.Error + return +} + +// readDeleteProtection reads a value of the 'delete_protection' type from the given iterator. +func readDeleteProtection(iterator *jsoniter.Iterator) *DeleteProtection { + object := &DeleteProtection{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/detection_type_list_type_json.go b/clustersmgmt/v2alpha1/detection_type_list_type_json.go new file mode 100644 index 00000000..38591d10 --- /dev/null +++ b/clustersmgmt/v2alpha1/detection_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDetectionTypeList writes a list of values of the 'detection_type' type to +// the given writer. +func MarshalDetectionTypeList(list []DetectionType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDetectionTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDetectionTypeList writes a list of value of the 'detection_type' type to +// the given stream. +func writeDetectionTypeList(list []DetectionType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalDetectionTypeList reads a list of values of the 'detection_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalDetectionTypeList(source interface{}) (items []DetectionType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readDetectionTypeList(iterator) + err = iterator.Error + return +} + +// readDetectionTypeList reads list of values of the ”detection_type' type from +// the given iterator. +func readDetectionTypeList(iterator *jsoniter.Iterator) []DetectionType { + list := []DetectionType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := DetectionType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/detection_type_type.go b/clustersmgmt/v2alpha1/detection_type_type.go new file mode 100644 index 00000000..08f2f711 --- /dev/null +++ b/clustersmgmt/v2alpha1/detection_type_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DetectionType represents the values of the 'detection_type' enumerated type. +type DetectionType string + +const ( + // + DetectionTypeAuto DetectionType = "auto" + // + DetectionTypeManual DetectionType = "manual" +) diff --git a/clustersmgmt/v2alpha1/dns_builder.go b/clustersmgmt/v2alpha1/dns_builder.go new file mode 100644 index 00000000..941e99d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DNSBuilder contains the data and logic needed to build 'DNS' objects. +// +// DNS settings of the cluster. +type DNSBuilder struct { + bitmap_ uint32 + baseDomain string +} + +// NewDNS creates a new builder of 'DNS' objects. +func NewDNS() *DNSBuilder { + return &DNSBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *DNSBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// BaseDomain sets the value of the 'base_domain' attribute to the given value. +func (b *DNSBuilder) BaseDomain(value string) *DNSBuilder { + b.baseDomain = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *DNSBuilder) Copy(object *DNS) *DNSBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.baseDomain = object.baseDomain + return b +} + +// Build creates a 'DNS' object using the configuration stored in the builder. +func (b *DNSBuilder) Build() (object *DNS, err error) { + object = new(DNS) + object.bitmap_ = b.bitmap_ + object.baseDomain = b.baseDomain + return +} diff --git a/clustersmgmt/v2alpha1/dns_domain_builder.go b/clustersmgmt/v2alpha1/dns_domain_builder.go new file mode 100644 index 00000000..be2c5899 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_builder.go @@ -0,0 +1,153 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// DNSDomainBuilder contains the data and logic needed to build 'DNS_domain' objects. +// +// Contains the properties of a DNS domain. +type DNSDomainBuilder struct { + bitmap_ uint32 + id string + href string + cluster *ClusterLinkBuilder + organization *OrganizationLinkBuilder + reservedAtTimestamp time.Time + userDefined bool +} + +// NewDNSDomain creates a new builder of 'DNS_domain' objects. +func NewDNSDomain() *DNSDomainBuilder { + return &DNSDomainBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *DNSDomainBuilder) Link(value bool) *DNSDomainBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *DNSDomainBuilder) ID(value string) *DNSDomainBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *DNSDomainBuilder) HREF(value string) *DNSDomainBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *DNSDomainBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Cluster sets the value of the 'cluster' attribute to the given value. +// +// Definition of a cluster link. +func (b *DNSDomainBuilder) Cluster(value *ClusterLinkBuilder) *DNSDomainBuilder { + b.cluster = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Organization sets the value of the 'organization' attribute to the given value. +// +// Definition of an organization link. +func (b *DNSDomainBuilder) Organization(value *OrganizationLinkBuilder) *DNSDomainBuilder { + b.organization = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// ReservedAtTimestamp sets the value of the 'reserved_at_timestamp' attribute to the given value. +func (b *DNSDomainBuilder) ReservedAtTimestamp(value time.Time) *DNSDomainBuilder { + b.reservedAtTimestamp = value + b.bitmap_ |= 32 + return b +} + +// UserDefined sets the value of the 'user_defined' attribute to the given value. +func (b *DNSDomainBuilder) UserDefined(value bool) *DNSDomainBuilder { + b.userDefined = value + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *DNSDomainBuilder) Copy(object *DNSDomain) *DNSDomainBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.cluster != nil { + b.cluster = NewClusterLink().Copy(object.cluster) + } else { + b.cluster = nil + } + if object.organization != nil { + b.organization = NewOrganizationLink().Copy(object.organization) + } else { + b.organization = nil + } + b.reservedAtTimestamp = object.reservedAtTimestamp + b.userDefined = object.userDefined + return b +} + +// Build creates a 'DNS_domain' object using the configuration stored in the builder. +func (b *DNSDomainBuilder) Build() (object *DNSDomain, err error) { + object = new(DNSDomain) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.cluster != nil { + object.cluster, err = b.cluster.Build() + if err != nil { + return + } + } + if b.organization != nil { + object.organization, err = b.organization.Build() + if err != nil { + return + } + } + object.reservedAtTimestamp = b.reservedAtTimestamp + object.userDefined = b.userDefined + return +} diff --git a/clustersmgmt/v2alpha1/dns_domain_client.go b/clustersmgmt/v2alpha1/dns_domain_client.go new file mode 100644 index 00000000..0e4c3adc --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// DNSDomainClient is the client of the 'DNS_domain' resource. +// +// Manages DNS domain. +type DNSDomainClient struct { + transport http.RoundTripper + path string +} + +// NewDNSDomainClient creates a new client for the 'DNS_domain' +// resource using the given transport to send the requests and receive the +// responses. +func NewDNSDomainClient(transport http.RoundTripper, path string) *DNSDomainClient { + return &DNSDomainClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Delete the DNS domain. +func (c *DNSDomainClient) Delete() *DNSDomainDeleteRequest { + return &DNSDomainDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the DNS domain. +func (c *DNSDomainClient) Get() *DNSDomainGetRequest { + return &DNSDomainGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// DNSDomainPollRequest is the request for the Poll method. +type DNSDomainPollRequest struct { + request *DNSDomainGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *DNSDomainPollRequest) Parameter(name string, value interface{}) *DNSDomainPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *DNSDomainPollRequest) Header(name string, value interface{}) *DNSDomainPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *DNSDomainPollRequest) Interval(value time.Duration) *DNSDomainPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *DNSDomainPollRequest) Status(value int) *DNSDomainPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *DNSDomainPollRequest) Predicate(value func(*DNSDomainGetResponse) bool) *DNSDomainPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*DNSDomainGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *DNSDomainPollRequest) StartContext(ctx context.Context) (response *DNSDomainPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &DNSDomainPollResponse{ + response: result.(*DNSDomainGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *DNSDomainPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// DNSDomainPollResponse is the response for the Poll method. +type DNSDomainPollResponse struct { + response *DNSDomainGetResponse +} + +// Status returns the response status code. +func (r *DNSDomainPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *DNSDomainPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *DNSDomainPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *DNSDomainPollResponse) Body() *DNSDomain { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *DNSDomainPollResponse) GetBody() (value *DNSDomain, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *DNSDomainClient) Poll() *DNSDomainPollRequest { + return &DNSDomainPollRequest{ + request: c.Get(), + } +} + +// DNSDomainDeleteRequest is the request for the 'delete' method. +type DNSDomainDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *DNSDomainDeleteRequest) Parameter(name string, value interface{}) *DNSDomainDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *DNSDomainDeleteRequest) Header(name string, value interface{}) *DNSDomainDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *DNSDomainDeleteRequest) Impersonate(user string) *DNSDomainDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *DNSDomainDeleteRequest) Send() (result *DNSDomainDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *DNSDomainDeleteRequest) SendContext(ctx context.Context) (result *DNSDomainDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &DNSDomainDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// DNSDomainDeleteResponse is the response for the 'delete' method. +type DNSDomainDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *DNSDomainDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *DNSDomainDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *DNSDomainDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// DNSDomainGetRequest is the request for the 'get' method. +type DNSDomainGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *DNSDomainGetRequest) Parameter(name string, value interface{}) *DNSDomainGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *DNSDomainGetRequest) Header(name string, value interface{}) *DNSDomainGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *DNSDomainGetRequest) Impersonate(user string) *DNSDomainGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *DNSDomainGetRequest) Send() (result *DNSDomainGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *DNSDomainGetRequest) SendContext(ctx context.Context) (result *DNSDomainGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &DNSDomainGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readDNSDomainGetResponse(result, reader) + if err != nil { + return + } + return +} + +// DNSDomainGetResponse is the response for the 'get' method. +type DNSDomainGetResponse struct { + status int + header http.Header + err *errors.Error + body *DNSDomain +} + +// Status returns the response status code. +func (r *DNSDomainGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *DNSDomainGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *DNSDomainGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *DNSDomainGetResponse) Body() *DNSDomain { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *DNSDomainGetResponse) GetBody() (value *DNSDomain, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/dns_domain_list_builder.go b/clustersmgmt/v2alpha1/dns_domain_list_builder.go new file mode 100644 index 00000000..206eb37d --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DNSDomainListBuilder contains the data and logic needed to build +// 'DNS_domain' objects. +type DNSDomainListBuilder struct { + items []*DNSDomainBuilder +} + +// NewDNSDomainList creates a new builder of 'DNS_domain' objects. +func NewDNSDomainList() *DNSDomainListBuilder { + return new(DNSDomainListBuilder) +} + +// Items sets the items of the list. +func (b *DNSDomainListBuilder) Items(values ...*DNSDomainBuilder) *DNSDomainListBuilder { + b.items = make([]*DNSDomainBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *DNSDomainListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *DNSDomainListBuilder) Copy(list *DNSDomainList) *DNSDomainListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*DNSDomainBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewDNSDomain().Copy(v) + } + } + return b +} + +// Build creates a list of 'DNS_domain' objects using the +// configuration stored in the builder. +func (b *DNSDomainListBuilder) Build() (list *DNSDomainList, err error) { + items := make([]*DNSDomain, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(DNSDomainList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/dns_domain_list_type_json.go b/clustersmgmt/v2alpha1/dns_domain_list_type_json.go new file mode 100644 index 00000000..93c9a332 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDNSDomainList writes a list of values of the 'DNS_domain' type to +// the given writer. +func MarshalDNSDomainList(list []*DNSDomain, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDNSDomainList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDNSDomainList writes a list of value of the 'DNS_domain' type to +// the given stream. +func writeDNSDomainList(list []*DNSDomain, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeDNSDomain(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalDNSDomainList reads a list of values of the 'DNS_domain' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalDNSDomainList(source interface{}) (items []*DNSDomain, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readDNSDomainList(iterator) + err = iterator.Error + return +} + +// readDNSDomainList reads list of values of the ”DNS_domain' type from +// the given iterator. +func readDNSDomainList(iterator *jsoniter.Iterator) []*DNSDomain { + list := []*DNSDomain{} + for iterator.ReadArray() { + item := readDNSDomain(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/dns_domain_resource_json.go b/clustersmgmt/v2alpha1/dns_domain_resource_json.go new file mode 100644 index 00000000..db213064 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeDNSDomainDeleteRequest(request *DNSDomainDeleteRequest, writer io.Writer) error { + return nil +} +func readDNSDomainDeleteResponse(response *DNSDomainDeleteResponse, reader io.Reader) error { + return nil +} +func writeDNSDomainGetRequest(request *DNSDomainGetRequest, writer io.Writer) error { + return nil +} +func readDNSDomainGetResponse(response *DNSDomainGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalDNSDomain(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/dns_domain_type.go b/clustersmgmt/v2alpha1/dns_domain_type.go new file mode 100644 index 00000000..1d9aaa03 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_type.go @@ -0,0 +1,318 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// DNSDomainKind is the name of the type used to represent objects +// of type 'DNS_domain'. +const DNSDomainKind = "DNSDomain" + +// DNSDomainLinkKind is the name of the type used to represent links +// to objects of type 'DNS_domain'. +const DNSDomainLinkKind = "DNSDomainLink" + +// DNSDomainNilKind is the name of the type used to nil references +// to objects of type 'DNS_domain'. +const DNSDomainNilKind = "DNSDomainNil" + +// DNSDomain represents the values of the 'DNS_domain' type. +// +// Contains the properties of a DNS domain. +type DNSDomain struct { + bitmap_ uint32 + id string + href string + cluster *ClusterLink + organization *OrganizationLink + reservedAtTimestamp time.Time + userDefined bool +} + +// Kind returns the name of the type of the object. +func (o *DNSDomain) Kind() string { + if o == nil { + return DNSDomainNilKind + } + if o.bitmap_&1 != 0 { + return DNSDomainLinkKind + } + return DNSDomainKind +} + +// Link returns true iif this is a link. +func (o *DNSDomain) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *DNSDomain) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *DNSDomain) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *DNSDomain) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *DNSDomain) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *DNSDomain) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Cluster returns the value of the 'cluster' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the cluster that is registered with the DNS domain (optional). +func (o *DNSDomain) Cluster() *ClusterLink { + if o != nil && o.bitmap_&8 != 0 { + return o.cluster + } + return nil +} + +// GetCluster returns the value of the 'cluster' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the cluster that is registered with the DNS domain (optional). +func (o *DNSDomain) GetCluster() (value *ClusterLink, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.cluster + } + return +} + +// Organization returns the value of the 'organization' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the organization that reserved the DNS domain. +func (o *DNSDomain) Organization() *OrganizationLink { + if o != nil && o.bitmap_&16 != 0 { + return o.organization + } + return nil +} + +// GetOrganization returns the value of the 'organization' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the organization that reserved the DNS domain. +func (o *DNSDomain) GetOrganization() (value *OrganizationLink, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.organization + } + return +} + +// ReservedAtTimestamp returns the value of the 'reserved_at_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the DNS domain was reserved. +func (o *DNSDomain) ReservedAtTimestamp() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.reservedAtTimestamp + } + return time.Time{} +} + +// GetReservedAtTimestamp returns the value of the 'reserved_at_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the DNS domain was reserved. +func (o *DNSDomain) GetReservedAtTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.reservedAtTimestamp + } + return +} + +// UserDefined returns the value of the 'user_defined' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this dns domain is user defined. +func (o *DNSDomain) UserDefined() bool { + if o != nil && o.bitmap_&64 != 0 { + return o.userDefined + } + return false +} + +// GetUserDefined returns the value of the 'user_defined' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this dns domain is user defined. +func (o *DNSDomain) GetUserDefined() (value bool, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.userDefined + } + return +} + +// DNSDomainListKind is the name of the type used to represent list of objects of +// type 'DNS_domain'. +const DNSDomainListKind = "DNSDomainList" + +// DNSDomainListLinkKind is the name of the type used to represent links to list +// of objects of type 'DNS_domain'. +const DNSDomainListLinkKind = "DNSDomainListLink" + +// DNSDomainNilKind is the name of the type used to nil lists of objects of +// type 'DNS_domain'. +const DNSDomainListNilKind = "DNSDomainListNil" + +// DNSDomainList is a list of values of the 'DNS_domain' type. +type DNSDomainList struct { + href string + link bool + items []*DNSDomain +} + +// Kind returns the name of the type of the object. +func (l *DNSDomainList) Kind() string { + if l == nil { + return DNSDomainListNilKind + } + if l.link { + return DNSDomainListLinkKind + } + return DNSDomainListKind +} + +// Link returns true iif this is a link. +func (l *DNSDomainList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *DNSDomainList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *DNSDomainList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *DNSDomainList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *DNSDomainList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *DNSDomainList) Get(i int) *DNSDomain { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *DNSDomainList) Slice() []*DNSDomain { + var slice []*DNSDomain + if l == nil { + slice = make([]*DNSDomain, 0) + } else { + slice = make([]*DNSDomain, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *DNSDomainList) Each(f func(item *DNSDomain) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *DNSDomainList) Range(f func(index int, item *DNSDomain) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/dns_domain_type_json.go b/clustersmgmt/v2alpha1/dns_domain_type_json.go new file mode 100644 index 00000000..87d634a1 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domain_type_json.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDNSDomain writes a value of the 'DNS_domain' type to the given writer. +func MarshalDNSDomain(object *DNSDomain, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDNSDomain(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDNSDomain writes a value of the 'DNS_domain' type to the given stream. +func writeDNSDomain(object *DNSDomain, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(DNSDomainLinkKind) + } else { + stream.WriteString(DNSDomainKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.cluster != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster") + writeClusterLink(object.cluster, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.organization != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("organization") + writeOrganizationLink(object.organization, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("reserved_at_timestamp") + stream.WriteString((object.reservedAtTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("user_defined") + stream.WriteBool(object.userDefined) + } + stream.WriteObjectEnd() +} + +// UnmarshalDNSDomain reads a value of the 'DNS_domain' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalDNSDomain(source interface{}) (object *DNSDomain, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readDNSDomain(iterator) + err = iterator.Error + return +} + +// readDNSDomain reads a value of the 'DNS_domain' type from the given iterator. +func readDNSDomain(iterator *jsoniter.Iterator) *DNSDomain { + object := &DNSDomain{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == DNSDomainLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "cluster": + value := readClusterLink(iterator) + object.cluster = value + object.bitmap_ |= 8 + case "organization": + value := readOrganizationLink(iterator) + object.organization = value + object.bitmap_ |= 16 + case "reserved_at_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.reservedAtTimestamp = value + object.bitmap_ |= 32 + case "user_defined": + value := iterator.ReadBool() + object.userDefined = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/dns_domains_client.go b/clustersmgmt/v2alpha1/dns_domains_client.go new file mode 100644 index 00000000..8db2a821 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domains_client.go @@ -0,0 +1,479 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// DNSDomainsClient is the client of the 'DNS_domains' resource. +// +// Manages the collection of DNS domains. +type DNSDomainsClient struct { + transport http.RoundTripper + path string +} + +// NewDNSDomainsClient creates a new client for the 'DNS_domains' +// resource using the given transport to send the requests and receive the +// responses. +func NewDNSDomainsClient(transport http.RoundTripper, path string) *DNSDomainsClient { + return &DNSDomainsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a DNS domain. +func (c *DNSDomainsClient) Add() *DNSDomainsAddRequest { + return &DNSDomainsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +func (c *DNSDomainsClient) List() *DNSDomainsListRequest { + return &DNSDomainsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// DNSDomain returns the target 'DNS_domain' resource for the given identifier. +// +// Reference to the resource that manages a specific DNS doamin. +func (c *DNSDomainsClient) DNSDomain(id string) *DNSDomainClient { + return NewDNSDomainClient( + c.transport, + path.Join(c.path, id), + ) +} + +// DNSDomainsAddRequest is the request for the 'add' method. +type DNSDomainsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *DNSDomain +} + +// Parameter adds a query parameter. +func (r *DNSDomainsAddRequest) Parameter(name string, value interface{}) *DNSDomainsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *DNSDomainsAddRequest) Header(name string, value interface{}) *DNSDomainsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *DNSDomainsAddRequest) Impersonate(user string) *DNSDomainsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the DNS domain. +func (r *DNSDomainsAddRequest) Body(value *DNSDomain) *DNSDomainsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *DNSDomainsAddRequest) Send() (result *DNSDomainsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *DNSDomainsAddRequest) SendContext(ctx context.Context) (result *DNSDomainsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeDNSDomainsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &DNSDomainsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readDNSDomainsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// DNSDomainsAddResponse is the response for the 'add' method. +type DNSDomainsAddResponse struct { + status int + header http.Header + err *errors.Error + body *DNSDomain +} + +// Status returns the response status code. +func (r *DNSDomainsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *DNSDomainsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *DNSDomainsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the DNS domain. +func (r *DNSDomainsAddResponse) Body() *DNSDomain { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the DNS domain. +func (r *DNSDomainsAddResponse) GetBody() (value *DNSDomain, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// DNSDomainsListRequest is the request for the 'list' method. +type DNSDomainsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *DNSDomainsListRequest) Parameter(name string, value interface{}) *DNSDomainsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *DNSDomainsListRequest) Header(name string, value interface{}) *DNSDomainsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *DNSDomainsListRequest) Impersonate(user string) *DNSDomainsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *DNSDomainsListRequest) Page(value int) *DNSDomainsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the dns domain instead of +// the names of the columns of a table. For example, in order to retrieve all the +// dns domains with a ID starting with `02a5` should be: +// +// ```sql +// id like '02a5%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// dns domains that the user has permission to see will be returned. +func (r *DNSDomainsListRequest) Search(value string) *DNSDomainsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *DNSDomainsListRequest) Size(value int) *DNSDomainsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *DNSDomainsListRequest) Send() (result *DNSDomainsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *DNSDomainsListRequest) SendContext(ctx context.Context) (result *DNSDomainsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &DNSDomainsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readDNSDomainsListResponse(result, reader) + if err != nil { + return + } + return +} + +// DNSDomainsListResponse is the response for the 'list' method. +type DNSDomainsListResponse struct { + status int + header http.Header + err *errors.Error + items *DNSDomainList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *DNSDomainsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *DNSDomainsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *DNSDomainsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved a list of DNS domains. +func (r *DNSDomainsListResponse) Items() *DNSDomainList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved a list of DNS domains. +func (r *DNSDomainsListResponse) GetItems() (value *DNSDomainList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *DNSDomainsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *DNSDomainsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *DNSDomainsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *DNSDomainsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *DNSDomainsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *DNSDomainsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/dns_domains_resource_json.go b/clustersmgmt/v2alpha1/dns_domains_resource_json.go new file mode 100644 index 00000000..888ba88e --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_domains_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeDNSDomainsAddRequest(request *DNSDomainsAddRequest, writer io.Writer) error { + return MarshalDNSDomain(request.body, writer) +} +func readDNSDomainsAddResponse(response *DNSDomainsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalDNSDomain(reader) + return err +} +func writeDNSDomainsListRequest(request *DNSDomainsListRequest, writer io.Writer) error { + return nil +} +func readDNSDomainsListResponse(response *DNSDomainsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readDNSDomainList(iterator) + response.items = &DNSDomainList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/dns_list_builder.go b/clustersmgmt/v2alpha1/dns_list_builder.go new file mode 100644 index 00000000..43babae6 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DNSListBuilder contains the data and logic needed to build +// 'DNS' objects. +type DNSListBuilder struct { + items []*DNSBuilder +} + +// NewDNSList creates a new builder of 'DNS' objects. +func NewDNSList() *DNSListBuilder { + return new(DNSListBuilder) +} + +// Items sets the items of the list. +func (b *DNSListBuilder) Items(values ...*DNSBuilder) *DNSListBuilder { + b.items = make([]*DNSBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *DNSListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *DNSListBuilder) Copy(list *DNSList) *DNSListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*DNSBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewDNS().Copy(v) + } + } + return b +} + +// Build creates a list of 'DNS' objects using the +// configuration stored in the builder. +func (b *DNSListBuilder) Build() (list *DNSList, err error) { + items := make([]*DNS, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(DNSList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/dns_list_type_json.go b/clustersmgmt/v2alpha1/dns_list_type_json.go new file mode 100644 index 00000000..d5d09e05 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDNSList writes a list of values of the 'DNS' type to +// the given writer. +func MarshalDNSList(list []*DNS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDNSList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDNSList writes a list of value of the 'DNS' type to +// the given stream. +func writeDNSList(list []*DNS, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeDNS(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalDNSList reads a list of values of the 'DNS' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalDNSList(source interface{}) (items []*DNS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readDNSList(iterator) + err = iterator.Error + return +} + +// readDNSList reads list of values of the ”DNS' type from +// the given iterator. +func readDNSList(iterator *jsoniter.Iterator) []*DNS { + list := []*DNS{} + for iterator.ReadArray() { + item := readDNS(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/dns_type.go b/clustersmgmt/v2alpha1/dns_type.go new file mode 100644 index 00000000..8cb1052c --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_type.go @@ -0,0 +1,228 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// DNS represents the values of the 'DNS' type. +// +// DNS settings of the cluster. +type DNS struct { + bitmap_ uint32 + baseDomain string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *DNS) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// BaseDomain returns the value of the 'base_domain' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Base DNS domain of the cluster. +// +// During the installation of the cluster it is necessary to create multiple DNS records. +// They will be created as sub-domains of this domain. For example, if the domain_prefix of the +// cluster is `mycluster` and the base domain is `example.com` then the following DNS +// records will be created: +// +// ``` +// mycluster-api.example.com +// mycluster-etcd-0.example.com +// mycluster-etcd-1.example.com +// mycluster-etcd-3.example.com +// ``` +// +// The exact number, type and names of the created DNS record depends on the characteristics +// of the cluster, and may be different for different versions of _OpenShift_. Please don't +// rely on them. For example, to find what is the URL of the Kubernetes API server of the +// cluster don't assume that it will be `mycluster-api.example.com`. Instead of that use +// this API to retrieve the description of the cluster, and get it from the `api.url` +// attribute. For example, if the identifier of the cluster is `123` send a request like +// this: +// +// ```http +// GET /api/clusters_mgmt/v1/clusters/123 HTTP/1.1 +// ``` +// +// That will return a response like this, including the `api.url` attribute: +// +// ```json +// +// { +// "kind": "Cluster", +// "id": "123", +// "href": "/api/clusters_mgmt/v1/clusters/123", +// "api": { +// "url": "https://mycluster-api.example.com:6443" +// }, +// ... +// } +// +// ``` +// +// When the cluster is created in Amazon Web Services it is necessary to create this base +// DNS domain in advance, using AWS Route53 (https://console.aws.amazon.com/route53). +func (o *DNS) BaseDomain() string { + if o != nil && o.bitmap_&1 != 0 { + return o.baseDomain + } + return "" +} + +// GetBaseDomain returns the value of the 'base_domain' attribute and +// a flag indicating if the attribute has a value. +// +// Base DNS domain of the cluster. +// +// During the installation of the cluster it is necessary to create multiple DNS records. +// They will be created as sub-domains of this domain. For example, if the domain_prefix of the +// cluster is `mycluster` and the base domain is `example.com` then the following DNS +// records will be created: +// +// ``` +// mycluster-api.example.com +// mycluster-etcd-0.example.com +// mycluster-etcd-1.example.com +// mycluster-etcd-3.example.com +// ``` +// +// The exact number, type and names of the created DNS record depends on the characteristics +// of the cluster, and may be different for different versions of _OpenShift_. Please don't +// rely on them. For example, to find what is the URL of the Kubernetes API server of the +// cluster don't assume that it will be `mycluster-api.example.com`. Instead of that use +// this API to retrieve the description of the cluster, and get it from the `api.url` +// attribute. For example, if the identifier of the cluster is `123` send a request like +// this: +// +// ```http +// GET /api/clusters_mgmt/v1/clusters/123 HTTP/1.1 +// ``` +// +// That will return a response like this, including the `api.url` attribute: +// +// ```json +// +// { +// "kind": "Cluster", +// "id": "123", +// "href": "/api/clusters_mgmt/v1/clusters/123", +// "api": { +// "url": "https://mycluster-api.example.com:6443" +// }, +// ... +// } +// +// ``` +// +// When the cluster is created in Amazon Web Services it is necessary to create this base +// DNS domain in advance, using AWS Route53 (https://console.aws.amazon.com/route53). +func (o *DNS) GetBaseDomain() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.baseDomain + } + return +} + +// DNSListKind is the name of the type used to represent list of objects of +// type 'DNS'. +const DNSListKind = "DNSList" + +// DNSListLinkKind is the name of the type used to represent links to list +// of objects of type 'DNS'. +const DNSListLinkKind = "DNSListLink" + +// DNSNilKind is the name of the type used to nil lists of objects of +// type 'DNS'. +const DNSListNilKind = "DNSListNil" + +// DNSList is a list of values of the 'DNS' type. +type DNSList struct { + href string + link bool + items []*DNS +} + +// Len returns the length of the list. +func (l *DNSList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *DNSList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *DNSList) Get(i int) *DNS { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *DNSList) Slice() []*DNS { + var slice []*DNS + if l == nil { + slice = make([]*DNS, 0) + } else { + slice = make([]*DNS, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *DNSList) Each(f func(item *DNS) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *DNSList) Range(f func(index int, item *DNS) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/dns_type_json.go b/clustersmgmt/v2alpha1/dns_type_json.go new file mode 100644 index 00000000..86643482 --- /dev/null +++ b/clustersmgmt/v2alpha1/dns_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalDNS writes a value of the 'DNS' type to the given writer. +func MarshalDNS(object *DNS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeDNS(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeDNS writes a value of the 'DNS' type to the given stream. +func writeDNS(object *DNS, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("base_domain") + stream.WriteString(object.baseDomain) + } + stream.WriteObjectEnd() +} + +// UnmarshalDNS reads a value of the 'DNS' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalDNS(source interface{}) (object *DNS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readDNS(iterator) + err = iterator.Error + return +} + +// readDNS reads a value of the 'DNS' type from the given iterator. +func readDNS(iterator *jsoniter.Iterator) *DNS { + object := &DNS{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "base_domain": + value := iterator.ReadString() + object.baseDomain = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/ec_2_metadata_http_tokens_list_type_json.go b/clustersmgmt/v2alpha1/ec_2_metadata_http_tokens_list_type_json.go new file mode 100644 index 00000000..46a0edcb --- /dev/null +++ b/clustersmgmt/v2alpha1/ec_2_metadata_http_tokens_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEc2MetadataHttpTokensList writes a list of values of the 'ec_2_metadata_http_tokens' type to +// the given writer. +func MarshalEc2MetadataHttpTokensList(list []Ec2MetadataHttpTokens, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEc2MetadataHttpTokensList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEc2MetadataHttpTokensList writes a list of value of the 'ec_2_metadata_http_tokens' type to +// the given stream. +func writeEc2MetadataHttpTokensList(list []Ec2MetadataHttpTokens, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalEc2MetadataHttpTokensList reads a list of values of the 'ec_2_metadata_http_tokens' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalEc2MetadataHttpTokensList(source interface{}) (items []Ec2MetadataHttpTokens, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readEc2MetadataHttpTokensList(iterator) + err = iterator.Error + return +} + +// readEc2MetadataHttpTokensList reads list of values of the ”ec_2_metadata_http_tokens' type from +// the given iterator. +func readEc2MetadataHttpTokensList(iterator *jsoniter.Iterator) []Ec2MetadataHttpTokens { + list := []Ec2MetadataHttpTokens{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := Ec2MetadataHttpTokens(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ec_2_metadata_http_tokens_type.go b/clustersmgmt/v2alpha1/ec_2_metadata_http_tokens_type.go new file mode 100644 index 00000000..8f4c9642 --- /dev/null +++ b/clustersmgmt/v2alpha1/ec_2_metadata_http_tokens_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Ec2MetadataHttpTokens represents the values of the 'ec_2_metadata_http_tokens' enumerated type. +type Ec2MetadataHttpTokens string + +const ( + // imdsv2 is optional + Ec2MetadataHttpTokensOptional Ec2MetadataHttpTokens = "optional" + // imdsv2 is required + Ec2MetadataHttpTokensRequired Ec2MetadataHttpTokens = "required" +) diff --git a/clustersmgmt/v2alpha1/encryption_key_builder.go b/clustersmgmt/v2alpha1/encryption_key_builder.go new file mode 100644 index 00000000..c9d8ebe0 --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_key_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// EncryptionKeyBuilder contains the data and logic needed to build 'encryption_key' objects. +// +// Description of a cloud provider encryption key. +type EncryptionKeyBuilder struct { + bitmap_ uint32 + id string + href string + name string +} + +// NewEncryptionKey creates a new builder of 'encryption_key' objects. +func NewEncryptionKey() *EncryptionKeyBuilder { + return &EncryptionKeyBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *EncryptionKeyBuilder) Link(value bool) *EncryptionKeyBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *EncryptionKeyBuilder) ID(value string) *EncryptionKeyBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *EncryptionKeyBuilder) HREF(value string) *EncryptionKeyBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *EncryptionKeyBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *EncryptionKeyBuilder) Name(value string) *EncryptionKeyBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *EncryptionKeyBuilder) Copy(object *EncryptionKey) *EncryptionKeyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.name = object.name + return b +} + +// Build creates a 'encryption_key' object using the configuration stored in the builder. +func (b *EncryptionKeyBuilder) Build() (object *EncryptionKey, err error) { + object = new(EncryptionKey) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.name = b.name + return +} diff --git a/clustersmgmt/v2alpha1/encryption_key_list_builder.go b/clustersmgmt/v2alpha1/encryption_key_list_builder.go new file mode 100644 index 00000000..87b604e8 --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_key_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// EncryptionKeyListBuilder contains the data and logic needed to build +// 'encryption_key' objects. +type EncryptionKeyListBuilder struct { + items []*EncryptionKeyBuilder +} + +// NewEncryptionKeyList creates a new builder of 'encryption_key' objects. +func NewEncryptionKeyList() *EncryptionKeyListBuilder { + return new(EncryptionKeyListBuilder) +} + +// Items sets the items of the list. +func (b *EncryptionKeyListBuilder) Items(values ...*EncryptionKeyBuilder) *EncryptionKeyListBuilder { + b.items = make([]*EncryptionKeyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *EncryptionKeyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *EncryptionKeyListBuilder) Copy(list *EncryptionKeyList) *EncryptionKeyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*EncryptionKeyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewEncryptionKey().Copy(v) + } + } + return b +} + +// Build creates a list of 'encryption_key' objects using the +// configuration stored in the builder. +func (b *EncryptionKeyListBuilder) Build() (list *EncryptionKeyList, err error) { + items := make([]*EncryptionKey, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(EncryptionKeyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/encryption_key_list_type_json.go b/clustersmgmt/v2alpha1/encryption_key_list_type_json.go new file mode 100644 index 00000000..3a1c99a9 --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_key_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEncryptionKeyList writes a list of values of the 'encryption_key' type to +// the given writer. +func MarshalEncryptionKeyList(list []*EncryptionKey, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEncryptionKeyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEncryptionKeyList writes a list of value of the 'encryption_key' type to +// the given stream. +func writeEncryptionKeyList(list []*EncryptionKey, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeEncryptionKey(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalEncryptionKeyList reads a list of values of the 'encryption_key' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalEncryptionKeyList(source interface{}) (items []*EncryptionKey, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readEncryptionKeyList(iterator) + err = iterator.Error + return +} + +// readEncryptionKeyList reads list of values of the ”encryption_key' type from +// the given iterator. +func readEncryptionKeyList(iterator *jsoniter.Iterator) []*EncryptionKey { + list := []*EncryptionKey{} + for iterator.ReadArray() { + item := readEncryptionKey(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/encryption_key_type.go b/clustersmgmt/v2alpha1/encryption_key_type.go new file mode 100644 index 00000000..e0b25655 --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_key_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// EncryptionKeyKind is the name of the type used to represent objects +// of type 'encryption_key'. +const EncryptionKeyKind = "EncryptionKey" + +// EncryptionKeyLinkKind is the name of the type used to represent links +// to objects of type 'encryption_key'. +const EncryptionKeyLinkKind = "EncryptionKeyLink" + +// EncryptionKeyNilKind is the name of the type used to nil references +// to objects of type 'encryption_key'. +const EncryptionKeyNilKind = "EncryptionKeyNil" + +// EncryptionKey represents the values of the 'encryption_key' type. +// +// Description of a cloud provider encryption key. +type EncryptionKey struct { + bitmap_ uint32 + id string + href string + name string +} + +// Kind returns the name of the type of the object. +func (o *EncryptionKey) Kind() string { + if o == nil { + return EncryptionKeyNilKind + } + if o.bitmap_&1 != 0 { + return EncryptionKeyLinkKind + } + return EncryptionKeyKind +} + +// Link returns true iif this is a link. +func (o *EncryptionKey) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *EncryptionKey) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *EncryptionKey) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *EncryptionKey) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *EncryptionKey) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *EncryptionKey) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the encryption key. +func (o *EncryptionKey) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the encryption key. +func (o *EncryptionKey) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// EncryptionKeyListKind is the name of the type used to represent list of objects of +// type 'encryption_key'. +const EncryptionKeyListKind = "EncryptionKeyList" + +// EncryptionKeyListLinkKind is the name of the type used to represent links to list +// of objects of type 'encryption_key'. +const EncryptionKeyListLinkKind = "EncryptionKeyListLink" + +// EncryptionKeyNilKind is the name of the type used to nil lists of objects of +// type 'encryption_key'. +const EncryptionKeyListNilKind = "EncryptionKeyListNil" + +// EncryptionKeyList is a list of values of the 'encryption_key' type. +type EncryptionKeyList struct { + href string + link bool + items []*EncryptionKey +} + +// Kind returns the name of the type of the object. +func (l *EncryptionKeyList) Kind() string { + if l == nil { + return EncryptionKeyListNilKind + } + if l.link { + return EncryptionKeyListLinkKind + } + return EncryptionKeyListKind +} + +// Link returns true iif this is a link. +func (l *EncryptionKeyList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *EncryptionKeyList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *EncryptionKeyList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *EncryptionKeyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *EncryptionKeyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *EncryptionKeyList) Get(i int) *EncryptionKey { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *EncryptionKeyList) Slice() []*EncryptionKey { + var slice []*EncryptionKey + if l == nil { + slice = make([]*EncryptionKey, 0) + } else { + slice = make([]*EncryptionKey, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *EncryptionKeyList) Each(f func(item *EncryptionKey) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *EncryptionKeyList) Range(f func(index int, item *EncryptionKey) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/encryption_key_type_json.go b/clustersmgmt/v2alpha1/encryption_key_type_json.go new file mode 100644 index 00000000..96c7f784 --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_key_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEncryptionKey writes a value of the 'encryption_key' type to the given writer. +func MarshalEncryptionKey(object *EncryptionKey, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEncryptionKey(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEncryptionKey writes a value of the 'encryption_key' type to the given stream. +func writeEncryptionKey(object *EncryptionKey, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(EncryptionKeyLinkKind) + } else { + stream.WriteString(EncryptionKeyKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + } + stream.WriteObjectEnd() +} + +// UnmarshalEncryptionKey reads a value of the 'encryption_key' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalEncryptionKey(source interface{}) (object *EncryptionKey, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readEncryptionKey(iterator) + err = iterator.Error + return +} + +// readEncryptionKey reads a value of the 'encryption_key' type from the given iterator. +func readEncryptionKey(iterator *jsoniter.Iterator) *EncryptionKey { + object := &EncryptionKey{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == EncryptionKeyLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/encryption_keys_inquiry_client.go b/clustersmgmt/v2alpha1/encryption_keys_inquiry_client.go new file mode 100644 index 00000000..f9d980f6 --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_keys_inquiry_client.go @@ -0,0 +1,318 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// EncryptionKeysInquiryClient is the client of the 'encryption_keys_inquiry' resource. +// +// Manages a specific encryption keys inquiry. +type EncryptionKeysInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewEncryptionKeysInquiryClient creates a new client for the 'encryption_keys_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewEncryptionKeysInquiryClient(transport http.RoundTripper, path string) *EncryptionKeysInquiryClient { + return &EncryptionKeysInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of encryption keys. +// IMPORTANT: This collection doesn't currently support paging or searching, so the returned +// `page` will always be 1 and `size` and `total` will always be the total number of available regions +// of the provider. +func (c *EncryptionKeysInquiryClient) Search() *EncryptionKeysInquirySearchRequest { + return &EncryptionKeysInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// EncryptionKeysInquirySearchRequest is the request for the 'search' method. +type EncryptionKeysInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *EncryptionKeysInquirySearchRequest) Parameter(name string, value interface{}) *EncryptionKeysInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *EncryptionKeysInquirySearchRequest) Header(name string, value interface{}) *EncryptionKeysInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *EncryptionKeysInquirySearchRequest) Impersonate(user string) *EncryptionKeysInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry +func (r *EncryptionKeysInquirySearchRequest) Body(value *CloudProviderData) *EncryptionKeysInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *EncryptionKeysInquirySearchRequest) Page(value int) *EncryptionKeysInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *EncryptionKeysInquirySearchRequest) Size(value int) *EncryptionKeysInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *EncryptionKeysInquirySearchRequest) Send() (result *EncryptionKeysInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *EncryptionKeysInquirySearchRequest) SendContext(ctx context.Context) (result *EncryptionKeysInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeEncryptionKeysInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &EncryptionKeysInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readEncryptionKeysInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// EncryptionKeysInquirySearchResponse is the response for the 'search' method. +type EncryptionKeysInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + items *EncryptionKeyList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *EncryptionKeysInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *EncryptionKeysInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *EncryptionKeysInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of encryption keys. +func (r *EncryptionKeysInquirySearchResponse) Items() *EncryptionKeyList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of encryption keys. +func (r *EncryptionKeysInquirySearchResponse) GetItems() (value *EncryptionKeyList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *EncryptionKeysInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *EncryptionKeysInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *EncryptionKeysInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// regions of the provider. +func (r *EncryptionKeysInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available regions of the provider. +func (r *EncryptionKeysInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available regions of the provider. +func (r *EncryptionKeysInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/encryption_keys_inquiry_resource_json.go b/clustersmgmt/v2alpha1/encryption_keys_inquiry_resource_json.go new file mode 100644 index 00000000..e2a458db --- /dev/null +++ b/clustersmgmt/v2alpha1/encryption_keys_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeEncryptionKeysInquirySearchRequest(request *EncryptionKeysInquirySearchRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readEncryptionKeysInquirySearchResponse(response *EncryptionKeysInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readEncryptionKeyList(iterator) + response.items = &EncryptionKeyList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/environment_builder.go b/clustersmgmt/v2alpha1/environment_builder.go new file mode 100644 index 00000000..44c33f01 --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_builder.go @@ -0,0 +1,97 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// EnvironmentBuilder contains the data and logic needed to build 'environment' objects. +// +// Description of an environment +type EnvironmentBuilder struct { + bitmap_ uint32 + backplaneURL string + lastLimitedSupportCheck time.Time + lastUpgradeAvailableCheck time.Time + name string +} + +// NewEnvironment creates a new builder of 'environment' objects. +func NewEnvironment() *EnvironmentBuilder { + return &EnvironmentBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *EnvironmentBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// BackplaneURL sets the value of the 'backplane_URL' attribute to the given value. +func (b *EnvironmentBuilder) BackplaneURL(value string) *EnvironmentBuilder { + b.backplaneURL = value + b.bitmap_ |= 1 + return b +} + +// LastLimitedSupportCheck sets the value of the 'last_limited_support_check' attribute to the given value. +func (b *EnvironmentBuilder) LastLimitedSupportCheck(value time.Time) *EnvironmentBuilder { + b.lastLimitedSupportCheck = value + b.bitmap_ |= 2 + return b +} + +// LastUpgradeAvailableCheck sets the value of the 'last_upgrade_available_check' attribute to the given value. +func (b *EnvironmentBuilder) LastUpgradeAvailableCheck(value time.Time) *EnvironmentBuilder { + b.lastUpgradeAvailableCheck = value + b.bitmap_ |= 4 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *EnvironmentBuilder) Name(value string) *EnvironmentBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *EnvironmentBuilder) Copy(object *Environment) *EnvironmentBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.backplaneURL = object.backplaneURL + b.lastLimitedSupportCheck = object.lastLimitedSupportCheck + b.lastUpgradeAvailableCheck = object.lastUpgradeAvailableCheck + b.name = object.name + return b +} + +// Build creates a 'environment' object using the configuration stored in the builder. +func (b *EnvironmentBuilder) Build() (object *Environment, err error) { + object = new(Environment) + object.bitmap_ = b.bitmap_ + object.backplaneURL = b.backplaneURL + object.lastLimitedSupportCheck = b.lastLimitedSupportCheck + object.lastUpgradeAvailableCheck = b.lastUpgradeAvailableCheck + object.name = b.name + return +} diff --git a/clustersmgmt/v2alpha1/environment_client.go b/clustersmgmt/v2alpha1/environment_client.go new file mode 100644 index 00000000..456d1fa4 --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_client.go @@ -0,0 +1,466 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// EnvironmentClient is the client of the 'environment' resource. +// +// Manages a specific environment. +type EnvironmentClient struct { + transport http.RoundTripper + path string +} + +// NewEnvironmentClient creates a new client for the 'environment' +// resource using the given transport to send the requests and receive the +// responses. +func NewEnvironmentClient(transport http.RoundTripper, path string) *EnvironmentClient { + return &EnvironmentClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the environment. +func (c *EnvironmentClient) Get() *EnvironmentGetRequest { + return &EnvironmentGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the environment. +// +// Attributes that can be updated are: +// +// - `last_upgrade_available_check` +// - `last_limited_support_check` +func (c *EnvironmentClient) Update() *EnvironmentUpdateRequest { + return &EnvironmentUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// EnvironmentPollRequest is the request for the Poll method. +type EnvironmentPollRequest struct { + request *EnvironmentGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *EnvironmentPollRequest) Parameter(name string, value interface{}) *EnvironmentPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *EnvironmentPollRequest) Header(name string, value interface{}) *EnvironmentPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *EnvironmentPollRequest) Interval(value time.Duration) *EnvironmentPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *EnvironmentPollRequest) Status(value int) *EnvironmentPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *EnvironmentPollRequest) Predicate(value func(*EnvironmentGetResponse) bool) *EnvironmentPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*EnvironmentGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *EnvironmentPollRequest) StartContext(ctx context.Context) (response *EnvironmentPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &EnvironmentPollResponse{ + response: result.(*EnvironmentGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *EnvironmentPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// EnvironmentPollResponse is the response for the Poll method. +type EnvironmentPollResponse struct { + response *EnvironmentGetResponse +} + +// Status returns the response status code. +func (r *EnvironmentPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *EnvironmentPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *EnvironmentPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *EnvironmentPollResponse) Body() *Environment { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *EnvironmentPollResponse) GetBody() (value *Environment, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *EnvironmentClient) Poll() *EnvironmentPollRequest { + return &EnvironmentPollRequest{ + request: c.Get(), + } +} + +// EnvironmentGetRequest is the request for the 'get' method. +type EnvironmentGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *EnvironmentGetRequest) Parameter(name string, value interface{}) *EnvironmentGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *EnvironmentGetRequest) Header(name string, value interface{}) *EnvironmentGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *EnvironmentGetRequest) Impersonate(user string) *EnvironmentGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *EnvironmentGetRequest) Send() (result *EnvironmentGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *EnvironmentGetRequest) SendContext(ctx context.Context) (result *EnvironmentGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &EnvironmentGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readEnvironmentGetResponse(result, reader) + if err != nil { + return + } + return +} + +// EnvironmentGetResponse is the response for the 'get' method. +type EnvironmentGetResponse struct { + status int + header http.Header + err *errors.Error + body *Environment +} + +// Status returns the response status code. +func (r *EnvironmentGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *EnvironmentGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *EnvironmentGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *EnvironmentGetResponse) Body() *Environment { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *EnvironmentGetResponse) GetBody() (value *Environment, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// EnvironmentUpdateRequest is the request for the 'update' method. +type EnvironmentUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Environment +} + +// Parameter adds a query parameter. +func (r *EnvironmentUpdateRequest) Parameter(name string, value interface{}) *EnvironmentUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *EnvironmentUpdateRequest) Header(name string, value interface{}) *EnvironmentUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *EnvironmentUpdateRequest) Impersonate(user string) *EnvironmentUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *EnvironmentUpdateRequest) Body(value *Environment) *EnvironmentUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *EnvironmentUpdateRequest) Send() (result *EnvironmentUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *EnvironmentUpdateRequest) SendContext(ctx context.Context) (result *EnvironmentUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeEnvironmentUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &EnvironmentUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readEnvironmentUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// EnvironmentUpdateResponse is the response for the 'update' method. +type EnvironmentUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Environment +} + +// Status returns the response status code. +func (r *EnvironmentUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *EnvironmentUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *EnvironmentUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *EnvironmentUpdateResponse) Body() *Environment { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *EnvironmentUpdateResponse) GetBody() (value *Environment, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/environment_list_builder.go b/clustersmgmt/v2alpha1/environment_list_builder.go new file mode 100644 index 00000000..5d6001ff --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// EnvironmentListBuilder contains the data and logic needed to build +// 'environment' objects. +type EnvironmentListBuilder struct { + items []*EnvironmentBuilder +} + +// NewEnvironmentList creates a new builder of 'environment' objects. +func NewEnvironmentList() *EnvironmentListBuilder { + return new(EnvironmentListBuilder) +} + +// Items sets the items of the list. +func (b *EnvironmentListBuilder) Items(values ...*EnvironmentBuilder) *EnvironmentListBuilder { + b.items = make([]*EnvironmentBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *EnvironmentListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *EnvironmentListBuilder) Copy(list *EnvironmentList) *EnvironmentListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*EnvironmentBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewEnvironment().Copy(v) + } + } + return b +} + +// Build creates a list of 'environment' objects using the +// configuration stored in the builder. +func (b *EnvironmentListBuilder) Build() (list *EnvironmentList, err error) { + items := make([]*Environment, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(EnvironmentList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/environment_list_type_json.go b/clustersmgmt/v2alpha1/environment_list_type_json.go new file mode 100644 index 00000000..0e4a4dd2 --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEnvironmentList writes a list of values of the 'environment' type to +// the given writer. +func MarshalEnvironmentList(list []*Environment, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEnvironmentList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEnvironmentList writes a list of value of the 'environment' type to +// the given stream. +func writeEnvironmentList(list []*Environment, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeEnvironment(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalEnvironmentList reads a list of values of the 'environment' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalEnvironmentList(source interface{}) (items []*Environment, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readEnvironmentList(iterator) + err = iterator.Error + return +} + +// readEnvironmentList reads list of values of the ”environment' type from +// the given iterator. +func readEnvironmentList(iterator *jsoniter.Iterator) []*Environment { + list := []*Environment{} + for iterator.ReadArray() { + item := readEnvironment(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/environment_resource_json.go b/clustersmgmt/v2alpha1/environment_resource_json.go new file mode 100644 index 00000000..677b0b47 --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeEnvironmentGetRequest(request *EnvironmentGetRequest, writer io.Writer) error { + return nil +} +func readEnvironmentGetResponse(response *EnvironmentGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalEnvironment(reader) + return err +} +func writeEnvironmentUpdateRequest(request *EnvironmentUpdateRequest, writer io.Writer) error { + return MarshalEnvironment(request.body, writer) +} +func readEnvironmentUpdateResponse(response *EnvironmentUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalEnvironment(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/environment_type.go b/clustersmgmt/v2alpha1/environment_type.go new file mode 100644 index 00000000..ab4eddf7 --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_type.go @@ -0,0 +1,218 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// Environment represents the values of the 'environment' type. +// +// Description of an environment +type Environment struct { + bitmap_ uint32 + backplaneURL string + lastLimitedSupportCheck time.Time + lastUpgradeAvailableCheck time.Time + name string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Environment) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// BackplaneURL returns the value of the 'backplane_URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// the backplane url for the environment +func (o *Environment) BackplaneURL() string { + if o != nil && o.bitmap_&1 != 0 { + return o.backplaneURL + } + return "" +} + +// GetBackplaneURL returns the value of the 'backplane_URL' attribute and +// a flag indicating if the attribute has a value. +// +// the backplane url for the environment +func (o *Environment) GetBackplaneURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.backplaneURL + } + return +} + +// LastLimitedSupportCheck returns the value of the 'last_limited_support_check' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// last time that the worker checked for limited support clusters +func (o *Environment) LastLimitedSupportCheck() time.Time { + if o != nil && o.bitmap_&2 != 0 { + return o.lastLimitedSupportCheck + } + return time.Time{} +} + +// GetLastLimitedSupportCheck returns the value of the 'last_limited_support_check' attribute and +// a flag indicating if the attribute has a value. +// +// last time that the worker checked for limited support clusters +func (o *Environment) GetLastLimitedSupportCheck() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.lastLimitedSupportCheck + } + return +} + +// LastUpgradeAvailableCheck returns the value of the 'last_upgrade_available_check' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// last time that the worker checked for available upgrades +func (o *Environment) LastUpgradeAvailableCheck() time.Time { + if o != nil && o.bitmap_&4 != 0 { + return o.lastUpgradeAvailableCheck + } + return time.Time{} +} + +// GetLastUpgradeAvailableCheck returns the value of the 'last_upgrade_available_check' attribute and +// a flag indicating if the attribute has a value. +// +// last time that the worker checked for available upgrades +func (o *Environment) GetLastUpgradeAvailableCheck() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.lastUpgradeAvailableCheck + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// environment name +func (o *Environment) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// environment name +func (o *Environment) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// EnvironmentListKind is the name of the type used to represent list of objects of +// type 'environment'. +const EnvironmentListKind = "EnvironmentList" + +// EnvironmentListLinkKind is the name of the type used to represent links to list +// of objects of type 'environment'. +const EnvironmentListLinkKind = "EnvironmentListLink" + +// EnvironmentNilKind is the name of the type used to nil lists of objects of +// type 'environment'. +const EnvironmentListNilKind = "EnvironmentListNil" + +// EnvironmentList is a list of values of the 'environment' type. +type EnvironmentList struct { + href string + link bool + items []*Environment +} + +// Len returns the length of the list. +func (l *EnvironmentList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *EnvironmentList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *EnvironmentList) Get(i int) *Environment { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *EnvironmentList) Slice() []*Environment { + var slice []*Environment + if l == nil { + slice = make([]*Environment, 0) + } else { + slice = make([]*Environment, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *EnvironmentList) Each(f func(item *Environment) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *EnvironmentList) Range(f func(index int, item *Environment) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/environment_type_json.go b/clustersmgmt/v2alpha1/environment_type_json.go new file mode 100644 index 00000000..c34830a9 --- /dev/null +++ b/clustersmgmt/v2alpha1/environment_type_json.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEnvironment writes a value of the 'environment' type to the given writer. +func MarshalEnvironment(object *Environment, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEnvironment(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEnvironment writes a value of the 'environment' type to the given stream. +func writeEnvironment(object *Environment, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("backplane_url") + stream.WriteString(object.backplaneURL) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_limited_support_check") + stream.WriteString((object.lastLimitedSupportCheck).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_upgrade_available_check") + stream.WriteString((object.lastUpgradeAvailableCheck).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + } + stream.WriteObjectEnd() +} + +// UnmarshalEnvironment reads a value of the 'environment' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalEnvironment(source interface{}) (object *Environment, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readEnvironment(iterator) + err = iterator.Error + return +} + +// readEnvironment reads a value of the 'environment' type from the given iterator. +func readEnvironment(iterator *jsoniter.Iterator) *Environment { + object := &Environment{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "backplane_url": + value := iterator.ReadString() + object.backplaneURL = value + object.bitmap_ |= 1 + case "last_limited_support_check": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastLimitedSupportCheck = value + object.bitmap_ |= 2 + case "last_upgrade_available_check": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUpgradeAvailableCheck = value + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/errors.go b/clustersmgmt/v2alpha1/errors.go new file mode 100644 index 00000000..f38b19cb --- /dev/null +++ b/clustersmgmt/v2alpha1/errors.go @@ -0,0 +1,25 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +const ( + // Can't create cluster, the given external identifier is already in use. + DuplicatedExternalIDError = 1001 +) diff --git a/clustersmgmt/v2alpha1/event_builder.go b/clustersmgmt/v2alpha1/event_builder.go new file mode 100644 index 00000000..705d12c8 --- /dev/null +++ b/clustersmgmt/v2alpha1/event_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// EventBuilder contains the data and logic needed to build 'event' objects. +// +// Representation of a trackable event. +type EventBuilder struct { + bitmap_ uint32 + body map[string]string + key string +} + +// NewEvent creates a new builder of 'event' objects. +func NewEvent() *EventBuilder { + return &EventBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *EventBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Body sets the value of the 'body' attribute to the given value. +func (b *EventBuilder) Body(value map[string]string) *EventBuilder { + b.body = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// Key sets the value of the 'key' attribute to the given value. +func (b *EventBuilder) Key(value string) *EventBuilder { + b.key = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *EventBuilder) Copy(object *Event) *EventBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if len(object.body) > 0 { + b.body = map[string]string{} + for k, v := range object.body { + b.body[k] = v + } + } else { + b.body = nil + } + b.key = object.key + return b +} + +// Build creates a 'event' object using the configuration stored in the builder. +func (b *EventBuilder) Build() (object *Event, err error) { + object = new(Event) + object.bitmap_ = b.bitmap_ + if b.body != nil { + object.body = make(map[string]string) + for k, v := range b.body { + object.body[k] = v + } + } + object.key = b.key + return +} diff --git a/clustersmgmt/v2alpha1/event_list_builder.go b/clustersmgmt/v2alpha1/event_list_builder.go new file mode 100644 index 00000000..45b5e883 --- /dev/null +++ b/clustersmgmt/v2alpha1/event_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// EventListBuilder contains the data and logic needed to build +// 'event' objects. +type EventListBuilder struct { + items []*EventBuilder +} + +// NewEventList creates a new builder of 'event' objects. +func NewEventList() *EventListBuilder { + return new(EventListBuilder) +} + +// Items sets the items of the list. +func (b *EventListBuilder) Items(values ...*EventBuilder) *EventListBuilder { + b.items = make([]*EventBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *EventListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *EventListBuilder) Copy(list *EventList) *EventListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*EventBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewEvent().Copy(v) + } + } + return b +} + +// Build creates a list of 'event' objects using the +// configuration stored in the builder. +func (b *EventListBuilder) Build() (list *EventList, err error) { + items := make([]*Event, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(EventList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/event_list_type_json.go b/clustersmgmt/v2alpha1/event_list_type_json.go new file mode 100644 index 00000000..98a2e44a --- /dev/null +++ b/clustersmgmt/v2alpha1/event_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEventList writes a list of values of the 'event' type to +// the given writer. +func MarshalEventList(list []*Event, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEventList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEventList writes a list of value of the 'event' type to +// the given stream. +func writeEventList(list []*Event, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeEvent(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalEventList reads a list of values of the 'event' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalEventList(source interface{}) (items []*Event, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readEventList(iterator) + err = iterator.Error + return +} + +// readEventList reads list of values of the ”event' type from +// the given iterator. +func readEventList(iterator *jsoniter.Iterator) []*Event { + list := []*Event{} + for iterator.ReadArray() { + item := readEvent(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/event_type.go b/clustersmgmt/v2alpha1/event_type.go new file mode 100644 index 00000000..d1b83019 --- /dev/null +++ b/clustersmgmt/v2alpha1/event_type.go @@ -0,0 +1,170 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Event represents the values of the 'event' type. +// +// Representation of a trackable event. +type Event struct { + bitmap_ uint32 + body map[string]string + key string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Event) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Body returns the value of the 'body' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Body of the event to track the details of the tracking event as Key value pair +func (o *Event) Body() map[string]string { + if o != nil && o.bitmap_&1 != 0 { + return o.body + } + return nil +} + +// GetBody returns the value of the 'body' attribute and +// a flag indicating if the attribute has a value. +// +// Body of the event to track the details of the tracking event as Key value pair +func (o *Event) GetBody() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.body + } + return +} + +// Key returns the value of the 'key' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Key of the event to be tracked. This key should start with an +// uppercase letter followed by alphanumeric characters or +// underscores. The entire key needs to be smaller than 64 characters. +func (o *Event) Key() string { + if o != nil && o.bitmap_&2 != 0 { + return o.key + } + return "" +} + +// GetKey returns the value of the 'key' attribute and +// a flag indicating if the attribute has a value. +// +// Key of the event to be tracked. This key should start with an +// uppercase letter followed by alphanumeric characters or +// underscores. The entire key needs to be smaller than 64 characters. +func (o *Event) GetKey() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.key + } + return +} + +// EventListKind is the name of the type used to represent list of objects of +// type 'event'. +const EventListKind = "EventList" + +// EventListLinkKind is the name of the type used to represent links to list +// of objects of type 'event'. +const EventListLinkKind = "EventListLink" + +// EventNilKind is the name of the type used to nil lists of objects of +// type 'event'. +const EventListNilKind = "EventListNil" + +// EventList is a list of values of the 'event' type. +type EventList struct { + href string + link bool + items []*Event +} + +// Len returns the length of the list. +func (l *EventList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *EventList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *EventList) Get(i int) *Event { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *EventList) Slice() []*Event { + var slice []*Event + if l == nil { + slice = make([]*Event, 0) + } else { + slice = make([]*Event, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *EventList) Each(f func(item *Event) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *EventList) Range(f func(index int, item *Event) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/event_type_json.go b/clustersmgmt/v2alpha1/event_type_json.go new file mode 100644 index 00000000..a84c57a3 --- /dev/null +++ b/clustersmgmt/v2alpha1/event_type_json.go @@ -0,0 +1,128 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalEvent writes a value of the 'event' type to the given writer. +func MarshalEvent(object *Event, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeEvent(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeEvent writes a value of the 'event' type to the given stream. +func writeEvent(object *Event, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.body != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("body") + if object.body != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.body)) + i := 0 + for key := range object.body { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.body[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key") + stream.WriteString(object.key) + } + stream.WriteObjectEnd() +} + +// UnmarshalEvent reads a value of the 'event' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalEvent(source interface{}) (object *Event, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readEvent(iterator) + err = iterator.Error + return +} + +// readEvent reads a value of the 'event' type from the given iterator. +func readEvent(iterator *jsoniter.Iterator) *Event { + object := &Event{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "body": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.body = value + object.bitmap_ |= 1 + case "key": + value := iterator.ReadString() + object.key = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/events_client.go b/clustersmgmt/v2alpha1/events_client.go new file mode 100644 index 00000000..2cd791d3 --- /dev/null +++ b/clustersmgmt/v2alpha1/events_client.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// EventsClient is the client of the 'events' resource. +// +// Manages a collection used to track events reported by external clients. +type EventsClient struct { + transport http.RoundTripper + path string +} + +// NewEventsClient creates a new client for the 'events' +// resource using the given transport to send the requests and receive the +// responses. +func NewEventsClient(transport http.RoundTripper, path string) *EventsClient { + return &EventsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new event to be tracked. When sending a new event request, +// it gets tracked in Prometheus, Pendo, CloudWatch, or whichever +// analytics client is configured as part of clusters service. This +// allows for reporting on events that happen outside of a regular API +// request, but are found to be useful for understanding customer +// needs and possible blockers. +func (c *EventsClient) Add() *EventsAddRequest { + return &EventsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// EventsAddRequest is the request for the 'add' method. +type EventsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Event +} + +// Parameter adds a query parameter. +func (r *EventsAddRequest) Parameter(name string, value interface{}) *EventsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *EventsAddRequest) Header(name string, value interface{}) *EventsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *EventsAddRequest) Impersonate(user string) *EventsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the event. +func (r *EventsAddRequest) Body(value *Event) *EventsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *EventsAddRequest) Send() (result *EventsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *EventsAddRequest) SendContext(ctx context.Context) (result *EventsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeEventsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &EventsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readEventsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// EventsAddResponse is the response for the 'add' method. +type EventsAddResponse struct { + status int + header http.Header + err *errors.Error + body *Event +} + +// Status returns the response status code. +func (r *EventsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *EventsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *EventsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the event. +func (r *EventsAddResponse) Body() *Event { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the event. +func (r *EventsAddResponse) GetBody() (value *Event, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/events_resource_json.go b/clustersmgmt/v2alpha1/events_resource_json.go new file mode 100644 index 00000000..c6cbb4d0 --- /dev/null +++ b/clustersmgmt/v2alpha1/events_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeEventsAddRequest(request *EventsAddRequest, writer io.Writer) error { + return MarshalEvent(request.body, writer) +} +func readEventsAddResponse(response *EventsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalEvent(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/external_auth_builder.go b/clustersmgmt/v2alpha1/external_auth_builder.go new file mode 100644 index 00000000..77bddc6d --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_builder.go @@ -0,0 +1,155 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthBuilder contains the data and logic needed to build 'external_auth' objects. +// +// Representation of an external authentication provider. +type ExternalAuthBuilder struct { + bitmap_ uint32 + id string + href string + claim *ExternalAuthClaimBuilder + clients []*ExternalAuthClientConfigBuilder + issuer *TokenIssuerBuilder +} + +// NewExternalAuth creates a new builder of 'external_auth' objects. +func NewExternalAuth() *ExternalAuthBuilder { + return &ExternalAuthBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ExternalAuthBuilder) Link(value bool) *ExternalAuthBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ExternalAuthBuilder) ID(value string) *ExternalAuthBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ExternalAuthBuilder) HREF(value string) *ExternalAuthBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ExternalAuthBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Claim sets the value of the 'claim' attribute to the given value. +// +// The claims and validation rules used in the configuration of the external authentication. +func (b *ExternalAuthBuilder) Claim(value *ExternalAuthClaimBuilder) *ExternalAuthBuilder { + b.claim = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Clients sets the value of the 'clients' attribute to the given values. +func (b *ExternalAuthBuilder) Clients(values ...*ExternalAuthClientConfigBuilder) *ExternalAuthBuilder { + b.clients = make([]*ExternalAuthClientConfigBuilder, len(values)) + copy(b.clients, values) + b.bitmap_ |= 16 + return b +} + +// Issuer sets the value of the 'issuer' attribute to the given value. +// +// Representation of a token issuer used in an external authentication. +func (b *ExternalAuthBuilder) Issuer(value *TokenIssuerBuilder) *ExternalAuthBuilder { + b.issuer = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ExternalAuthBuilder) Copy(object *ExternalAuth) *ExternalAuthBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.claim != nil { + b.claim = NewExternalAuthClaim().Copy(object.claim) + } else { + b.claim = nil + } + if object.clients != nil { + b.clients = make([]*ExternalAuthClientConfigBuilder, len(object.clients)) + for i, v := range object.clients { + b.clients[i] = NewExternalAuthClientConfig().Copy(v) + } + } else { + b.clients = nil + } + if object.issuer != nil { + b.issuer = NewTokenIssuer().Copy(object.issuer) + } else { + b.issuer = nil + } + return b +} + +// Build creates a 'external_auth' object using the configuration stored in the builder. +func (b *ExternalAuthBuilder) Build() (object *ExternalAuth, err error) { + object = new(ExternalAuth) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.claim != nil { + object.claim, err = b.claim.Build() + if err != nil { + return + } + } + if b.clients != nil { + object.clients = make([]*ExternalAuthClientConfig, len(b.clients)) + for i, v := range b.clients { + object.clients[i], err = v.Build() + if err != nil { + return + } + } + } + if b.issuer != nil { + object.issuer, err = b.issuer.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_claim_builder.go b/clustersmgmt/v2alpha1/external_auth_claim_builder.go new file mode 100644 index 00000000..c4344641 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_claim_builder.go @@ -0,0 +1,104 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthClaimBuilder contains the data and logic needed to build 'external_auth_claim' objects. +// +// The claims and validation rules used in the configuration of the external authentication. +type ExternalAuthClaimBuilder struct { + bitmap_ uint32 + mappings *TokenClaimMappingsBuilder + validationRules []*TokenClaimValidationRuleBuilder +} + +// NewExternalAuthClaim creates a new builder of 'external_auth_claim' objects. +func NewExternalAuthClaim() *ExternalAuthClaimBuilder { + return &ExternalAuthClaimBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ExternalAuthClaimBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Mappings sets the value of the 'mappings' attribute to the given value. +// +// The claim mappings defined for users and groups. +func (b *ExternalAuthClaimBuilder) Mappings(value *TokenClaimMappingsBuilder) *ExternalAuthClaimBuilder { + b.mappings = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// ValidationRules sets the value of the 'validation_rules' attribute to the given values. +func (b *ExternalAuthClaimBuilder) ValidationRules(values ...*TokenClaimValidationRuleBuilder) *ExternalAuthClaimBuilder { + b.validationRules = make([]*TokenClaimValidationRuleBuilder, len(values)) + copy(b.validationRules, values) + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ExternalAuthClaimBuilder) Copy(object *ExternalAuthClaim) *ExternalAuthClaimBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.mappings != nil { + b.mappings = NewTokenClaimMappings().Copy(object.mappings) + } else { + b.mappings = nil + } + if object.validationRules != nil { + b.validationRules = make([]*TokenClaimValidationRuleBuilder, len(object.validationRules)) + for i, v := range object.validationRules { + b.validationRules[i] = NewTokenClaimValidationRule().Copy(v) + } + } else { + b.validationRules = nil + } + return b +} + +// Build creates a 'external_auth_claim' object using the configuration stored in the builder. +func (b *ExternalAuthClaimBuilder) Build() (object *ExternalAuthClaim, err error) { + object = new(ExternalAuthClaim) + object.bitmap_ = b.bitmap_ + if b.mappings != nil { + object.mappings, err = b.mappings.Build() + if err != nil { + return + } + } + if b.validationRules != nil { + object.validationRules = make([]*TokenClaimValidationRule, len(b.validationRules)) + for i, v := range b.validationRules { + object.validationRules[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_claim_list_builder.go b/clustersmgmt/v2alpha1/external_auth_claim_list_builder.go new file mode 100644 index 00000000..44917675 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_claim_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthClaimListBuilder contains the data and logic needed to build +// 'external_auth_claim' objects. +type ExternalAuthClaimListBuilder struct { + items []*ExternalAuthClaimBuilder +} + +// NewExternalAuthClaimList creates a new builder of 'external_auth_claim' objects. +func NewExternalAuthClaimList() *ExternalAuthClaimListBuilder { + return new(ExternalAuthClaimListBuilder) +} + +// Items sets the items of the list. +func (b *ExternalAuthClaimListBuilder) Items(values ...*ExternalAuthClaimBuilder) *ExternalAuthClaimListBuilder { + b.items = make([]*ExternalAuthClaimBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ExternalAuthClaimListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ExternalAuthClaimListBuilder) Copy(list *ExternalAuthClaimList) *ExternalAuthClaimListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ExternalAuthClaimBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewExternalAuthClaim().Copy(v) + } + } + return b +} + +// Build creates a list of 'external_auth_claim' objects using the +// configuration stored in the builder. +func (b *ExternalAuthClaimListBuilder) Build() (list *ExternalAuthClaimList, err error) { + items := make([]*ExternalAuthClaim, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ExternalAuthClaimList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_claim_list_type_json.go b/clustersmgmt/v2alpha1/external_auth_claim_list_type_json.go new file mode 100644 index 00000000..23039ee0 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_claim_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthClaimList writes a list of values of the 'external_auth_claim' type to +// the given writer. +func MarshalExternalAuthClaimList(list []*ExternalAuthClaim, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthClaimList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthClaimList writes a list of value of the 'external_auth_claim' type to +// the given stream. +func writeExternalAuthClaimList(list []*ExternalAuthClaim, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeExternalAuthClaim(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalExternalAuthClaimList reads a list of values of the 'external_auth_claim' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalExternalAuthClaimList(source interface{}) (items []*ExternalAuthClaim, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readExternalAuthClaimList(iterator) + err = iterator.Error + return +} + +// readExternalAuthClaimList reads list of values of the ”external_auth_claim' type from +// the given iterator. +func readExternalAuthClaimList(iterator *jsoniter.Iterator) []*ExternalAuthClaim { + list := []*ExternalAuthClaim{} + for iterator.ReadArray() { + item := readExternalAuthClaim(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/external_auth_claim_type.go b/clustersmgmt/v2alpha1/external_auth_claim_type.go new file mode 100644 index 00000000..44ddb985 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_claim_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthClaim represents the values of the 'external_auth_claim' type. +// +// The claims and validation rules used in the configuration of the external authentication. +type ExternalAuthClaim struct { + bitmap_ uint32 + mappings *TokenClaimMappings + validationRules []*TokenClaimValidationRule +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ExternalAuthClaim) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Mappings returns the value of the 'mappings' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Mapping describes rules on how to transform information from an ID token into a cluster identity. +func (o *ExternalAuthClaim) Mappings() *TokenClaimMappings { + if o != nil && o.bitmap_&1 != 0 { + return o.mappings + } + return nil +} + +// GetMappings returns the value of the 'mappings' attribute and +// a flag indicating if the attribute has a value. +// +// Mapping describes rules on how to transform information from an ID token into a cluster identity. +func (o *ExternalAuthClaim) GetMappings() (value *TokenClaimMappings, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.mappings + } + return +} + +// ValidationRules returns the value of the 'validation_rules' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ValidationRules are rules that are applied to validate token claims to authenticate users. +func (o *ExternalAuthClaim) ValidationRules() []*TokenClaimValidationRule { + if o != nil && o.bitmap_&2 != 0 { + return o.validationRules + } + return nil +} + +// GetValidationRules returns the value of the 'validation_rules' attribute and +// a flag indicating if the attribute has a value. +// +// ValidationRules are rules that are applied to validate token claims to authenticate users. +func (o *ExternalAuthClaim) GetValidationRules() (value []*TokenClaimValidationRule, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.validationRules + } + return +} + +// ExternalAuthClaimListKind is the name of the type used to represent list of objects of +// type 'external_auth_claim'. +const ExternalAuthClaimListKind = "ExternalAuthClaimList" + +// ExternalAuthClaimListLinkKind is the name of the type used to represent links to list +// of objects of type 'external_auth_claim'. +const ExternalAuthClaimListLinkKind = "ExternalAuthClaimListLink" + +// ExternalAuthClaimNilKind is the name of the type used to nil lists of objects of +// type 'external_auth_claim'. +const ExternalAuthClaimListNilKind = "ExternalAuthClaimListNil" + +// ExternalAuthClaimList is a list of values of the 'external_auth_claim' type. +type ExternalAuthClaimList struct { + href string + link bool + items []*ExternalAuthClaim +} + +// Len returns the length of the list. +func (l *ExternalAuthClaimList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ExternalAuthClaimList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ExternalAuthClaimList) Get(i int) *ExternalAuthClaim { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ExternalAuthClaimList) Slice() []*ExternalAuthClaim { + var slice []*ExternalAuthClaim + if l == nil { + slice = make([]*ExternalAuthClaim, 0) + } else { + slice = make([]*ExternalAuthClaim, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ExternalAuthClaimList) Each(f func(item *ExternalAuthClaim) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ExternalAuthClaimList) Range(f func(index int, item *ExternalAuthClaim) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/external_auth_claim_type_json.go b/clustersmgmt/v2alpha1/external_auth_claim_type_json.go new file mode 100644 index 00000000..1782120e --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_claim_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthClaim writes a value of the 'external_auth_claim' type to the given writer. +func MarshalExternalAuthClaim(object *ExternalAuthClaim, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthClaim(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthClaim writes a value of the 'external_auth_claim' type to the given stream. +func writeExternalAuthClaim(object *ExternalAuthClaim, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.mappings != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("mappings") + writeTokenClaimMappings(object.mappings, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.validationRules != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("validation_rules") + writeTokenClaimValidationRuleList(object.validationRules, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalExternalAuthClaim reads a value of the 'external_auth_claim' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalExternalAuthClaim(source interface{}) (object *ExternalAuthClaim, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readExternalAuthClaim(iterator) + err = iterator.Error + return +} + +// readExternalAuthClaim reads a value of the 'external_auth_claim' type from the given iterator. +func readExternalAuthClaim(iterator *jsoniter.Iterator) *ExternalAuthClaim { + object := &ExternalAuthClaim{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "mappings": + value := readTokenClaimMappings(iterator) + object.mappings = value + object.bitmap_ |= 1 + case "validation_rules": + value := readTokenClaimValidationRuleList(iterator) + object.validationRules = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/external_auth_client.go b/clustersmgmt/v2alpha1/external_auth_client.go new file mode 100644 index 00000000..a14699f2 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ExternalAuthClient is the client of the 'external_auth' resource. +// +// Manages a specific external authentication. +type ExternalAuthClient struct { + transport http.RoundTripper + path string +} + +// NewExternalAuthClient creates a new client for the 'external_auth' +// resource using the given transport to send the requests and receive the +// responses. +func NewExternalAuthClient(transport http.RoundTripper, path string) *ExternalAuthClient { + return &ExternalAuthClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the external authentication. +func (c *ExternalAuthClient) Delete() *ExternalAuthDeleteRequest { + return &ExternalAuthDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of an external authentication. +func (c *ExternalAuthClient) Get() *ExternalAuthGetRequest { + return &ExternalAuthGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the external authentication. +func (c *ExternalAuthClient) Update() *ExternalAuthUpdateRequest { + return &ExternalAuthUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// ExternalAuthPollRequest is the request for the Poll method. +type ExternalAuthPollRequest struct { + request *ExternalAuthGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ExternalAuthPollRequest) Parameter(name string, value interface{}) *ExternalAuthPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ExternalAuthPollRequest) Header(name string, value interface{}) *ExternalAuthPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ExternalAuthPollRequest) Interval(value time.Duration) *ExternalAuthPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ExternalAuthPollRequest) Status(value int) *ExternalAuthPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ExternalAuthPollRequest) Predicate(value func(*ExternalAuthGetResponse) bool) *ExternalAuthPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ExternalAuthGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ExternalAuthPollRequest) StartContext(ctx context.Context) (response *ExternalAuthPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ExternalAuthPollResponse{ + response: result.(*ExternalAuthGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ExternalAuthPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ExternalAuthPollResponse is the response for the Poll method. +type ExternalAuthPollResponse struct { + response *ExternalAuthGetResponse +} + +// Status returns the response status code. +func (r *ExternalAuthPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ExternalAuthPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ExternalAuthPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ExternalAuthPollResponse) Body() *ExternalAuth { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ExternalAuthPollResponse) GetBody() (value *ExternalAuth, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ExternalAuthClient) Poll() *ExternalAuthPollRequest { + return &ExternalAuthPollRequest{ + request: c.Get(), + } +} + +// ExternalAuthDeleteRequest is the request for the 'delete' method. +type ExternalAuthDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ExternalAuthDeleteRequest) Parameter(name string, value interface{}) *ExternalAuthDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalAuthDeleteRequest) Header(name string, value interface{}) *ExternalAuthDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalAuthDeleteRequest) Impersonate(user string) *ExternalAuthDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalAuthDeleteRequest) Send() (result *ExternalAuthDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalAuthDeleteRequest) SendContext(ctx context.Context) (result *ExternalAuthDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalAuthDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ExternalAuthDeleteResponse is the response for the 'delete' method. +type ExternalAuthDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ExternalAuthDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalAuthDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalAuthDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ExternalAuthGetRequest is the request for the 'get' method. +type ExternalAuthGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ExternalAuthGetRequest) Parameter(name string, value interface{}) *ExternalAuthGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalAuthGetRequest) Header(name string, value interface{}) *ExternalAuthGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalAuthGetRequest) Impersonate(user string) *ExternalAuthGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalAuthGetRequest) Send() (result *ExternalAuthGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalAuthGetRequest) SendContext(ctx context.Context) (result *ExternalAuthGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalAuthGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readExternalAuthGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ExternalAuthGetResponse is the response for the 'get' method. +type ExternalAuthGetResponse struct { + status int + header http.Header + err *errors.Error + body *ExternalAuth +} + +// Status returns the response status code. +func (r *ExternalAuthGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalAuthGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalAuthGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ExternalAuthGetResponse) Body() *ExternalAuth { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ExternalAuthGetResponse) GetBody() (value *ExternalAuth, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ExternalAuthUpdateRequest is the request for the 'update' method. +type ExternalAuthUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ExternalAuth +} + +// Parameter adds a query parameter. +func (r *ExternalAuthUpdateRequest) Parameter(name string, value interface{}) *ExternalAuthUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalAuthUpdateRequest) Header(name string, value interface{}) *ExternalAuthUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalAuthUpdateRequest) Impersonate(user string) *ExternalAuthUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *ExternalAuthUpdateRequest) Body(value *ExternalAuth) *ExternalAuthUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalAuthUpdateRequest) Send() (result *ExternalAuthUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalAuthUpdateRequest) SendContext(ctx context.Context) (result *ExternalAuthUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeExternalAuthUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalAuthUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readExternalAuthUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// ExternalAuthUpdateResponse is the response for the 'update' method. +type ExternalAuthUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *ExternalAuth +} + +// Status returns the response status code. +func (r *ExternalAuthUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalAuthUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalAuthUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ExternalAuthUpdateResponse) Body() *ExternalAuth { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ExternalAuthUpdateResponse) GetBody() (value *ExternalAuth, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_client_config_builder.go b/clustersmgmt/v2alpha1/external_auth_client_config_builder.go new file mode 100644 index 00000000..68762536 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_client_config_builder.go @@ -0,0 +1,118 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthClientConfigBuilder contains the data and logic needed to build 'external_auth_client_config' objects. +// +// ExternalAuthClientConfig contains configuration for the platform's clients that +// need to request tokens from the issuer. +type ExternalAuthClientConfigBuilder struct { + bitmap_ uint32 + id string + component *ClientComponentBuilder + extraScopes []string + secret string +} + +// NewExternalAuthClientConfig creates a new builder of 'external_auth_client_config' objects. +func NewExternalAuthClientConfig() *ExternalAuthClientConfigBuilder { + return &ExternalAuthClientConfigBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ExternalAuthClientConfigBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *ExternalAuthClientConfigBuilder) ID(value string) *ExternalAuthClientConfigBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// Component sets the value of the 'component' attribute to the given value. +// +// The reference of a component that will consume the client configuration. +func (b *ExternalAuthClientConfigBuilder) Component(value *ClientComponentBuilder) *ExternalAuthClientConfigBuilder { + b.component = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// ExtraScopes sets the value of the 'extra_scopes' attribute to the given values. +func (b *ExternalAuthClientConfigBuilder) ExtraScopes(values ...string) *ExternalAuthClientConfigBuilder { + b.extraScopes = make([]string, len(values)) + copy(b.extraScopes, values) + b.bitmap_ |= 4 + return b +} + +// Secret sets the value of the 'secret' attribute to the given value. +func (b *ExternalAuthClientConfigBuilder) Secret(value string) *ExternalAuthClientConfigBuilder { + b.secret = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ExternalAuthClientConfigBuilder) Copy(object *ExternalAuthClientConfig) *ExternalAuthClientConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + if object.component != nil { + b.component = NewClientComponent().Copy(object.component) + } else { + b.component = nil + } + if object.extraScopes != nil { + b.extraScopes = make([]string, len(object.extraScopes)) + copy(b.extraScopes, object.extraScopes) + } else { + b.extraScopes = nil + } + b.secret = object.secret + return b +} + +// Build creates a 'external_auth_client_config' object using the configuration stored in the builder. +func (b *ExternalAuthClientConfigBuilder) Build() (object *ExternalAuthClientConfig, err error) { + object = new(ExternalAuthClientConfig) + object.bitmap_ = b.bitmap_ + object.id = b.id + if b.component != nil { + object.component, err = b.component.Build() + if err != nil { + return + } + } + if b.extraScopes != nil { + object.extraScopes = make([]string, len(b.extraScopes)) + copy(object.extraScopes, b.extraScopes) + } + object.secret = b.secret + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_client_config_list_builder.go b/clustersmgmt/v2alpha1/external_auth_client_config_list_builder.go new file mode 100644 index 00000000..08f044e9 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_client_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthClientConfigListBuilder contains the data and logic needed to build +// 'external_auth_client_config' objects. +type ExternalAuthClientConfigListBuilder struct { + items []*ExternalAuthClientConfigBuilder +} + +// NewExternalAuthClientConfigList creates a new builder of 'external_auth_client_config' objects. +func NewExternalAuthClientConfigList() *ExternalAuthClientConfigListBuilder { + return new(ExternalAuthClientConfigListBuilder) +} + +// Items sets the items of the list. +func (b *ExternalAuthClientConfigListBuilder) Items(values ...*ExternalAuthClientConfigBuilder) *ExternalAuthClientConfigListBuilder { + b.items = make([]*ExternalAuthClientConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ExternalAuthClientConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ExternalAuthClientConfigListBuilder) Copy(list *ExternalAuthClientConfigList) *ExternalAuthClientConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ExternalAuthClientConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewExternalAuthClientConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'external_auth_client_config' objects using the +// configuration stored in the builder. +func (b *ExternalAuthClientConfigListBuilder) Build() (list *ExternalAuthClientConfigList, err error) { + items := make([]*ExternalAuthClientConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ExternalAuthClientConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_client_config_list_type_json.go b/clustersmgmt/v2alpha1/external_auth_client_config_list_type_json.go new file mode 100644 index 00000000..3eac80ea --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_client_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthClientConfigList writes a list of values of the 'external_auth_client_config' type to +// the given writer. +func MarshalExternalAuthClientConfigList(list []*ExternalAuthClientConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthClientConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthClientConfigList writes a list of value of the 'external_auth_client_config' type to +// the given stream. +func writeExternalAuthClientConfigList(list []*ExternalAuthClientConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeExternalAuthClientConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalExternalAuthClientConfigList reads a list of values of the 'external_auth_client_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalExternalAuthClientConfigList(source interface{}) (items []*ExternalAuthClientConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readExternalAuthClientConfigList(iterator) + err = iterator.Error + return +} + +// readExternalAuthClientConfigList reads list of values of the ”external_auth_client_config' type from +// the given iterator. +func readExternalAuthClientConfigList(iterator *jsoniter.Iterator) []*ExternalAuthClientConfig { + list := []*ExternalAuthClientConfig{} + for iterator.ReadArray() { + item := readExternalAuthClientConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/external_auth_client_config_type.go b/clustersmgmt/v2alpha1/external_auth_client_config_type.go new file mode 100644 index 00000000..d86a24d3 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_client_config_type.go @@ -0,0 +1,215 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthClientConfig represents the values of the 'external_auth_client_config' type. +// +// ExternalAuthClientConfig contains configuration for the platform's clients that +// need to request tokens from the issuer. +type ExternalAuthClientConfig struct { + bitmap_ uint32 + id string + component *ClientComponent + extraScopes []string + secret string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ExternalAuthClientConfig) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The identifier of the OIDC client from the OIDC provider. +func (o *ExternalAuthClientConfig) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// The identifier of the OIDC client from the OIDC provider. +func (o *ExternalAuthClientConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// Component returns the value of the 'component' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The component that is supposed to consume this client configuration. +func (o *ExternalAuthClientConfig) Component() *ClientComponent { + if o != nil && o.bitmap_&2 != 0 { + return o.component + } + return nil +} + +// GetComponent returns the value of the 'component' attribute and +// a flag indicating if the attribute has a value. +// +// The component that is supposed to consume this client configuration. +func (o *ExternalAuthClientConfig) GetComponent() (value *ClientComponent, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.component + } + return +} + +// ExtraScopes returns the value of the 'extra_scopes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ExtraScopes is an optional set of scopes to request tokens with. +func (o *ExternalAuthClientConfig) ExtraScopes() []string { + if o != nil && o.bitmap_&4 != 0 { + return o.extraScopes + } + return nil +} + +// GetExtraScopes returns the value of the 'extra_scopes' attribute and +// a flag indicating if the attribute has a value. +// +// ExtraScopes is an optional set of scopes to request tokens with. +func (o *ExternalAuthClientConfig) GetExtraScopes() (value []string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.extraScopes + } + return +} + +// Secret returns the value of the 'secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The secret of the OIDC client from the OIDC provider. +func (o *ExternalAuthClientConfig) Secret() string { + if o != nil && o.bitmap_&8 != 0 { + return o.secret + } + return "" +} + +// GetSecret returns the value of the 'secret' attribute and +// a flag indicating if the attribute has a value. +// +// The secret of the OIDC client from the OIDC provider. +func (o *ExternalAuthClientConfig) GetSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.secret + } + return +} + +// ExternalAuthClientConfigListKind is the name of the type used to represent list of objects of +// type 'external_auth_client_config'. +const ExternalAuthClientConfigListKind = "ExternalAuthClientConfigList" + +// ExternalAuthClientConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'external_auth_client_config'. +const ExternalAuthClientConfigListLinkKind = "ExternalAuthClientConfigListLink" + +// ExternalAuthClientConfigNilKind is the name of the type used to nil lists of objects of +// type 'external_auth_client_config'. +const ExternalAuthClientConfigListNilKind = "ExternalAuthClientConfigListNil" + +// ExternalAuthClientConfigList is a list of values of the 'external_auth_client_config' type. +type ExternalAuthClientConfigList struct { + href string + link bool + items []*ExternalAuthClientConfig +} + +// Len returns the length of the list. +func (l *ExternalAuthClientConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ExternalAuthClientConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ExternalAuthClientConfigList) Get(i int) *ExternalAuthClientConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ExternalAuthClientConfigList) Slice() []*ExternalAuthClientConfig { + var slice []*ExternalAuthClientConfig + if l == nil { + slice = make([]*ExternalAuthClientConfig, 0) + } else { + slice = make([]*ExternalAuthClientConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ExternalAuthClientConfigList) Each(f func(item *ExternalAuthClientConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ExternalAuthClientConfigList) Range(f func(index int, item *ExternalAuthClientConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/external_auth_client_config_type_json.go b/clustersmgmt/v2alpha1/external_auth_client_config_type_json.go new file mode 100644 index 00000000..08e03509 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_client_config_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthClientConfig writes a value of the 'external_auth_client_config' type to the given writer. +func MarshalExternalAuthClientConfig(object *ExternalAuthClientConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthClientConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthClientConfig writes a value of the 'external_auth_client_config' type to the given stream. +func writeExternalAuthClientConfig(object *ExternalAuthClientConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 && object.component != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("component") + writeClientComponent(object.component, stream) + count++ + } + present_ = object.bitmap_&4 != 0 && object.extraScopes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("extra_scopes") + writeStringList(object.extraScopes, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("secret") + stream.WriteString(object.secret) + } + stream.WriteObjectEnd() +} + +// UnmarshalExternalAuthClientConfig reads a value of the 'external_auth_client_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalExternalAuthClientConfig(source interface{}) (object *ExternalAuthClientConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readExternalAuthClientConfig(iterator) + err = iterator.Error + return +} + +// readExternalAuthClientConfig reads a value of the 'external_auth_client_config' type from the given iterator. +func readExternalAuthClientConfig(iterator *jsoniter.Iterator) *ExternalAuthClientConfig { + object := &ExternalAuthClientConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "component": + value := readClientComponent(iterator) + object.component = value + object.bitmap_ |= 2 + case "extra_scopes": + value := readStringList(iterator) + object.extraScopes = value + object.bitmap_ |= 4 + case "secret": + value := iterator.ReadString() + object.secret = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_builder.go b/clustersmgmt/v2alpha1/external_auth_config_builder.go new file mode 100644 index 00000000..02cf40a1 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_builder.go @@ -0,0 +1,82 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthConfigBuilder contains the data and logic needed to build 'external_auth_config' objects. +// +// ExternalAuthConfig configuration +type ExternalAuthConfigBuilder struct { + bitmap_ uint32 + externalAuths *ExternalAuthListBuilder + enabled bool +} + +// NewExternalAuthConfig creates a new builder of 'external_auth_config' objects. +func NewExternalAuthConfig() *ExternalAuthConfigBuilder { + return &ExternalAuthConfigBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ExternalAuthConfigBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *ExternalAuthConfigBuilder) Enabled(value bool) *ExternalAuthConfigBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// ExternalAuths sets the value of the 'external_auths' attribute to the given values. +func (b *ExternalAuthConfigBuilder) ExternalAuths(value *ExternalAuthListBuilder) *ExternalAuthConfigBuilder { + b.externalAuths = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ExternalAuthConfigBuilder) Copy(object *ExternalAuthConfig) *ExternalAuthConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + if object.externalAuths != nil { + b.externalAuths = NewExternalAuthList().Copy(object.externalAuths) + } else { + b.externalAuths = nil + } + return b +} + +// Build creates a 'external_auth_config' object using the configuration stored in the builder. +func (b *ExternalAuthConfigBuilder) Build() (object *ExternalAuthConfig, err error) { + object = new(ExternalAuthConfig) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + if b.externalAuths != nil { + object.externalAuths, err = b.externalAuths.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_client.go b/clustersmgmt/v2alpha1/external_auth_config_client.go new file mode 100644 index 00000000..9da74b41 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_client.go @@ -0,0 +1,316 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ExternalAuthConfigClient is the client of the 'external_auth_config' resource. +// +// Manages the external authentication configuration for a ROSA HCP cluster. +type ExternalAuthConfigClient struct { + transport http.RoundTripper + path string +} + +// NewExternalAuthConfigClient creates a new client for the 'external_auth_config' +// resource using the given transport to send the requests and receive the +// responses. +func NewExternalAuthConfigClient(transport http.RoundTripper, path string) *ExternalAuthConfigClient { + return &ExternalAuthConfigClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *ExternalAuthConfigClient) Get() *ExternalAuthConfigGetRequest { + return &ExternalAuthConfigGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// ExternalAuths returns the target 'external_auths' resource. +// +// Reference to the resource that manages the collection of ExternalAuths resources. +func (c *ExternalAuthConfigClient) ExternalAuths() *ExternalAuthsClient { + return NewExternalAuthsClient( + c.transport, + path.Join(c.path, "external_auths"), + ) +} + +// ExternalAuthConfigPollRequest is the request for the Poll method. +type ExternalAuthConfigPollRequest struct { + request *ExternalAuthConfigGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ExternalAuthConfigPollRequest) Parameter(name string, value interface{}) *ExternalAuthConfigPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ExternalAuthConfigPollRequest) Header(name string, value interface{}) *ExternalAuthConfigPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ExternalAuthConfigPollRequest) Interval(value time.Duration) *ExternalAuthConfigPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ExternalAuthConfigPollRequest) Status(value int) *ExternalAuthConfigPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ExternalAuthConfigPollRequest) Predicate(value func(*ExternalAuthConfigGetResponse) bool) *ExternalAuthConfigPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ExternalAuthConfigGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ExternalAuthConfigPollRequest) StartContext(ctx context.Context) (response *ExternalAuthConfigPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ExternalAuthConfigPollResponse{ + response: result.(*ExternalAuthConfigGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ExternalAuthConfigPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ExternalAuthConfigPollResponse is the response for the Poll method. +type ExternalAuthConfigPollResponse struct { + response *ExternalAuthConfigGetResponse +} + +// Status returns the response status code. +func (r *ExternalAuthConfigPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ExternalAuthConfigPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ExternalAuthConfigPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ExternalAuthConfigPollResponse) Body() *ExternalAuthConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ExternalAuthConfigPollResponse) GetBody() (value *ExternalAuthConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ExternalAuthConfigClient) Poll() *ExternalAuthConfigPollRequest { + return &ExternalAuthConfigPollRequest{ + request: c.Get(), + } +} + +// ExternalAuthConfigGetRequest is the request for the 'get' method. +type ExternalAuthConfigGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ExternalAuthConfigGetRequest) Parameter(name string, value interface{}) *ExternalAuthConfigGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalAuthConfigGetRequest) Header(name string, value interface{}) *ExternalAuthConfigGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalAuthConfigGetRequest) Impersonate(user string) *ExternalAuthConfigGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalAuthConfigGetRequest) Send() (result *ExternalAuthConfigGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalAuthConfigGetRequest) SendContext(ctx context.Context) (result *ExternalAuthConfigGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalAuthConfigGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readExternalAuthConfigGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ExternalAuthConfigGetResponse is the response for the 'get' method. +type ExternalAuthConfigGetResponse struct { + status int + header http.Header + err *errors.Error + body *ExternalAuthConfig +} + +// Status returns the response status code. +func (r *ExternalAuthConfigGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalAuthConfigGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalAuthConfigGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ExternalAuthConfigGetResponse) Body() *ExternalAuthConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ExternalAuthConfigGetResponse) GetBody() (value *ExternalAuthConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_list_builder.go b/clustersmgmt/v2alpha1/external_auth_config_list_builder.go new file mode 100644 index 00000000..9deab5b6 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthConfigListBuilder contains the data and logic needed to build +// 'external_auth_config' objects. +type ExternalAuthConfigListBuilder struct { + items []*ExternalAuthConfigBuilder +} + +// NewExternalAuthConfigList creates a new builder of 'external_auth_config' objects. +func NewExternalAuthConfigList() *ExternalAuthConfigListBuilder { + return new(ExternalAuthConfigListBuilder) +} + +// Items sets the items of the list. +func (b *ExternalAuthConfigListBuilder) Items(values ...*ExternalAuthConfigBuilder) *ExternalAuthConfigListBuilder { + b.items = make([]*ExternalAuthConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ExternalAuthConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ExternalAuthConfigListBuilder) Copy(list *ExternalAuthConfigList) *ExternalAuthConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ExternalAuthConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewExternalAuthConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'external_auth_config' objects using the +// configuration stored in the builder. +func (b *ExternalAuthConfigListBuilder) Build() (list *ExternalAuthConfigList, err error) { + items := make([]*ExternalAuthConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ExternalAuthConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_list_type_json.go b/clustersmgmt/v2alpha1/external_auth_config_list_type_json.go new file mode 100644 index 00000000..672f029d --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthConfigList writes a list of values of the 'external_auth_config' type to +// the given writer. +func MarshalExternalAuthConfigList(list []*ExternalAuthConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthConfigList writes a list of value of the 'external_auth_config' type to +// the given stream. +func writeExternalAuthConfigList(list []*ExternalAuthConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeExternalAuthConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalExternalAuthConfigList reads a list of values of the 'external_auth_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalExternalAuthConfigList(source interface{}) (items []*ExternalAuthConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readExternalAuthConfigList(iterator) + err = iterator.Error + return +} + +// readExternalAuthConfigList reads list of values of the ”external_auth_config' type from +// the given iterator. +func readExternalAuthConfigList(iterator *jsoniter.Iterator) []*ExternalAuthConfig { + list := []*ExternalAuthConfig{} + for iterator.ReadArray() { + item := readExternalAuthConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_resource_json.go b/clustersmgmt/v2alpha1/external_auth_config_resource_json.go new file mode 100644 index 00000000..26fd474b --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeExternalAuthConfigGetRequest(request *ExternalAuthConfigGetRequest, writer io.Writer) error { + return nil +} +func readExternalAuthConfigGetResponse(response *ExternalAuthConfigGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalExternalAuthConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_type.go b/clustersmgmt/v2alpha1/external_auth_config_type.go new file mode 100644 index 00000000..d6b3048c --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_type.go @@ -0,0 +1,172 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthConfig represents the values of the 'external_auth_config' type. +// +// ExternalAuthConfig configuration +type ExternalAuthConfig struct { + bitmap_ uint32 + externalAuths *ExternalAuthList + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ExternalAuthConfig) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Boolean flag indicating if the cluster should use an external authentication configuration. +// +// By default this is false. +// +// To enable it the cluster needs to be ROSA HCP cluster and the organization of the user needs +// to have the `external-authentication` feature toggle enabled. +func (o *ExternalAuthConfig) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Boolean flag indicating if the cluster should use an external authentication configuration. +// +// By default this is false. +// +// To enable it the cluster needs to be ROSA HCP cluster and the organization of the user needs +// to have the `external-authentication` feature toggle enabled. +func (o *ExternalAuthConfig) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// ExternalAuths returns the value of the 'external_auths' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *ExternalAuthConfig) ExternalAuths() *ExternalAuthList { + if o != nil && o.bitmap_&2 != 0 { + return o.externalAuths + } + return nil +} + +// GetExternalAuths returns the value of the 'external_auths' attribute and +// a flag indicating if the attribute has a value. +func (o *ExternalAuthConfig) GetExternalAuths() (value *ExternalAuthList, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.externalAuths + } + return +} + +// ExternalAuthConfigListKind is the name of the type used to represent list of objects of +// type 'external_auth_config'. +const ExternalAuthConfigListKind = "ExternalAuthConfigList" + +// ExternalAuthConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'external_auth_config'. +const ExternalAuthConfigListLinkKind = "ExternalAuthConfigListLink" + +// ExternalAuthConfigNilKind is the name of the type used to nil lists of objects of +// type 'external_auth_config'. +const ExternalAuthConfigListNilKind = "ExternalAuthConfigListNil" + +// ExternalAuthConfigList is a list of values of the 'external_auth_config' type. +type ExternalAuthConfigList struct { + href string + link bool + items []*ExternalAuthConfig +} + +// Len returns the length of the list. +func (l *ExternalAuthConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ExternalAuthConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ExternalAuthConfigList) Get(i int) *ExternalAuthConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ExternalAuthConfigList) Slice() []*ExternalAuthConfig { + var slice []*ExternalAuthConfig + if l == nil { + slice = make([]*ExternalAuthConfig, 0) + } else { + slice = make([]*ExternalAuthConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ExternalAuthConfigList) Each(f func(item *ExternalAuthConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ExternalAuthConfigList) Range(f func(index int, item *ExternalAuthConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/external_auth_config_type_json.go b/clustersmgmt/v2alpha1/external_auth_config_type_json.go new file mode 100644 index 00000000..1b12cd3c --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_config_type_json.go @@ -0,0 +1,119 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthConfig writes a value of the 'external_auth_config' type to the given writer. +func MarshalExternalAuthConfig(object *ExternalAuthConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthConfig writes a value of the 'external_auth_config' type to the given stream. +func writeExternalAuthConfig(object *ExternalAuthConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&2 != 0 && object.externalAuths != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("external_auths") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeExternalAuthList(object.externalAuths.items, stream) + stream.WriteObjectEnd() + } + stream.WriteObjectEnd() +} + +// UnmarshalExternalAuthConfig reads a value of the 'external_auth_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalExternalAuthConfig(source interface{}) (object *ExternalAuthConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readExternalAuthConfig(iterator) + err = iterator.Error + return +} + +// readExternalAuthConfig reads a value of the 'external_auth_config' type from the given iterator. +func readExternalAuthConfig(iterator *jsoniter.Iterator) *ExternalAuthConfig { + object := &ExternalAuthConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + case "external_auths": + value := &ExternalAuthList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == ExternalAuthListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readExternalAuthList(iterator) + default: + iterator.ReadAny() + } + } + object.externalAuths = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/external_auth_list_builder.go b/clustersmgmt/v2alpha1/external_auth_list_builder.go new file mode 100644 index 00000000..9a95823f --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthListBuilder contains the data and logic needed to build +// 'external_auth' objects. +type ExternalAuthListBuilder struct { + items []*ExternalAuthBuilder +} + +// NewExternalAuthList creates a new builder of 'external_auth' objects. +func NewExternalAuthList() *ExternalAuthListBuilder { + return new(ExternalAuthListBuilder) +} + +// Items sets the items of the list. +func (b *ExternalAuthListBuilder) Items(values ...*ExternalAuthBuilder) *ExternalAuthListBuilder { + b.items = make([]*ExternalAuthBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ExternalAuthListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ExternalAuthListBuilder) Copy(list *ExternalAuthList) *ExternalAuthListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ExternalAuthBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewExternalAuth().Copy(v) + } + } + return b +} + +// Build creates a list of 'external_auth' objects using the +// configuration stored in the builder. +func (b *ExternalAuthListBuilder) Build() (list *ExternalAuthList, err error) { + items := make([]*ExternalAuth, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ExternalAuthList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/external_auth_list_type_json.go b/clustersmgmt/v2alpha1/external_auth_list_type_json.go new file mode 100644 index 00000000..b6ff2a73 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuthList writes a list of values of the 'external_auth' type to +// the given writer. +func MarshalExternalAuthList(list []*ExternalAuth, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuthList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuthList writes a list of value of the 'external_auth' type to +// the given stream. +func writeExternalAuthList(list []*ExternalAuth, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeExternalAuth(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalExternalAuthList reads a list of values of the 'external_auth' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalExternalAuthList(source interface{}) (items []*ExternalAuth, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readExternalAuthList(iterator) + err = iterator.Error + return +} + +// readExternalAuthList reads list of values of the ”external_auth' type from +// the given iterator. +func readExternalAuthList(iterator *jsoniter.Iterator) []*ExternalAuth { + list := []*ExternalAuth{} + for iterator.ReadArray() { + item := readExternalAuth(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/external_auth_resource_json.go b/clustersmgmt/v2alpha1/external_auth_resource_json.go new file mode 100644 index 00000000..510f703b --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeExternalAuthDeleteRequest(request *ExternalAuthDeleteRequest, writer io.Writer) error { + return nil +} +func readExternalAuthDeleteResponse(response *ExternalAuthDeleteResponse, reader io.Reader) error { + return nil +} +func writeExternalAuthGetRequest(request *ExternalAuthGetRequest, writer io.Writer) error { + return nil +} +func readExternalAuthGetResponse(response *ExternalAuthGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalExternalAuth(reader) + return err +} +func writeExternalAuthUpdateRequest(request *ExternalAuthUpdateRequest, writer io.Writer) error { + return MarshalExternalAuth(request.body, writer) +} +func readExternalAuthUpdateResponse(response *ExternalAuthUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalExternalAuth(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/external_auth_type.go b/clustersmgmt/v2alpha1/external_auth_type.go new file mode 100644 index 00000000..903169aa --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_type.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalAuthKind is the name of the type used to represent objects +// of type 'external_auth'. +const ExternalAuthKind = "ExternalAuth" + +// ExternalAuthLinkKind is the name of the type used to represent links +// to objects of type 'external_auth'. +const ExternalAuthLinkKind = "ExternalAuthLink" + +// ExternalAuthNilKind is the name of the type used to nil references +// to objects of type 'external_auth'. +const ExternalAuthNilKind = "ExternalAuthNil" + +// ExternalAuth represents the values of the 'external_auth' type. +// +// Representation of an external authentication provider. +type ExternalAuth struct { + bitmap_ uint32 + id string + href string + claim *ExternalAuthClaim + clients []*ExternalAuthClientConfig + issuer *TokenIssuer +} + +// Kind returns the name of the type of the object. +func (o *ExternalAuth) Kind() string { + if o == nil { + return ExternalAuthNilKind + } + if o.bitmap_&1 != 0 { + return ExternalAuthLinkKind + } + return ExternalAuthKind +} + +// Link returns true iif this is a link. +func (o *ExternalAuth) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ExternalAuth) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ExternalAuth) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ExternalAuth) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ExternalAuth) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ExternalAuth) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Claim returns the value of the 'claim' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The rules on how to transform information from an ID token into a cluster identity. +func (o *ExternalAuth) Claim() *ExternalAuthClaim { + if o != nil && o.bitmap_&8 != 0 { + return o.claim + } + return nil +} + +// GetClaim returns the value of the 'claim' attribute and +// a flag indicating if the attribute has a value. +// +// The rules on how to transform information from an ID token into a cluster identity. +func (o *ExternalAuth) GetClaim() (value *ExternalAuthClaim, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.claim + } + return +} + +// Clients returns the value of the 'clients' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The list of the platform's clients that need to request tokens from the issuer. +func (o *ExternalAuth) Clients() []*ExternalAuthClientConfig { + if o != nil && o.bitmap_&16 != 0 { + return o.clients + } + return nil +} + +// GetClients returns the value of the 'clients' attribute and +// a flag indicating if the attribute has a value. +// +// The list of the platform's clients that need to request tokens from the issuer. +func (o *ExternalAuth) GetClients() (value []*ExternalAuthClientConfig, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.clients + } + return +} + +// Issuer returns the value of the 'issuer' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The issuer describes the attributes of the OIDC token issuer. +func (o *ExternalAuth) Issuer() *TokenIssuer { + if o != nil && o.bitmap_&32 != 0 { + return o.issuer + } + return nil +} + +// GetIssuer returns the value of the 'issuer' attribute and +// a flag indicating if the attribute has a value. +// +// The issuer describes the attributes of the OIDC token issuer. +func (o *ExternalAuth) GetIssuer() (value *TokenIssuer, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.issuer + } + return +} + +// ExternalAuthListKind is the name of the type used to represent list of objects of +// type 'external_auth'. +const ExternalAuthListKind = "ExternalAuthList" + +// ExternalAuthListLinkKind is the name of the type used to represent links to list +// of objects of type 'external_auth'. +const ExternalAuthListLinkKind = "ExternalAuthListLink" + +// ExternalAuthNilKind is the name of the type used to nil lists of objects of +// type 'external_auth'. +const ExternalAuthListNilKind = "ExternalAuthListNil" + +// ExternalAuthList is a list of values of the 'external_auth' type. +type ExternalAuthList struct { + href string + link bool + items []*ExternalAuth +} + +// Kind returns the name of the type of the object. +func (l *ExternalAuthList) Kind() string { + if l == nil { + return ExternalAuthListNilKind + } + if l.link { + return ExternalAuthListLinkKind + } + return ExternalAuthListKind +} + +// Link returns true iif this is a link. +func (l *ExternalAuthList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ExternalAuthList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ExternalAuthList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ExternalAuthList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ExternalAuthList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ExternalAuthList) Get(i int) *ExternalAuth { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ExternalAuthList) Slice() []*ExternalAuth { + var slice []*ExternalAuth + if l == nil { + slice = make([]*ExternalAuth, 0) + } else { + slice = make([]*ExternalAuth, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ExternalAuthList) Each(f func(item *ExternalAuth) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ExternalAuthList) Range(f func(index int, item *ExternalAuth) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/external_auth_type_json.go b/clustersmgmt/v2alpha1/external_auth_type_json.go new file mode 100644 index 00000000..cd2ecee2 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auth_type_json.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalAuth writes a value of the 'external_auth' type to the given writer. +func MarshalExternalAuth(object *ExternalAuth, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalAuth(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalAuth writes a value of the 'external_auth' type to the given stream. +func writeExternalAuth(object *ExternalAuth, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ExternalAuthLinkKind) + } else { + stream.WriteString(ExternalAuthKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.claim != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("claim") + writeExternalAuthClaim(object.claim, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.clients != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("clients") + writeExternalAuthClientConfigList(object.clients, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.issuer != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("issuer") + writeTokenIssuer(object.issuer, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalExternalAuth reads a value of the 'external_auth' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalExternalAuth(source interface{}) (object *ExternalAuth, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readExternalAuth(iterator) + err = iterator.Error + return +} + +// readExternalAuth reads a value of the 'external_auth' type from the given iterator. +func readExternalAuth(iterator *jsoniter.Iterator) *ExternalAuth { + object := &ExternalAuth{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ExternalAuthLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "claim": + value := readExternalAuthClaim(iterator) + object.claim = value + object.bitmap_ |= 8 + case "clients": + value := readExternalAuthClientConfigList(iterator) + object.clients = value + object.bitmap_ |= 16 + case "issuer": + value := readTokenIssuer(iterator) + object.issuer = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/external_auths_client.go b/clustersmgmt/v2alpha1/external_auths_client.go new file mode 100644 index 00000000..325ef01d --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auths_client.go @@ -0,0 +1,455 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ExternalAuthsClient is the client of the 'external_auths' resource. +// +// Manages the collection of external authentication defined for a ROSA HCP cluster. +type ExternalAuthsClient struct { + transport http.RoundTripper + path string +} + +// NewExternalAuthsClient creates a new client for the 'external_auths' +// resource using the given transport to send the requests and receive the +// responses. +func NewExternalAuthsClient(transport http.RoundTripper, path string) *ExternalAuthsClient { + return &ExternalAuthsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new authentication to the cluster. +func (c *ExternalAuthsClient) Add() *ExternalAuthsAddRequest { + return &ExternalAuthsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +func (c *ExternalAuthsClient) List() *ExternalAuthsListRequest { + return &ExternalAuthsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// ExternalAuth returns the target 'external_auth' resource for the given identifier. +// +// Reference to the service that manages a specific external authentication. +func (c *ExternalAuthsClient) ExternalAuth(id string) *ExternalAuthClient { + return NewExternalAuthClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ExternalAuthsAddRequest is the request for the 'add' method. +type ExternalAuthsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ExternalAuth +} + +// Parameter adds a query parameter. +func (r *ExternalAuthsAddRequest) Parameter(name string, value interface{}) *ExternalAuthsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalAuthsAddRequest) Header(name string, value interface{}) *ExternalAuthsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalAuthsAddRequest) Impersonate(user string) *ExternalAuthsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the external authentication. +func (r *ExternalAuthsAddRequest) Body(value *ExternalAuth) *ExternalAuthsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalAuthsAddRequest) Send() (result *ExternalAuthsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalAuthsAddRequest) SendContext(ctx context.Context) (result *ExternalAuthsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeExternalAuthsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalAuthsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readExternalAuthsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// ExternalAuthsAddResponse is the response for the 'add' method. +type ExternalAuthsAddResponse struct { + status int + header http.Header + err *errors.Error + body *ExternalAuth +} + +// Status returns the response status code. +func (r *ExternalAuthsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalAuthsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalAuthsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the external authentication. +func (r *ExternalAuthsAddResponse) Body() *ExternalAuth { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the external authentication. +func (r *ExternalAuthsAddResponse) GetBody() (value *ExternalAuth, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ExternalAuthsListRequest is the request for the 'list' method. +type ExternalAuthsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *ExternalAuthsListRequest) Parameter(name string, value interface{}) *ExternalAuthsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalAuthsListRequest) Header(name string, value interface{}) *ExternalAuthsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalAuthsListRequest) Impersonate(user string) *ExternalAuthsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ExternalAuthsListRequest) Page(value int) *ExternalAuthsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *ExternalAuthsListRequest) Size(value int) *ExternalAuthsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalAuthsListRequest) Send() (result *ExternalAuthsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalAuthsListRequest) SendContext(ctx context.Context) (result *ExternalAuthsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalAuthsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readExternalAuthsListResponse(result, reader) + if err != nil { + return + } + return +} + +// ExternalAuthsListResponse is the response for the 'list' method. +type ExternalAuthsListResponse struct { + status int + header http.Header + err *errors.Error + items *ExternalAuthList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ExternalAuthsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalAuthsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalAuthsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of external authentications. +func (r *ExternalAuthsListResponse) Items() *ExternalAuthList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of external authentications. +func (r *ExternalAuthsListResponse) GetItems() (value *ExternalAuthList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ExternalAuthsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ExternalAuthsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *ExternalAuthsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *ExternalAuthsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *ExternalAuthsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *ExternalAuthsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/external_auths_resource_json.go b/clustersmgmt/v2alpha1/external_auths_resource_json.go new file mode 100644 index 00000000..5880148a --- /dev/null +++ b/clustersmgmt/v2alpha1/external_auths_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeExternalAuthsAddRequest(request *ExternalAuthsAddRequest, writer io.Writer) error { + return MarshalExternalAuth(request.body, writer) +} +func readExternalAuthsAddResponse(response *ExternalAuthsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalExternalAuth(reader) + return err +} +func writeExternalAuthsListRequest(request *ExternalAuthsListRequest, writer io.Writer) error { + return nil +} +func readExternalAuthsListResponse(response *ExternalAuthsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readExternalAuthList(iterator) + response.items = &ExternalAuthList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/external_configuration_builder.go b/clustersmgmt/v2alpha1/external_configuration_builder.go new file mode 100644 index 00000000..3fea073f --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_builder.go @@ -0,0 +1,110 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalConfigurationBuilder contains the data and logic needed to build 'external_configuration' objects. +// +// Representation of cluster external configuration. +type ExternalConfigurationBuilder struct { + bitmap_ uint32 + labels *LabelListBuilder + manifests *ManifestListBuilder + syncsets *SyncsetListBuilder +} + +// NewExternalConfiguration creates a new builder of 'external_configuration' objects. +func NewExternalConfiguration() *ExternalConfigurationBuilder { + return &ExternalConfigurationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ExternalConfigurationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Labels sets the value of the 'labels' attribute to the given values. +func (b *ExternalConfigurationBuilder) Labels(value *LabelListBuilder) *ExternalConfigurationBuilder { + b.labels = value + b.bitmap_ |= 1 + return b +} + +// Manifests sets the value of the 'manifests' attribute to the given values. +func (b *ExternalConfigurationBuilder) Manifests(value *ManifestListBuilder) *ExternalConfigurationBuilder { + b.manifests = value + b.bitmap_ |= 2 + return b +} + +// Syncsets sets the value of the 'syncsets' attribute to the given values. +func (b *ExternalConfigurationBuilder) Syncsets(value *SyncsetListBuilder) *ExternalConfigurationBuilder { + b.syncsets = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ExternalConfigurationBuilder) Copy(object *ExternalConfiguration) *ExternalConfigurationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.labels != nil { + b.labels = NewLabelList().Copy(object.labels) + } else { + b.labels = nil + } + if object.manifests != nil { + b.manifests = NewManifestList().Copy(object.manifests) + } else { + b.manifests = nil + } + if object.syncsets != nil { + b.syncsets = NewSyncsetList().Copy(object.syncsets) + } else { + b.syncsets = nil + } + return b +} + +// Build creates a 'external_configuration' object using the configuration stored in the builder. +func (b *ExternalConfigurationBuilder) Build() (object *ExternalConfiguration, err error) { + object = new(ExternalConfiguration) + object.bitmap_ = b.bitmap_ + if b.labels != nil { + object.labels, err = b.labels.Build() + if err != nil { + return + } + } + if b.manifests != nil { + object.manifests, err = b.manifests.Build() + if err != nil { + return + } + } + if b.syncsets != nil { + object.syncsets, err = b.syncsets.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/external_configuration_client.go b/clustersmgmt/v2alpha1/external_configuration_client.go new file mode 100644 index 00000000..53a97ce7 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_client.go @@ -0,0 +1,346 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ExternalConfigurationClient is the client of the 'external_configuration' resource. +// +// Manages a specific external configuration. +type ExternalConfigurationClient struct { + transport http.RoundTripper + path string +} + +// NewExternalConfigurationClient creates a new client for the 'external_configuration' +// resource using the given transport to send the requests and receive the +// responses. +func NewExternalConfigurationClient(transport http.RoundTripper, path string) *ExternalConfigurationClient { + return &ExternalConfigurationClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the external configuration. +func (c *ExternalConfigurationClient) Get() *ExternalConfigurationGetRequest { + return &ExternalConfigurationGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Labels returns the target 'labels' resource. +// +// Reference to the resource that manages the collection of labels. +func (c *ExternalConfigurationClient) Labels() *LabelsClient { + return NewLabelsClient( + c.transport, + path.Join(c.path, "labels"), + ) +} + +// Manifests returns the target 'manifests' resource. +// +// Reference to the resource that manages the collection of manifests. +func (c *ExternalConfigurationClient) Manifests() *ManifestsClient { + return NewManifestsClient( + c.transport, + path.Join(c.path, "manifests"), + ) +} + +// Syncsets returns the target 'syncsets' resource. +// +// Reference to the resource that manages the collection of syncsets. +func (c *ExternalConfigurationClient) Syncsets() *SyncsetsClient { + return NewSyncsetsClient( + c.transport, + path.Join(c.path, "syncsets"), + ) +} + +// ExternalConfigurationPollRequest is the request for the Poll method. +type ExternalConfigurationPollRequest struct { + request *ExternalConfigurationGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ExternalConfigurationPollRequest) Parameter(name string, value interface{}) *ExternalConfigurationPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ExternalConfigurationPollRequest) Header(name string, value interface{}) *ExternalConfigurationPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ExternalConfigurationPollRequest) Interval(value time.Duration) *ExternalConfigurationPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ExternalConfigurationPollRequest) Status(value int) *ExternalConfigurationPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ExternalConfigurationPollRequest) Predicate(value func(*ExternalConfigurationGetResponse) bool) *ExternalConfigurationPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ExternalConfigurationGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ExternalConfigurationPollRequest) StartContext(ctx context.Context) (response *ExternalConfigurationPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ExternalConfigurationPollResponse{ + response: result.(*ExternalConfigurationGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ExternalConfigurationPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ExternalConfigurationPollResponse is the response for the Poll method. +type ExternalConfigurationPollResponse struct { + response *ExternalConfigurationGetResponse +} + +// Status returns the response status code. +func (r *ExternalConfigurationPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ExternalConfigurationPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ExternalConfigurationPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +// +// Retreived log. +func (r *ExternalConfigurationPollResponse) Body() *ExternalConfiguration { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Retreived log. +func (r *ExternalConfigurationPollResponse) GetBody() (value *ExternalConfiguration, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ExternalConfigurationClient) Poll() *ExternalConfigurationPollRequest { + return &ExternalConfigurationPollRequest{ + request: c.Get(), + } +} + +// ExternalConfigurationGetRequest is the request for the 'get' method. +type ExternalConfigurationGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ExternalConfigurationGetRequest) Parameter(name string, value interface{}) *ExternalConfigurationGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ExternalConfigurationGetRequest) Header(name string, value interface{}) *ExternalConfigurationGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ExternalConfigurationGetRequest) Impersonate(user string) *ExternalConfigurationGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ExternalConfigurationGetRequest) Send() (result *ExternalConfigurationGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ExternalConfigurationGetRequest) SendContext(ctx context.Context) (result *ExternalConfigurationGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ExternalConfigurationGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readExternalConfigurationGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ExternalConfigurationGetResponse is the response for the 'get' method. +type ExternalConfigurationGetResponse struct { + status int + header http.Header + err *errors.Error + body *ExternalConfiguration +} + +// Status returns the response status code. +func (r *ExternalConfigurationGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ExternalConfigurationGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ExternalConfigurationGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Retreived log. +func (r *ExternalConfigurationGetResponse) Body() *ExternalConfiguration { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Retreived log. +func (r *ExternalConfigurationGetResponse) GetBody() (value *ExternalConfiguration, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/external_configuration_list_builder.go b/clustersmgmt/v2alpha1/external_configuration_list_builder.go new file mode 100644 index 00000000..c966694f --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalConfigurationListBuilder contains the data and logic needed to build +// 'external_configuration' objects. +type ExternalConfigurationListBuilder struct { + items []*ExternalConfigurationBuilder +} + +// NewExternalConfigurationList creates a new builder of 'external_configuration' objects. +func NewExternalConfigurationList() *ExternalConfigurationListBuilder { + return new(ExternalConfigurationListBuilder) +} + +// Items sets the items of the list. +func (b *ExternalConfigurationListBuilder) Items(values ...*ExternalConfigurationBuilder) *ExternalConfigurationListBuilder { + b.items = make([]*ExternalConfigurationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ExternalConfigurationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ExternalConfigurationListBuilder) Copy(list *ExternalConfigurationList) *ExternalConfigurationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ExternalConfigurationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewExternalConfiguration().Copy(v) + } + } + return b +} + +// Build creates a list of 'external_configuration' objects using the +// configuration stored in the builder. +func (b *ExternalConfigurationListBuilder) Build() (list *ExternalConfigurationList, err error) { + items := make([]*ExternalConfiguration, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ExternalConfigurationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/external_configuration_list_type_json.go b/clustersmgmt/v2alpha1/external_configuration_list_type_json.go new file mode 100644 index 00000000..456b1f28 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalConfigurationList writes a list of values of the 'external_configuration' type to +// the given writer. +func MarshalExternalConfigurationList(list []*ExternalConfiguration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalConfigurationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalConfigurationList writes a list of value of the 'external_configuration' type to +// the given stream. +func writeExternalConfigurationList(list []*ExternalConfiguration, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeExternalConfiguration(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalExternalConfigurationList reads a list of values of the 'external_configuration' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalExternalConfigurationList(source interface{}) (items []*ExternalConfiguration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readExternalConfigurationList(iterator) + err = iterator.Error + return +} + +// readExternalConfigurationList reads list of values of the ”external_configuration' type from +// the given iterator. +func readExternalConfigurationList(iterator *jsoniter.Iterator) []*ExternalConfiguration { + list := []*ExternalConfiguration{} + for iterator.ReadArray() { + item := readExternalConfiguration(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/external_configuration_resource_json.go b/clustersmgmt/v2alpha1/external_configuration_resource_json.go new file mode 100644 index 00000000..06c009dd --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeExternalConfigurationGetRequest(request *ExternalConfigurationGetRequest, writer io.Writer) error { + return nil +} +func readExternalConfigurationGetResponse(response *ExternalConfigurationGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalExternalConfiguration(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/external_configuration_type.go b/clustersmgmt/v2alpha1/external_configuration_type.go new file mode 100644 index 00000000..c5b49408 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ExternalConfiguration represents the values of the 'external_configuration' type. +// +// Representation of cluster external configuration. +type ExternalConfiguration struct { + bitmap_ uint32 + labels *LabelList + manifests *ManifestList + syncsets *SyncsetList +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ExternalConfiguration) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Labels returns the value of the 'labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// list of labels externally configured on the clusterdeployment. +func (o *ExternalConfiguration) Labels() *LabelList { + if o != nil && o.bitmap_&1 != 0 { + return o.labels + } + return nil +} + +// GetLabels returns the value of the 'labels' attribute and +// a flag indicating if the attribute has a value. +// +// list of labels externally configured on the clusterdeployment. +func (o *ExternalConfiguration) GetLabels() (value *LabelList, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.labels + } + return +} + +// Manifests returns the value of the 'manifests' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// list of manifest externally configured for a hosted cluster. +func (o *ExternalConfiguration) Manifests() *ManifestList { + if o != nil && o.bitmap_&2 != 0 { + return o.manifests + } + return nil +} + +// GetManifests returns the value of the 'manifests' attribute and +// a flag indicating if the attribute has a value. +// +// list of manifest externally configured for a hosted cluster. +func (o *ExternalConfiguration) GetManifests() (value *ManifestList, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.manifests + } + return +} + +// Syncsets returns the value of the 'syncsets' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// list of syncsets externally configured on the cluster. +func (o *ExternalConfiguration) Syncsets() *SyncsetList { + if o != nil && o.bitmap_&4 != 0 { + return o.syncsets + } + return nil +} + +// GetSyncsets returns the value of the 'syncsets' attribute and +// a flag indicating if the attribute has a value. +// +// list of syncsets externally configured on the cluster. +func (o *ExternalConfiguration) GetSyncsets() (value *SyncsetList, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.syncsets + } + return +} + +// ExternalConfigurationListKind is the name of the type used to represent list of objects of +// type 'external_configuration'. +const ExternalConfigurationListKind = "ExternalConfigurationList" + +// ExternalConfigurationListLinkKind is the name of the type used to represent links to list +// of objects of type 'external_configuration'. +const ExternalConfigurationListLinkKind = "ExternalConfigurationListLink" + +// ExternalConfigurationNilKind is the name of the type used to nil lists of objects of +// type 'external_configuration'. +const ExternalConfigurationListNilKind = "ExternalConfigurationListNil" + +// ExternalConfigurationList is a list of values of the 'external_configuration' type. +type ExternalConfigurationList struct { + href string + link bool + items []*ExternalConfiguration +} + +// Len returns the length of the list. +func (l *ExternalConfigurationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ExternalConfigurationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ExternalConfigurationList) Get(i int) *ExternalConfiguration { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ExternalConfigurationList) Slice() []*ExternalConfiguration { + var slice []*ExternalConfiguration + if l == nil { + slice = make([]*ExternalConfiguration, 0) + } else { + slice = make([]*ExternalConfiguration, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ExternalConfigurationList) Each(f func(item *ExternalConfiguration) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ExternalConfigurationList) Range(f func(index int, item *ExternalConfiguration) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/external_configuration_type_json.go b/clustersmgmt/v2alpha1/external_configuration_type_json.go new file mode 100644 index 00000000..88681143 --- /dev/null +++ b/clustersmgmt/v2alpha1/external_configuration_type_json.go @@ -0,0 +1,172 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalExternalConfiguration writes a value of the 'external_configuration' type to the given writer. +func MarshalExternalConfiguration(object *ExternalConfiguration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeExternalConfiguration(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeExternalConfiguration writes a value of the 'external_configuration' type to the given stream. +func writeExternalConfiguration(object *ExternalConfiguration, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.labels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("labels") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeLabelList(object.labels.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&2 != 0 && object.manifests != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("manifests") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeManifestList(object.manifests.items, stream) + stream.WriteObjectEnd() + count++ + } + present_ = object.bitmap_&4 != 0 && object.syncsets != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("syncsets") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeSyncsetList(object.syncsets.items, stream) + stream.WriteObjectEnd() + } + stream.WriteObjectEnd() +} + +// UnmarshalExternalConfiguration reads a value of the 'external_configuration' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalExternalConfiguration(source interface{}) (object *ExternalConfiguration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readExternalConfiguration(iterator) + err = iterator.Error + return +} + +// readExternalConfiguration reads a value of the 'external_configuration' type from the given iterator. +func readExternalConfiguration(iterator *jsoniter.Iterator) *ExternalConfiguration { + object := &ExternalConfiguration{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "labels": + value := &LabelList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == LabelListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readLabelList(iterator) + default: + iterator.ReadAny() + } + } + object.labels = value + object.bitmap_ |= 1 + case "manifests": + value := &ManifestList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == ManifestListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readManifestList(iterator) + default: + iterator.ReadAny() + } + } + object.manifests = value + object.bitmap_ |= 2 + case "syncsets": + value := &SyncsetList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == SyncsetListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readSyncsetList(iterator) + default: + iterator.ReadAny() + } + } + object.syncsets = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/flavour_builder.go b/clustersmgmt/v2alpha1/flavour_builder.go new file mode 100644 index 00000000..ce4e1081 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_builder.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// FlavourBuilder contains the data and logic needed to build 'flavour' objects. +// +// Set of predefined properties of a cluster. For example, a _huge_ flavour can be a cluster +// with 10 infra nodes and 1000 compute nodes. +type FlavourBuilder struct { + bitmap_ uint32 + id string + href string + aws *AWSFlavourBuilder + gcp *GCPFlavourBuilder + name string + network *NetworkBuilder + nodes *FlavourNodesBuilder +} + +// NewFlavour creates a new builder of 'flavour' objects. +func NewFlavour() *FlavourBuilder { + return &FlavourBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *FlavourBuilder) Link(value bool) *FlavourBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *FlavourBuilder) ID(value string) *FlavourBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *FlavourBuilder) HREF(value string) *FlavourBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *FlavourBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AWS sets the value of the 'AWS' attribute to the given value. +// +// Specification for different classes of nodes inside a flavour. +func (b *FlavourBuilder) AWS(value *AWSFlavourBuilder) *FlavourBuilder { + b.aws = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// GCP sets the value of the 'GCP' attribute to the given value. +// +// Specification for different classes of nodes inside a flavour. +func (b *FlavourBuilder) GCP(value *GCPFlavourBuilder) *FlavourBuilder { + b.gcp = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *FlavourBuilder) Name(value string) *FlavourBuilder { + b.name = value + b.bitmap_ |= 32 + return b +} + +// Network sets the value of the 'network' attribute to the given value. +// +// Network configuration of a cluster. +func (b *FlavourBuilder) Network(value *NetworkBuilder) *FlavourBuilder { + b.network = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// Nodes sets the value of the 'nodes' attribute to the given value. +// +// Counts of different classes of nodes inside a flavour. +func (b *FlavourBuilder) Nodes(value *FlavourNodesBuilder) *FlavourBuilder { + b.nodes = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *FlavourBuilder) Copy(object *Flavour) *FlavourBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.aws != nil { + b.aws = NewAWSFlavour().Copy(object.aws) + } else { + b.aws = nil + } + if object.gcp != nil { + b.gcp = NewGCPFlavour().Copy(object.gcp) + } else { + b.gcp = nil + } + b.name = object.name + if object.network != nil { + b.network = NewNetwork().Copy(object.network) + } else { + b.network = nil + } + if object.nodes != nil { + b.nodes = NewFlavourNodes().Copy(object.nodes) + } else { + b.nodes = nil + } + return b +} + +// Build creates a 'flavour' object using the configuration stored in the builder. +func (b *FlavourBuilder) Build() (object *Flavour, err error) { + object = new(Flavour) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.aws != nil { + object.aws, err = b.aws.Build() + if err != nil { + return + } + } + if b.gcp != nil { + object.gcp, err = b.gcp.Build() + if err != nil { + return + } + } + object.name = b.name + if b.network != nil { + object.network, err = b.network.Build() + if err != nil { + return + } + } + if b.nodes != nil { + object.nodes, err = b.nodes.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/flavour_client.go b/clustersmgmt/v2alpha1/flavour_client.go new file mode 100644 index 00000000..3580d9ee --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_client.go @@ -0,0 +1,467 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// FlavourClient is the client of the 'flavour' resource. +// +// Manages a specific cluster flavour. +type FlavourClient struct { + transport http.RoundTripper + path string +} + +// NewFlavourClient creates a new client for the 'flavour' +// resource using the given transport to send the requests and receive the +// responses. +func NewFlavourClient(transport http.RoundTripper, path string) *FlavourClient { + return &FlavourClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the cluster flavour. +func (c *FlavourClient) Get() *FlavourGetRequest { + return &FlavourGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the flavour. +// +// Attributes that can be updated are: +// +// - `aws.infra_volume` +// - `aws.infra_instance_type` +// - `gcp.infra_instance_type` +func (c *FlavourClient) Update() *FlavourUpdateRequest { + return &FlavourUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// FlavourPollRequest is the request for the Poll method. +type FlavourPollRequest struct { + request *FlavourGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *FlavourPollRequest) Parameter(name string, value interface{}) *FlavourPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *FlavourPollRequest) Header(name string, value interface{}) *FlavourPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *FlavourPollRequest) Interval(value time.Duration) *FlavourPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *FlavourPollRequest) Status(value int) *FlavourPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *FlavourPollRequest) Predicate(value func(*FlavourGetResponse) bool) *FlavourPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*FlavourGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *FlavourPollRequest) StartContext(ctx context.Context) (response *FlavourPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &FlavourPollResponse{ + response: result.(*FlavourGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *FlavourPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// FlavourPollResponse is the response for the Poll method. +type FlavourPollResponse struct { + response *FlavourGetResponse +} + +// Status returns the response status code. +func (r *FlavourPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *FlavourPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *FlavourPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *FlavourPollResponse) Body() *Flavour { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *FlavourPollResponse) GetBody() (value *Flavour, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *FlavourClient) Poll() *FlavourPollRequest { + return &FlavourPollRequest{ + request: c.Get(), + } +} + +// FlavourGetRequest is the request for the 'get' method. +type FlavourGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *FlavourGetRequest) Parameter(name string, value interface{}) *FlavourGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *FlavourGetRequest) Header(name string, value interface{}) *FlavourGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *FlavourGetRequest) Impersonate(user string) *FlavourGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *FlavourGetRequest) Send() (result *FlavourGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *FlavourGetRequest) SendContext(ctx context.Context) (result *FlavourGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &FlavourGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readFlavourGetResponse(result, reader) + if err != nil { + return + } + return +} + +// FlavourGetResponse is the response for the 'get' method. +type FlavourGetResponse struct { + status int + header http.Header + err *errors.Error + body *Flavour +} + +// Status returns the response status code. +func (r *FlavourGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *FlavourGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *FlavourGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *FlavourGetResponse) Body() *Flavour { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *FlavourGetResponse) GetBody() (value *Flavour, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// FlavourUpdateRequest is the request for the 'update' method. +type FlavourUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Flavour +} + +// Parameter adds a query parameter. +func (r *FlavourUpdateRequest) Parameter(name string, value interface{}) *FlavourUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *FlavourUpdateRequest) Header(name string, value interface{}) *FlavourUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *FlavourUpdateRequest) Impersonate(user string) *FlavourUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *FlavourUpdateRequest) Body(value *Flavour) *FlavourUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *FlavourUpdateRequest) Send() (result *FlavourUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *FlavourUpdateRequest) SendContext(ctx context.Context) (result *FlavourUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeFlavourUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &FlavourUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readFlavourUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// FlavourUpdateResponse is the response for the 'update' method. +type FlavourUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Flavour +} + +// Status returns the response status code. +func (r *FlavourUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *FlavourUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *FlavourUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *FlavourUpdateResponse) Body() *Flavour { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *FlavourUpdateResponse) GetBody() (value *Flavour, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/flavour_list_builder.go b/clustersmgmt/v2alpha1/flavour_list_builder.go new file mode 100644 index 00000000..5ad31deb --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// FlavourListBuilder contains the data and logic needed to build +// 'flavour' objects. +type FlavourListBuilder struct { + items []*FlavourBuilder +} + +// NewFlavourList creates a new builder of 'flavour' objects. +func NewFlavourList() *FlavourListBuilder { + return new(FlavourListBuilder) +} + +// Items sets the items of the list. +func (b *FlavourListBuilder) Items(values ...*FlavourBuilder) *FlavourListBuilder { + b.items = make([]*FlavourBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *FlavourListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *FlavourListBuilder) Copy(list *FlavourList) *FlavourListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*FlavourBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewFlavour().Copy(v) + } + } + return b +} + +// Build creates a list of 'flavour' objects using the +// configuration stored in the builder. +func (b *FlavourListBuilder) Build() (list *FlavourList, err error) { + items := make([]*Flavour, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(FlavourList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/flavour_list_type_json.go b/clustersmgmt/v2alpha1/flavour_list_type_json.go new file mode 100644 index 00000000..6302670d --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalFlavourList writes a list of values of the 'flavour' type to +// the given writer. +func MarshalFlavourList(list []*Flavour, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeFlavourList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeFlavourList writes a list of value of the 'flavour' type to +// the given stream. +func writeFlavourList(list []*Flavour, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeFlavour(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalFlavourList reads a list of values of the 'flavour' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalFlavourList(source interface{}) (items []*Flavour, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readFlavourList(iterator) + err = iterator.Error + return +} + +// readFlavourList reads list of values of the ”flavour' type from +// the given iterator. +func readFlavourList(iterator *jsoniter.Iterator) []*Flavour { + list := []*Flavour{} + for iterator.ReadArray() { + item := readFlavour(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/flavour_nodes_builder.go b/clustersmgmt/v2alpha1/flavour_nodes_builder.go new file mode 100644 index 00000000..a9aabbd6 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_nodes_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// FlavourNodesBuilder contains the data and logic needed to build 'flavour_nodes' objects. +// +// Counts of different classes of nodes inside a flavour. +type FlavourNodesBuilder struct { + bitmap_ uint32 + master int +} + +// NewFlavourNodes creates a new builder of 'flavour_nodes' objects. +func NewFlavourNodes() *FlavourNodesBuilder { + return &FlavourNodesBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *FlavourNodesBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Master sets the value of the 'master' attribute to the given value. +func (b *FlavourNodesBuilder) Master(value int) *FlavourNodesBuilder { + b.master = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *FlavourNodesBuilder) Copy(object *FlavourNodes) *FlavourNodesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.master = object.master + return b +} + +// Build creates a 'flavour_nodes' object using the configuration stored in the builder. +func (b *FlavourNodesBuilder) Build() (object *FlavourNodes, err error) { + object = new(FlavourNodes) + object.bitmap_ = b.bitmap_ + object.master = b.master + return +} diff --git a/clustersmgmt/v2alpha1/flavour_nodes_list_builder.go b/clustersmgmt/v2alpha1/flavour_nodes_list_builder.go new file mode 100644 index 00000000..fb6bc5d6 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_nodes_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// FlavourNodesListBuilder contains the data and logic needed to build +// 'flavour_nodes' objects. +type FlavourNodesListBuilder struct { + items []*FlavourNodesBuilder +} + +// NewFlavourNodesList creates a new builder of 'flavour_nodes' objects. +func NewFlavourNodesList() *FlavourNodesListBuilder { + return new(FlavourNodesListBuilder) +} + +// Items sets the items of the list. +func (b *FlavourNodesListBuilder) Items(values ...*FlavourNodesBuilder) *FlavourNodesListBuilder { + b.items = make([]*FlavourNodesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *FlavourNodesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *FlavourNodesListBuilder) Copy(list *FlavourNodesList) *FlavourNodesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*FlavourNodesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewFlavourNodes().Copy(v) + } + } + return b +} + +// Build creates a list of 'flavour_nodes' objects using the +// configuration stored in the builder. +func (b *FlavourNodesListBuilder) Build() (list *FlavourNodesList, err error) { + items := make([]*FlavourNodes, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(FlavourNodesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/flavour_nodes_list_type_json.go b/clustersmgmt/v2alpha1/flavour_nodes_list_type_json.go new file mode 100644 index 00000000..78885e92 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_nodes_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalFlavourNodesList writes a list of values of the 'flavour_nodes' type to +// the given writer. +func MarshalFlavourNodesList(list []*FlavourNodes, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeFlavourNodesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeFlavourNodesList writes a list of value of the 'flavour_nodes' type to +// the given stream. +func writeFlavourNodesList(list []*FlavourNodes, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeFlavourNodes(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalFlavourNodesList reads a list of values of the 'flavour_nodes' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalFlavourNodesList(source interface{}) (items []*FlavourNodes, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readFlavourNodesList(iterator) + err = iterator.Error + return +} + +// readFlavourNodesList reads list of values of the ”flavour_nodes' type from +// the given iterator. +func readFlavourNodesList(iterator *jsoniter.Iterator) []*FlavourNodes { + list := []*FlavourNodes{} + for iterator.ReadArray() { + item := readFlavourNodes(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/flavour_nodes_type.go b/clustersmgmt/v2alpha1/flavour_nodes_type.go new file mode 100644 index 00000000..7f33210a --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_nodes_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// FlavourNodes represents the values of the 'flavour_nodes' type. +// +// Counts of different classes of nodes inside a flavour. +type FlavourNodes struct { + bitmap_ uint32 + master int +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *FlavourNodes) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Master returns the value of the 'master' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Number of master nodes of the cluster. +func (o *FlavourNodes) Master() int { + if o != nil && o.bitmap_&1 != 0 { + return o.master + } + return 0 +} + +// GetMaster returns the value of the 'master' attribute and +// a flag indicating if the attribute has a value. +// +// Number of master nodes of the cluster. +func (o *FlavourNodes) GetMaster() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.master + } + return +} + +// FlavourNodesListKind is the name of the type used to represent list of objects of +// type 'flavour_nodes'. +const FlavourNodesListKind = "FlavourNodesList" + +// FlavourNodesListLinkKind is the name of the type used to represent links to list +// of objects of type 'flavour_nodes'. +const FlavourNodesListLinkKind = "FlavourNodesListLink" + +// FlavourNodesNilKind is the name of the type used to nil lists of objects of +// type 'flavour_nodes'. +const FlavourNodesListNilKind = "FlavourNodesListNil" + +// FlavourNodesList is a list of values of the 'flavour_nodes' type. +type FlavourNodesList struct { + href string + link bool + items []*FlavourNodes +} + +// Len returns the length of the list. +func (l *FlavourNodesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *FlavourNodesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *FlavourNodesList) Get(i int) *FlavourNodes { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *FlavourNodesList) Slice() []*FlavourNodes { + var slice []*FlavourNodes + if l == nil { + slice = make([]*FlavourNodes, 0) + } else { + slice = make([]*FlavourNodes, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *FlavourNodesList) Each(f func(item *FlavourNodes) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *FlavourNodesList) Range(f func(index int, item *FlavourNodes) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/flavour_nodes_type_json.go b/clustersmgmt/v2alpha1/flavour_nodes_type_json.go new file mode 100644 index 00000000..6c3c8c8f --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_nodes_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalFlavourNodes writes a value of the 'flavour_nodes' type to the given writer. +func MarshalFlavourNodes(object *FlavourNodes, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeFlavourNodes(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeFlavourNodes writes a value of the 'flavour_nodes' type to the given stream. +func writeFlavourNodes(object *FlavourNodes, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master") + stream.WriteInt(object.master) + } + stream.WriteObjectEnd() +} + +// UnmarshalFlavourNodes reads a value of the 'flavour_nodes' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalFlavourNodes(source interface{}) (object *FlavourNodes, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readFlavourNodes(iterator) + err = iterator.Error + return +} + +// readFlavourNodes reads a value of the 'flavour_nodes' type from the given iterator. +func readFlavourNodes(iterator *jsoniter.Iterator) *FlavourNodes { + object := &FlavourNodes{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "master": + value := iterator.ReadInt() + object.master = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/flavour_resource_json.go b/clustersmgmt/v2alpha1/flavour_resource_json.go new file mode 100644 index 00000000..6c74268a --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeFlavourGetRequest(request *FlavourGetRequest, writer io.Writer) error { + return nil +} +func readFlavourGetResponse(response *FlavourGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalFlavour(reader) + return err +} +func writeFlavourUpdateRequest(request *FlavourUpdateRequest, writer io.Writer) error { + return MarshalFlavour(request.body, writer) +} +func readFlavourUpdateResponse(response *FlavourUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalFlavour(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/flavour_type.go b/clustersmgmt/v2alpha1/flavour_type.go new file mode 100644 index 00000000..53cd90c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_type.go @@ -0,0 +1,355 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// FlavourKind is the name of the type used to represent objects +// of type 'flavour'. +const FlavourKind = "Flavour" + +// FlavourLinkKind is the name of the type used to represent links +// to objects of type 'flavour'. +const FlavourLinkKind = "FlavourLink" + +// FlavourNilKind is the name of the type used to nil references +// to objects of type 'flavour'. +const FlavourNilKind = "FlavourNil" + +// Flavour represents the values of the 'flavour' type. +// +// Set of predefined properties of a cluster. For example, a _huge_ flavour can be a cluster +// with 10 infra nodes and 1000 compute nodes. +type Flavour struct { + bitmap_ uint32 + id string + href string + aws *AWSFlavour + gcp *GCPFlavour + name string + network *Network + nodes *FlavourNodes +} + +// Kind returns the name of the type of the object. +func (o *Flavour) Kind() string { + if o == nil { + return FlavourNilKind + } + if o.bitmap_&1 != 0 { + return FlavourLinkKind + } + return FlavourKind +} + +// Link returns true iif this is a link. +func (o *Flavour) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Flavour) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Flavour) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Flavour) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Flavour) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Flavour) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AWS returns the value of the 'AWS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Default _Amazon Web Services_ settings of the cluster. +func (o *Flavour) AWS() *AWSFlavour { + if o != nil && o.bitmap_&8 != 0 { + return o.aws + } + return nil +} + +// GetAWS returns the value of the 'AWS' attribute and +// a flag indicating if the attribute has a value. +// +// Default _Amazon Web Services_ settings of the cluster. +func (o *Flavour) GetAWS() (value *AWSFlavour, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.aws + } + return +} + +// GCP returns the value of the 'GCP' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Default _Google Cloud Platform_ settings of the cluster. +func (o *Flavour) GCP() *GCPFlavour { + if o != nil && o.bitmap_&16 != 0 { + return o.gcp + } + return nil +} + +// GetGCP returns the value of the 'GCP' attribute and +// a flag indicating if the attribute has a value. +// +// Default _Google Cloud Platform_ settings of the cluster. +func (o *Flavour) GetGCP() (value *GCPFlavour, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.gcp + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Human friendly identifier of the cluster, for example `4`. +// +// NOTE: Currently for all flavours the `id` and `name` attributes have exactly the +// same values. +func (o *Flavour) Name() string { + if o != nil && o.bitmap_&32 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Human friendly identifier of the cluster, for example `4`. +// +// NOTE: Currently for all flavours the `id` and `name` attributes have exactly the +// same values. +func (o *Flavour) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.name + } + return +} + +// Network returns the value of the 'network' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Default network settings of the cluster. +// +// These can be overridden specifying in the cluster itself a different set of settings. +func (o *Flavour) Network() *Network { + if o != nil && o.bitmap_&64 != 0 { + return o.network + } + return nil +} + +// GetNetwork returns the value of the 'network' attribute and +// a flag indicating if the attribute has a value. +// +// Default network settings of the cluster. +// +// These can be overridden specifying in the cluster itself a different set of settings. +func (o *Flavour) GetNetwork() (value *Network, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.network + } + return +} + +// Nodes returns the value of the 'nodes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Number of nodes that will be used by default when creating a cluster that uses +// this flavour. +// +// These can be overridden specifying in the cluster itself a different number of nodes. +func (o *Flavour) Nodes() *FlavourNodes { + if o != nil && o.bitmap_&128 != 0 { + return o.nodes + } + return nil +} + +// GetNodes returns the value of the 'nodes' attribute and +// a flag indicating if the attribute has a value. +// +// Number of nodes that will be used by default when creating a cluster that uses +// this flavour. +// +// These can be overridden specifying in the cluster itself a different number of nodes. +func (o *Flavour) GetNodes() (value *FlavourNodes, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.nodes + } + return +} + +// FlavourListKind is the name of the type used to represent list of objects of +// type 'flavour'. +const FlavourListKind = "FlavourList" + +// FlavourListLinkKind is the name of the type used to represent links to list +// of objects of type 'flavour'. +const FlavourListLinkKind = "FlavourListLink" + +// FlavourNilKind is the name of the type used to nil lists of objects of +// type 'flavour'. +const FlavourListNilKind = "FlavourListNil" + +// FlavourList is a list of values of the 'flavour' type. +type FlavourList struct { + href string + link bool + items []*Flavour +} + +// Kind returns the name of the type of the object. +func (l *FlavourList) Kind() string { + if l == nil { + return FlavourListNilKind + } + if l.link { + return FlavourListLinkKind + } + return FlavourListKind +} + +// Link returns true iif this is a link. +func (l *FlavourList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *FlavourList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *FlavourList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *FlavourList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *FlavourList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *FlavourList) Get(i int) *Flavour { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *FlavourList) Slice() []*Flavour { + var slice []*Flavour + if l == nil { + slice = make([]*Flavour, 0) + } else { + slice = make([]*Flavour, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *FlavourList) Each(f func(item *Flavour) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *FlavourList) Range(f func(index int, item *Flavour) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/flavour_type_json.go b/clustersmgmt/v2alpha1/flavour_type_json.go new file mode 100644 index 00000000..24c81d3c --- /dev/null +++ b/clustersmgmt/v2alpha1/flavour_type_json.go @@ -0,0 +1,172 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalFlavour writes a value of the 'flavour' type to the given writer. +func MarshalFlavour(object *Flavour, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeFlavour(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeFlavour writes a value of the 'flavour' type to the given stream. +func writeFlavour(object *Flavour, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(FlavourLinkKind) + } else { + stream.WriteString(FlavourKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.aws != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws") + writeAWSFlavour(object.aws, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.gcp != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp") + writeGCPFlavour(object.gcp, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&64 != 0 && object.network != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("network") + writeNetwork(object.network, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.nodes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("nodes") + writeFlavourNodes(object.nodes, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalFlavour reads a value of the 'flavour' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalFlavour(source interface{}) (object *Flavour, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readFlavour(iterator) + err = iterator.Error + return +} + +// readFlavour reads a value of the 'flavour' type from the given iterator. +func readFlavour(iterator *jsoniter.Iterator) *Flavour { + object := &Flavour{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == FlavourLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "aws": + value := readAWSFlavour(iterator) + object.aws = value + object.bitmap_ |= 8 + case "gcp": + value := readGCPFlavour(iterator) + object.gcp = value + object.bitmap_ |= 16 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 32 + case "network": + value := readNetwork(iterator) + object.network = value + object.bitmap_ |= 64 + case "nodes": + value := readFlavourNodes(iterator) + object.nodes = value + object.bitmap_ |= 128 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/flavours_client.go b/clustersmgmt/v2alpha1/flavours_client.go new file mode 100644 index 00000000..4b3eb420 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavours_client.go @@ -0,0 +1,345 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// FlavoursClient is the client of the 'flavours' resource. +// +// Manages the collection of cluster flavours. +type FlavoursClient struct { + transport http.RoundTripper + path string +} + +// NewFlavoursClient creates a new client for the 'flavours' +// resource using the given transport to send the requests and receive the +// responses. +func NewFlavoursClient(transport http.RoundTripper, path string) *FlavoursClient { + return &FlavoursClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +func (c *FlavoursClient) List() *FlavoursListRequest { + return &FlavoursListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Flavour returns the target 'flavour' resource for the given identifier. +// +// Reference to the resource that manages a specific flavour. +func (c *FlavoursClient) Flavour(id string) *FlavourClient { + return NewFlavourClient( + c.transport, + path.Join(c.path, id), + ) +} + +// FlavoursListRequest is the request for the 'list' method. +type FlavoursListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *FlavoursListRequest) Parameter(name string, value interface{}) *FlavoursListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *FlavoursListRequest) Header(name string, value interface{}) *FlavoursListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *FlavoursListRequest) Impersonate(user string) *FlavoursListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the flavour instead of +// the names of the columns of a table. For example, in order to sort the flavours +// descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *FlavoursListRequest) Order(value string) *FlavoursListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *FlavoursListRequest) Page(value int) *FlavoursListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the flavour instead of +// the names of the columns of a table. For example, in order to retrieve all the +// flavours with a name starting with `my`the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the flavours +// that the user has permission to see will be returned. +func (r *FlavoursListRequest) Search(value string) *FlavoursListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *FlavoursListRequest) Size(value int) *FlavoursListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *FlavoursListRequest) Send() (result *FlavoursListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *FlavoursListRequest) SendContext(ctx context.Context) (result *FlavoursListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &FlavoursListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readFlavoursListResponse(result, reader) + if err != nil { + return + } + return +} + +// FlavoursListResponse is the response for the 'list' method. +type FlavoursListResponse struct { + status int + header http.Header + err *errors.Error + items *FlavourList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *FlavoursListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *FlavoursListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *FlavoursListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of flavours. +func (r *FlavoursListResponse) Items() *FlavourList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of flavours. +func (r *FlavoursListResponse) GetItems() (value *FlavourList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *FlavoursListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *FlavoursListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *FlavoursListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *FlavoursListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *FlavoursListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *FlavoursListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/flavours_resource_json.go b/clustersmgmt/v2alpha1/flavours_resource_json.go new file mode 100644 index 00000000..38d49500 --- /dev/null +++ b/clustersmgmt/v2alpha1/flavours_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeFlavoursListRequest(request *FlavoursListRequest, writer io.Writer) error { + return nil +} +func readFlavoursListResponse(response *FlavoursListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readFlavourList(iterator) + response.items = &FlavourList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/float_list_type_json.go b/clustersmgmt/v2alpha1/float_list_type_json.go new file mode 100644 index 00000000..fe2c4554 --- /dev/null +++ b/clustersmgmt/v2alpha1/float_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalFloatList writes a list of values of the 'float' type to +// the given writer. +func MarshalFloatList(list []float64, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeFloatList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeFloatList writes a list of value of the 'float' type to +// the given stream. +func writeFloatList(list []float64, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteFloat64(value) + } + stream.WriteArrayEnd() +} + +// UnmarshalFloatList reads a list of values of the 'float' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalFloatList(source interface{}) (items []float64, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readFloatList(iterator) + err = iterator.Error + return +} + +// readFloatList reads list of values of the ”float' type from +// the given iterator. +func readFloatList(iterator *jsoniter.Iterator) []float64 { + list := []float64{} + for iterator.ReadArray() { + item := iterator.ReadFloat64() + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_authentication_builder.go b/clustersmgmt/v2alpha1/gcp_authentication_builder.go new file mode 100644 index 00000000..46b111a1 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_authentication_builder.go @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GcpAuthenticationBuilder contains the data and logic needed to build 'gcp_authentication' objects. +// +// Google cloud platform authentication method of a cluster. +type GcpAuthenticationBuilder struct { + bitmap_ uint32 + href string + id string + kind string +} + +// NewGcpAuthentication creates a new builder of 'gcp_authentication' objects. +func NewGcpAuthentication() *GcpAuthenticationBuilder { + return &GcpAuthenticationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GcpAuthenticationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Href sets the value of the 'href' attribute to the given value. +func (b *GcpAuthenticationBuilder) Href(value string) *GcpAuthenticationBuilder { + b.href = value + b.bitmap_ |= 1 + return b +} + +// Id sets the value of the 'id' attribute to the given value. +func (b *GcpAuthenticationBuilder) Id(value string) *GcpAuthenticationBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// Kind sets the value of the 'kind' attribute to the given value. +func (b *GcpAuthenticationBuilder) Kind(value string) *GcpAuthenticationBuilder { + b.kind = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GcpAuthenticationBuilder) Copy(object *GcpAuthentication) *GcpAuthenticationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.href = object.href + b.id = object.id + b.kind = object.kind + return b +} + +// Build creates a 'gcp_authentication' object using the configuration stored in the builder. +func (b *GcpAuthenticationBuilder) Build() (object *GcpAuthentication, err error) { + object = new(GcpAuthentication) + object.bitmap_ = b.bitmap_ + object.href = b.href + object.id = b.id + object.kind = b.kind + return +} diff --git a/clustersmgmt/v2alpha1/gcp_authentication_list_builder.go b/clustersmgmt/v2alpha1/gcp_authentication_list_builder.go new file mode 100644 index 00000000..a317f120 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_authentication_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GcpAuthenticationListBuilder contains the data and logic needed to build +// 'gcp_authentication' objects. +type GcpAuthenticationListBuilder struct { + items []*GcpAuthenticationBuilder +} + +// NewGcpAuthenticationList creates a new builder of 'gcp_authentication' objects. +func NewGcpAuthenticationList() *GcpAuthenticationListBuilder { + return new(GcpAuthenticationListBuilder) +} + +// Items sets the items of the list. +func (b *GcpAuthenticationListBuilder) Items(values ...*GcpAuthenticationBuilder) *GcpAuthenticationListBuilder { + b.items = make([]*GcpAuthenticationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GcpAuthenticationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GcpAuthenticationListBuilder) Copy(list *GcpAuthenticationList) *GcpAuthenticationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GcpAuthenticationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGcpAuthentication().Copy(v) + } + } + return b +} + +// Build creates a list of 'gcp_authentication' objects using the +// configuration stored in the builder. +func (b *GcpAuthenticationListBuilder) Build() (list *GcpAuthenticationList, err error) { + items := make([]*GcpAuthentication, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GcpAuthenticationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_authentication_list_type_json.go b/clustersmgmt/v2alpha1/gcp_authentication_list_type_json.go new file mode 100644 index 00000000..4d9d08ab --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_authentication_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGcpAuthenticationList writes a list of values of the 'gcp_authentication' type to +// the given writer. +func MarshalGcpAuthenticationList(list []*GcpAuthentication, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGcpAuthenticationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGcpAuthenticationList writes a list of value of the 'gcp_authentication' type to +// the given stream. +func writeGcpAuthenticationList(list []*GcpAuthentication, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGcpAuthentication(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGcpAuthenticationList reads a list of values of the 'gcp_authentication' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGcpAuthenticationList(source interface{}) (items []*GcpAuthentication, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGcpAuthenticationList(iterator) + err = iterator.Error + return +} + +// readGcpAuthenticationList reads list of values of the ”gcp_authentication' type from +// the given iterator. +func readGcpAuthenticationList(iterator *jsoniter.Iterator) []*GcpAuthentication { + list := []*GcpAuthentication{} + for iterator.ReadArray() { + item := readGcpAuthentication(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_authentication_type.go b/clustersmgmt/v2alpha1/gcp_authentication_type.go new file mode 100644 index 00000000..7f6dd542 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_authentication_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GcpAuthentication represents the values of the 'gcp_authentication' type. +// +// Google cloud platform authentication method of a cluster. +type GcpAuthentication struct { + bitmap_ uint32 + href string + id string + kind string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GcpAuthentication) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Href returns the value of the 'href' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Self link +func (o *GcpAuthentication) Href() string { + if o != nil && o.bitmap_&1 != 0 { + return o.href + } + return "" +} + +// GetHref returns the value of the 'href' attribute and +// a flag indicating if the attribute has a value. +// +// Self link +func (o *GcpAuthentication) GetHref() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.href + } + return +} + +// Id returns the value of the 'id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Unique identifier of the object +func (o *GcpAuthentication) Id() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetId returns the value of the 'id' attribute and +// a flag indicating if the attribute has a value. +// +// Unique identifier of the object +func (o *GcpAuthentication) GetId() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// Kind returns the value of the 'kind' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates the type of this object +func (o *GcpAuthentication) Kind() string { + if o != nil && o.bitmap_&4 != 0 { + return o.kind + } + return "" +} + +// GetKind returns the value of the 'kind' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates the type of this object +func (o *GcpAuthentication) GetKind() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.kind + } + return +} + +// GcpAuthenticationListKind is the name of the type used to represent list of objects of +// type 'gcp_authentication'. +const GcpAuthenticationListKind = "GcpAuthenticationList" + +// GcpAuthenticationListLinkKind is the name of the type used to represent links to list +// of objects of type 'gcp_authentication'. +const GcpAuthenticationListLinkKind = "GcpAuthenticationListLink" + +// GcpAuthenticationNilKind is the name of the type used to nil lists of objects of +// type 'gcp_authentication'. +const GcpAuthenticationListNilKind = "GcpAuthenticationListNil" + +// GcpAuthenticationList is a list of values of the 'gcp_authentication' type. +type GcpAuthenticationList struct { + href string + link bool + items []*GcpAuthentication +} + +// Len returns the length of the list. +func (l *GcpAuthenticationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GcpAuthenticationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GcpAuthenticationList) Get(i int) *GcpAuthentication { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GcpAuthenticationList) Slice() []*GcpAuthentication { + var slice []*GcpAuthentication + if l == nil { + slice = make([]*GcpAuthentication, 0) + } else { + slice = make([]*GcpAuthentication, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GcpAuthenticationList) Each(f func(item *GcpAuthentication) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GcpAuthenticationList) Range(f func(index int, item *GcpAuthentication) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_authentication_type_json.go b/clustersmgmt/v2alpha1/gcp_authentication_type_json.go new file mode 100644 index 00000000..1884a33c --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_authentication_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGcpAuthentication writes a value of the 'gcp_authentication' type to the given writer. +func MarshalGcpAuthentication(object *GcpAuthentication, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGcpAuthentication(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGcpAuthentication writes a value of the 'gcp_authentication' type to the given stream. +func writeGcpAuthentication(object *GcpAuthentication, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kind") + stream.WriteString(object.kind) + } + stream.WriteObjectEnd() +} + +// UnmarshalGcpAuthentication reads a value of the 'gcp_authentication' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGcpAuthentication(source interface{}) (object *GcpAuthentication, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGcpAuthentication(iterator) + err = iterator.Error + return +} + +// readGcpAuthentication reads a value of the 'gcp_authentication' type from the given iterator. +func readGcpAuthentication(iterator *jsoniter.Iterator) *GcpAuthentication { + object := &GcpAuthentication{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "href": + value := iterator.ReadString() + object.href = value + object.bitmap_ |= 1 + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 2 + case "kind": + value := iterator.ReadString() + object.kind = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_builder.go b/clustersmgmt/v2alpha1/gcp_builder.go new file mode 100644 index 00000000..c2f70cf3 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_builder.go @@ -0,0 +1,203 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPBuilder contains the data and logic needed to build 'GCP' objects. +// +// Google cloud platform settings of a cluster. +type GCPBuilder struct { + bitmap_ uint32 + authURI string + authProviderX509CertURL string + authentication *GcpAuthenticationBuilder + clientID string + clientX509CertURL string + clientEmail string + privateKey string + privateKeyID string + projectID string + security *GcpSecurityBuilder + tokenURI string + type_ string +} + +// NewGCP creates a new builder of 'GCP' objects. +func NewGCP() *GCPBuilder { + return &GCPBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GCPBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AuthURI sets the value of the 'auth_URI' attribute to the given value. +func (b *GCPBuilder) AuthURI(value string) *GCPBuilder { + b.authURI = value + b.bitmap_ |= 1 + return b +} + +// AuthProviderX509CertURL sets the value of the 'auth_provider_X509_cert_URL' attribute to the given value. +func (b *GCPBuilder) AuthProviderX509CertURL(value string) *GCPBuilder { + b.authProviderX509CertURL = value + b.bitmap_ |= 2 + return b +} + +// Authentication sets the value of the 'authentication' attribute to the given value. +// +// Google cloud platform authentication method of a cluster. +func (b *GCPBuilder) Authentication(value *GcpAuthenticationBuilder) *GCPBuilder { + b.authentication = value + if value != nil { + b.bitmap_ |= 4 + } else { + b.bitmap_ &^= 4 + } + return b +} + +// ClientID sets the value of the 'client_ID' attribute to the given value. +func (b *GCPBuilder) ClientID(value string) *GCPBuilder { + b.clientID = value + b.bitmap_ |= 8 + return b +} + +// ClientX509CertURL sets the value of the 'client_X509_cert_URL' attribute to the given value. +func (b *GCPBuilder) ClientX509CertURL(value string) *GCPBuilder { + b.clientX509CertURL = value + b.bitmap_ |= 16 + return b +} + +// ClientEmail sets the value of the 'client_email' attribute to the given value. +func (b *GCPBuilder) ClientEmail(value string) *GCPBuilder { + b.clientEmail = value + b.bitmap_ |= 32 + return b +} + +// PrivateKey sets the value of the 'private_key' attribute to the given value. +func (b *GCPBuilder) PrivateKey(value string) *GCPBuilder { + b.privateKey = value + b.bitmap_ |= 64 + return b +} + +// PrivateKeyID sets the value of the 'private_key_ID' attribute to the given value. +func (b *GCPBuilder) PrivateKeyID(value string) *GCPBuilder { + b.privateKeyID = value + b.bitmap_ |= 128 + return b +} + +// ProjectID sets the value of the 'project_ID' attribute to the given value. +func (b *GCPBuilder) ProjectID(value string) *GCPBuilder { + b.projectID = value + b.bitmap_ |= 256 + return b +} + +// Security sets the value of the 'security' attribute to the given value. +// +// Google cloud platform security settings of a cluster. +func (b *GCPBuilder) Security(value *GcpSecurityBuilder) *GCPBuilder { + b.security = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// TokenURI sets the value of the 'token_URI' attribute to the given value. +func (b *GCPBuilder) TokenURI(value string) *GCPBuilder { + b.tokenURI = value + b.bitmap_ |= 1024 + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *GCPBuilder) Type(value string) *GCPBuilder { + b.type_ = value + b.bitmap_ |= 2048 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GCPBuilder) Copy(object *GCP) *GCPBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.authURI = object.authURI + b.authProviderX509CertURL = object.authProviderX509CertURL + if object.authentication != nil { + b.authentication = NewGcpAuthentication().Copy(object.authentication) + } else { + b.authentication = nil + } + b.clientID = object.clientID + b.clientX509CertURL = object.clientX509CertURL + b.clientEmail = object.clientEmail + b.privateKey = object.privateKey + b.privateKeyID = object.privateKeyID + b.projectID = object.projectID + if object.security != nil { + b.security = NewGcpSecurity().Copy(object.security) + } else { + b.security = nil + } + b.tokenURI = object.tokenURI + b.type_ = object.type_ + return b +} + +// Build creates a 'GCP' object using the configuration stored in the builder. +func (b *GCPBuilder) Build() (object *GCP, err error) { + object = new(GCP) + object.bitmap_ = b.bitmap_ + object.authURI = b.authURI + object.authProviderX509CertURL = b.authProviderX509CertURL + if b.authentication != nil { + object.authentication, err = b.authentication.Build() + if err != nil { + return + } + } + object.clientID = b.clientID + object.clientX509CertURL = b.clientX509CertURL + object.clientEmail = b.clientEmail + object.privateKey = b.privateKey + object.privateKeyID = b.privateKeyID + object.projectID = b.projectID + if b.security != nil { + object.security, err = b.security.Build() + if err != nil { + return + } + } + object.tokenURI = b.tokenURI + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/gcp_encryption_key_builder.go b/clustersmgmt/v2alpha1/gcp_encryption_key_builder.go new file mode 100644 index 00000000..2ecc1b34 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_encryption_key_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPEncryptionKeyBuilder contains the data and logic needed to build 'GCP_encryption_key' objects. +// +// GCP Encryption Key for CCS clusters. +type GCPEncryptionKeyBuilder struct { + bitmap_ uint32 + kmsKeyServiceAccount string + keyLocation string + keyName string + keyRing string +} + +// NewGCPEncryptionKey creates a new builder of 'GCP_encryption_key' objects. +func NewGCPEncryptionKey() *GCPEncryptionKeyBuilder { + return &GCPEncryptionKeyBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GCPEncryptionKeyBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// KMSKeyServiceAccount sets the value of the 'KMS_key_service_account' attribute to the given value. +func (b *GCPEncryptionKeyBuilder) KMSKeyServiceAccount(value string) *GCPEncryptionKeyBuilder { + b.kmsKeyServiceAccount = value + b.bitmap_ |= 1 + return b +} + +// KeyLocation sets the value of the 'key_location' attribute to the given value. +func (b *GCPEncryptionKeyBuilder) KeyLocation(value string) *GCPEncryptionKeyBuilder { + b.keyLocation = value + b.bitmap_ |= 2 + return b +} + +// KeyName sets the value of the 'key_name' attribute to the given value. +func (b *GCPEncryptionKeyBuilder) KeyName(value string) *GCPEncryptionKeyBuilder { + b.keyName = value + b.bitmap_ |= 4 + return b +} + +// KeyRing sets the value of the 'key_ring' attribute to the given value. +func (b *GCPEncryptionKeyBuilder) KeyRing(value string) *GCPEncryptionKeyBuilder { + b.keyRing = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GCPEncryptionKeyBuilder) Copy(object *GCPEncryptionKey) *GCPEncryptionKeyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.kmsKeyServiceAccount = object.kmsKeyServiceAccount + b.keyLocation = object.keyLocation + b.keyName = object.keyName + b.keyRing = object.keyRing + return b +} + +// Build creates a 'GCP_encryption_key' object using the configuration stored in the builder. +func (b *GCPEncryptionKeyBuilder) Build() (object *GCPEncryptionKey, err error) { + object = new(GCPEncryptionKey) + object.bitmap_ = b.bitmap_ + object.kmsKeyServiceAccount = b.kmsKeyServiceAccount + object.keyLocation = b.keyLocation + object.keyName = b.keyName + object.keyRing = b.keyRing + return +} diff --git a/clustersmgmt/v2alpha1/gcp_encryption_key_list_builder.go b/clustersmgmt/v2alpha1/gcp_encryption_key_list_builder.go new file mode 100644 index 00000000..2c79ee5b --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_encryption_key_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPEncryptionKeyListBuilder contains the data and logic needed to build +// 'GCP_encryption_key' objects. +type GCPEncryptionKeyListBuilder struct { + items []*GCPEncryptionKeyBuilder +} + +// NewGCPEncryptionKeyList creates a new builder of 'GCP_encryption_key' objects. +func NewGCPEncryptionKeyList() *GCPEncryptionKeyListBuilder { + return new(GCPEncryptionKeyListBuilder) +} + +// Items sets the items of the list. +func (b *GCPEncryptionKeyListBuilder) Items(values ...*GCPEncryptionKeyBuilder) *GCPEncryptionKeyListBuilder { + b.items = make([]*GCPEncryptionKeyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GCPEncryptionKeyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GCPEncryptionKeyListBuilder) Copy(list *GCPEncryptionKeyList) *GCPEncryptionKeyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GCPEncryptionKeyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGCPEncryptionKey().Copy(v) + } + } + return b +} + +// Build creates a list of 'GCP_encryption_key' objects using the +// configuration stored in the builder. +func (b *GCPEncryptionKeyListBuilder) Build() (list *GCPEncryptionKeyList, err error) { + items := make([]*GCPEncryptionKey, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GCPEncryptionKeyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_encryption_key_list_type_json.go b/clustersmgmt/v2alpha1/gcp_encryption_key_list_type_json.go new file mode 100644 index 00000000..9edf30d5 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_encryption_key_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPEncryptionKeyList writes a list of values of the 'GCP_encryption_key' type to +// the given writer. +func MarshalGCPEncryptionKeyList(list []*GCPEncryptionKey, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPEncryptionKeyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPEncryptionKeyList writes a list of value of the 'GCP_encryption_key' type to +// the given stream. +func writeGCPEncryptionKeyList(list []*GCPEncryptionKey, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGCPEncryptionKey(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGCPEncryptionKeyList reads a list of values of the 'GCP_encryption_key' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGCPEncryptionKeyList(source interface{}) (items []*GCPEncryptionKey, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGCPEncryptionKeyList(iterator) + err = iterator.Error + return +} + +// readGCPEncryptionKeyList reads list of values of the ”GCP_encryption_key' type from +// the given iterator. +func readGCPEncryptionKeyList(iterator *jsoniter.Iterator) []*GCPEncryptionKey { + list := []*GCPEncryptionKey{} + for iterator.ReadArray() { + item := readGCPEncryptionKey(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_encryption_key_type.go b/clustersmgmt/v2alpha1/gcp_encryption_key_type.go new file mode 100644 index 00000000..99f5e34d --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_encryption_key_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPEncryptionKey represents the values of the 'GCP_encryption_key' type. +// +// GCP Encryption Key for CCS clusters. +type GCPEncryptionKey struct { + bitmap_ uint32 + kmsKeyServiceAccount string + keyLocation string + keyName string + keyRing string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GCPEncryptionKey) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// KMSKeyServiceAccount returns the value of the 'KMS_key_service_account' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Service account used to access the KMS key +func (o *GCPEncryptionKey) KMSKeyServiceAccount() string { + if o != nil && o.bitmap_&1 != 0 { + return o.kmsKeyServiceAccount + } + return "" +} + +// GetKMSKeyServiceAccount returns the value of the 'KMS_key_service_account' attribute and +// a flag indicating if the attribute has a value. +// +// Service account used to access the KMS key +func (o *GCPEncryptionKey) GetKMSKeyServiceAccount() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.kmsKeyServiceAccount + } + return +} + +// KeyLocation returns the value of the 'key_location' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Location of the encryption key ring +func (o *GCPEncryptionKey) KeyLocation() string { + if o != nil && o.bitmap_&2 != 0 { + return o.keyLocation + } + return "" +} + +// GetKeyLocation returns the value of the 'key_location' attribute and +// a flag indicating if the attribute has a value. +// +// Location of the encryption key ring +func (o *GCPEncryptionKey) GetKeyLocation() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.keyLocation + } + return +} + +// KeyName returns the value of the 'key_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the encryption key +func (o *GCPEncryptionKey) KeyName() string { + if o != nil && o.bitmap_&4 != 0 { + return o.keyName + } + return "" +} + +// GetKeyName returns the value of the 'key_name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the encryption key +func (o *GCPEncryptionKey) GetKeyName() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.keyName + } + return +} + +// KeyRing returns the value of the 'key_ring' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the key ring the encryption key is located on +func (o *GCPEncryptionKey) KeyRing() string { + if o != nil && o.bitmap_&8 != 0 { + return o.keyRing + } + return "" +} + +// GetKeyRing returns the value of the 'key_ring' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the key ring the encryption key is located on +func (o *GCPEncryptionKey) GetKeyRing() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.keyRing + } + return +} + +// GCPEncryptionKeyListKind is the name of the type used to represent list of objects of +// type 'GCP_encryption_key'. +const GCPEncryptionKeyListKind = "GCPEncryptionKeyList" + +// GCPEncryptionKeyListLinkKind is the name of the type used to represent links to list +// of objects of type 'GCP_encryption_key'. +const GCPEncryptionKeyListLinkKind = "GCPEncryptionKeyListLink" + +// GCPEncryptionKeyNilKind is the name of the type used to nil lists of objects of +// type 'GCP_encryption_key'. +const GCPEncryptionKeyListNilKind = "GCPEncryptionKeyListNil" + +// GCPEncryptionKeyList is a list of values of the 'GCP_encryption_key' type. +type GCPEncryptionKeyList struct { + href string + link bool + items []*GCPEncryptionKey +} + +// Len returns the length of the list. +func (l *GCPEncryptionKeyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GCPEncryptionKeyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GCPEncryptionKeyList) Get(i int) *GCPEncryptionKey { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GCPEncryptionKeyList) Slice() []*GCPEncryptionKey { + var slice []*GCPEncryptionKey + if l == nil { + slice = make([]*GCPEncryptionKey, 0) + } else { + slice = make([]*GCPEncryptionKey, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GCPEncryptionKeyList) Each(f func(item *GCPEncryptionKey) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GCPEncryptionKeyList) Range(f func(index int, item *GCPEncryptionKey) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_encryption_key_type_json.go b/clustersmgmt/v2alpha1/gcp_encryption_key_type_json.go new file mode 100644 index 00000000..78720963 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_encryption_key_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPEncryptionKey writes a value of the 'GCP_encryption_key' type to the given writer. +func MarshalGCPEncryptionKey(object *GCPEncryptionKey, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPEncryptionKey(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPEncryptionKey writes a value of the 'GCP_encryption_key' type to the given stream. +func writeGCPEncryptionKey(object *GCPEncryptionKey, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kms_key_service_account") + stream.WriteString(object.kmsKeyServiceAccount) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key_location") + stream.WriteString(object.keyLocation) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key_name") + stream.WriteString(object.keyName) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key_ring") + stream.WriteString(object.keyRing) + } + stream.WriteObjectEnd() +} + +// UnmarshalGCPEncryptionKey reads a value of the 'GCP_encryption_key' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGCPEncryptionKey(source interface{}) (object *GCPEncryptionKey, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGCPEncryptionKey(iterator) + err = iterator.Error + return +} + +// readGCPEncryptionKey reads a value of the 'GCP_encryption_key' type from the given iterator. +func readGCPEncryptionKey(iterator *jsoniter.Iterator) *GCPEncryptionKey { + object := &GCPEncryptionKey{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kms_key_service_account": + value := iterator.ReadString() + object.kmsKeyServiceAccount = value + object.bitmap_ |= 1 + case "key_location": + value := iterator.ReadString() + object.keyLocation = value + object.bitmap_ |= 2 + case "key_name": + value := iterator.ReadString() + object.keyName = value + object.bitmap_ |= 4 + case "key_ring": + value := iterator.ReadString() + object.keyRing = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_flavour_builder.go b/clustersmgmt/v2alpha1/gcp_flavour_builder.go new file mode 100644 index 00000000..0360e6ff --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_flavour_builder.go @@ -0,0 +1,158 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPFlavourBuilder contains the data and logic needed to build 'GCP_flavour' objects. +// +// Specification for different classes of nodes inside a flavour. +type GCPFlavourBuilder struct { + bitmap_ uint32 + computeInstanceType string + infraInstanceType string + infraVolume *GCPVolumeBuilder + masterInstanceType string + masterVolume *GCPVolumeBuilder + workerVolume *GCPVolumeBuilder +} + +// NewGCPFlavour creates a new builder of 'GCP_flavour' objects. +func NewGCPFlavour() *GCPFlavourBuilder { + return &GCPFlavourBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GCPFlavourBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ComputeInstanceType sets the value of the 'compute_instance_type' attribute to the given value. +func (b *GCPFlavourBuilder) ComputeInstanceType(value string) *GCPFlavourBuilder { + b.computeInstanceType = value + b.bitmap_ |= 1 + return b +} + +// InfraInstanceType sets the value of the 'infra_instance_type' attribute to the given value. +func (b *GCPFlavourBuilder) InfraInstanceType(value string) *GCPFlavourBuilder { + b.infraInstanceType = value + b.bitmap_ |= 2 + return b +} + +// InfraVolume sets the value of the 'infra_volume' attribute to the given value. +// +// Holds settings for an GCP storage volume. +func (b *GCPFlavourBuilder) InfraVolume(value *GCPVolumeBuilder) *GCPFlavourBuilder { + b.infraVolume = value + if value != nil { + b.bitmap_ |= 4 + } else { + b.bitmap_ &^= 4 + } + return b +} + +// MasterInstanceType sets the value of the 'master_instance_type' attribute to the given value. +func (b *GCPFlavourBuilder) MasterInstanceType(value string) *GCPFlavourBuilder { + b.masterInstanceType = value + b.bitmap_ |= 8 + return b +} + +// MasterVolume sets the value of the 'master_volume' attribute to the given value. +// +// Holds settings for an GCP storage volume. +func (b *GCPFlavourBuilder) MasterVolume(value *GCPVolumeBuilder) *GCPFlavourBuilder { + b.masterVolume = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// WorkerVolume sets the value of the 'worker_volume' attribute to the given value. +// +// Holds settings for an GCP storage volume. +func (b *GCPFlavourBuilder) WorkerVolume(value *GCPVolumeBuilder) *GCPFlavourBuilder { + b.workerVolume = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GCPFlavourBuilder) Copy(object *GCPFlavour) *GCPFlavourBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.computeInstanceType = object.computeInstanceType + b.infraInstanceType = object.infraInstanceType + if object.infraVolume != nil { + b.infraVolume = NewGCPVolume().Copy(object.infraVolume) + } else { + b.infraVolume = nil + } + b.masterInstanceType = object.masterInstanceType + if object.masterVolume != nil { + b.masterVolume = NewGCPVolume().Copy(object.masterVolume) + } else { + b.masterVolume = nil + } + if object.workerVolume != nil { + b.workerVolume = NewGCPVolume().Copy(object.workerVolume) + } else { + b.workerVolume = nil + } + return b +} + +// Build creates a 'GCP_flavour' object using the configuration stored in the builder. +func (b *GCPFlavourBuilder) Build() (object *GCPFlavour, err error) { + object = new(GCPFlavour) + object.bitmap_ = b.bitmap_ + object.computeInstanceType = b.computeInstanceType + object.infraInstanceType = b.infraInstanceType + if b.infraVolume != nil { + object.infraVolume, err = b.infraVolume.Build() + if err != nil { + return + } + } + object.masterInstanceType = b.masterInstanceType + if b.masterVolume != nil { + object.masterVolume, err = b.masterVolume.Build() + if err != nil { + return + } + } + if b.workerVolume != nil { + object.workerVolume, err = b.workerVolume.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/gcp_flavour_list_builder.go b/clustersmgmt/v2alpha1/gcp_flavour_list_builder.go new file mode 100644 index 00000000..61b94eb8 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_flavour_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPFlavourListBuilder contains the data and logic needed to build +// 'GCP_flavour' objects. +type GCPFlavourListBuilder struct { + items []*GCPFlavourBuilder +} + +// NewGCPFlavourList creates a new builder of 'GCP_flavour' objects. +func NewGCPFlavourList() *GCPFlavourListBuilder { + return new(GCPFlavourListBuilder) +} + +// Items sets the items of the list. +func (b *GCPFlavourListBuilder) Items(values ...*GCPFlavourBuilder) *GCPFlavourListBuilder { + b.items = make([]*GCPFlavourBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GCPFlavourListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GCPFlavourListBuilder) Copy(list *GCPFlavourList) *GCPFlavourListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GCPFlavourBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGCPFlavour().Copy(v) + } + } + return b +} + +// Build creates a list of 'GCP_flavour' objects using the +// configuration stored in the builder. +func (b *GCPFlavourListBuilder) Build() (list *GCPFlavourList, err error) { + items := make([]*GCPFlavour, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GCPFlavourList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_flavour_list_type_json.go b/clustersmgmt/v2alpha1/gcp_flavour_list_type_json.go new file mode 100644 index 00000000..031fb5f1 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_flavour_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPFlavourList writes a list of values of the 'GCP_flavour' type to +// the given writer. +func MarshalGCPFlavourList(list []*GCPFlavour, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPFlavourList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPFlavourList writes a list of value of the 'GCP_flavour' type to +// the given stream. +func writeGCPFlavourList(list []*GCPFlavour, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGCPFlavour(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGCPFlavourList reads a list of values of the 'GCP_flavour' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGCPFlavourList(source interface{}) (items []*GCPFlavour, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGCPFlavourList(iterator) + err = iterator.Error + return +} + +// readGCPFlavourList reads list of values of the ”GCP_flavour' type from +// the given iterator. +func readGCPFlavourList(iterator *jsoniter.Iterator) []*GCPFlavour { + list := []*GCPFlavour{} + for iterator.ReadArray() { + item := readGCPFlavour(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_flavour_type.go b/clustersmgmt/v2alpha1/gcp_flavour_type.go new file mode 100644 index 00000000..469e60f3 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_flavour_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPFlavour represents the values of the 'GCP_flavour' type. +// +// Specification for different classes of nodes inside a flavour. +type GCPFlavour struct { + bitmap_ uint32 + computeInstanceType string + infraInstanceType string + infraVolume *GCPVolume + masterInstanceType string + masterVolume *GCPVolume + workerVolume *GCPVolume +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GCPFlavour) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ComputeInstanceType returns the value of the 'compute_instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP default instance type for the worker volume. +// +// User can be overridden specifying in the cluster itself a type for compute node. +func (o *GCPFlavour) ComputeInstanceType() string { + if o != nil && o.bitmap_&1 != 0 { + return o.computeInstanceType + } + return "" +} + +// GetComputeInstanceType returns the value of the 'compute_instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// GCP default instance type for the worker volume. +// +// User can be overridden specifying in the cluster itself a type for compute node. +func (o *GCPFlavour) GetComputeInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.computeInstanceType + } + return +} + +// InfraInstanceType returns the value of the 'infra_instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP default instance type for the infra volume. +func (o *GCPFlavour) InfraInstanceType() string { + if o != nil && o.bitmap_&2 != 0 { + return o.infraInstanceType + } + return "" +} + +// GetInfraInstanceType returns the value of the 'infra_instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// GCP default instance type for the infra volume. +func (o *GCPFlavour) GetInfraInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.infraInstanceType + } + return +} + +// InfraVolume returns the value of the 'infra_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Infra volume specification. +func (o *GCPFlavour) InfraVolume() *GCPVolume { + if o != nil && o.bitmap_&4 != 0 { + return o.infraVolume + } + return nil +} + +// GetInfraVolume returns the value of the 'infra_volume' attribute and +// a flag indicating if the attribute has a value. +// +// Infra volume specification. +func (o *GCPFlavour) GetInfraVolume() (value *GCPVolume, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.infraVolume + } + return +} + +// MasterInstanceType returns the value of the 'master_instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP default instance type for the master volume. +func (o *GCPFlavour) MasterInstanceType() string { + if o != nil && o.bitmap_&8 != 0 { + return o.masterInstanceType + } + return "" +} + +// GetMasterInstanceType returns the value of the 'master_instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// GCP default instance type for the master volume. +func (o *GCPFlavour) GetMasterInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.masterInstanceType + } + return +} + +// MasterVolume returns the value of the 'master_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Master volume specification. +func (o *GCPFlavour) MasterVolume() *GCPVolume { + if o != nil && o.bitmap_&16 != 0 { + return o.masterVolume + } + return nil +} + +// GetMasterVolume returns the value of the 'master_volume' attribute and +// a flag indicating if the attribute has a value. +// +// Master volume specification. +func (o *GCPFlavour) GetMasterVolume() (value *GCPVolume, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.masterVolume + } + return +} + +// WorkerVolume returns the value of the 'worker_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Worker volume specification. +func (o *GCPFlavour) WorkerVolume() *GCPVolume { + if o != nil && o.bitmap_&32 != 0 { + return o.workerVolume + } + return nil +} + +// GetWorkerVolume returns the value of the 'worker_volume' attribute and +// a flag indicating if the attribute has a value. +// +// Worker volume specification. +func (o *GCPFlavour) GetWorkerVolume() (value *GCPVolume, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.workerVolume + } + return +} + +// GCPFlavourListKind is the name of the type used to represent list of objects of +// type 'GCP_flavour'. +const GCPFlavourListKind = "GCPFlavourList" + +// GCPFlavourListLinkKind is the name of the type used to represent links to list +// of objects of type 'GCP_flavour'. +const GCPFlavourListLinkKind = "GCPFlavourListLink" + +// GCPFlavourNilKind is the name of the type used to nil lists of objects of +// type 'GCP_flavour'. +const GCPFlavourListNilKind = "GCPFlavourListNil" + +// GCPFlavourList is a list of values of the 'GCP_flavour' type. +type GCPFlavourList struct { + href string + link bool + items []*GCPFlavour +} + +// Len returns the length of the list. +func (l *GCPFlavourList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GCPFlavourList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GCPFlavourList) Get(i int) *GCPFlavour { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GCPFlavourList) Slice() []*GCPFlavour { + var slice []*GCPFlavour + if l == nil { + slice = make([]*GCPFlavour, 0) + } else { + slice = make([]*GCPFlavour, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GCPFlavourList) Each(f func(item *GCPFlavour) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GCPFlavourList) Range(f func(index int, item *GCPFlavour) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_flavour_type_json.go b/clustersmgmt/v2alpha1/gcp_flavour_type_json.go new file mode 100644 index 00000000..4133256d --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_flavour_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPFlavour writes a value of the 'GCP_flavour' type to the given writer. +func MarshalGCPFlavour(object *GCPFlavour, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPFlavour(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPFlavour writes a value of the 'GCP_flavour' type to the given stream. +func writeGCPFlavour(object *GCPFlavour, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute_instance_type") + stream.WriteString(object.computeInstanceType) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra_instance_type") + stream.WriteString(object.infraInstanceType) + count++ + } + present_ = object.bitmap_&4 != 0 && object.infraVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("infra_volume") + writeGCPVolume(object.infraVolume, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master_instance_type") + stream.WriteString(object.masterInstanceType) + count++ + } + present_ = object.bitmap_&16 != 0 && object.masterVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master_volume") + writeGCPVolume(object.masterVolume, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.workerVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("worker_volume") + writeGCPVolume(object.workerVolume, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalGCPFlavour reads a value of the 'GCP_flavour' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGCPFlavour(source interface{}) (object *GCPFlavour, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGCPFlavour(iterator) + err = iterator.Error + return +} + +// readGCPFlavour reads a value of the 'GCP_flavour' type from the given iterator. +func readGCPFlavour(iterator *jsoniter.Iterator) *GCPFlavour { + object := &GCPFlavour{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "compute_instance_type": + value := iterator.ReadString() + object.computeInstanceType = value + object.bitmap_ |= 1 + case "infra_instance_type": + value := iterator.ReadString() + object.infraInstanceType = value + object.bitmap_ |= 2 + case "infra_volume": + value := readGCPVolume(iterator) + object.infraVolume = value + object.bitmap_ |= 4 + case "master_instance_type": + value := iterator.ReadString() + object.masterInstanceType = value + object.bitmap_ |= 8 + case "master_volume": + value := readGCPVolume(iterator) + object.masterVolume = value + object.bitmap_ |= 16 + case "worker_volume": + value := readGCPVolume(iterator) + object.workerVolume = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_image_override_builder.go b/clustersmgmt/v2alpha1/gcp_image_override_builder.go new file mode 100644 index 00000000..4066bf8a --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_image_override_builder.go @@ -0,0 +1,149 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPImageOverrideBuilder contains the data and logic needed to build 'GCP_image_override' objects. +// +// GcpImageOverride specifies what a GCP VM Image should be used for a particular product and billing model +type GCPImageOverrideBuilder struct { + bitmap_ uint32 + id string + href string + billingModel *BillingModelItemBuilder + imageID string + product *ProductBuilder + projectID string +} + +// NewGCPImageOverride creates a new builder of 'GCP_image_override' objects. +func NewGCPImageOverride() *GCPImageOverrideBuilder { + return &GCPImageOverrideBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *GCPImageOverrideBuilder) Link(value bool) *GCPImageOverrideBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *GCPImageOverrideBuilder) ID(value string) *GCPImageOverrideBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *GCPImageOverrideBuilder) HREF(value string) *GCPImageOverrideBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GCPImageOverrideBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// BillingModel sets the value of the 'billing_model' attribute to the given value. +// +// BillingModelItem represents a billing model +func (b *GCPImageOverrideBuilder) BillingModel(value *BillingModelItemBuilder) *GCPImageOverrideBuilder { + b.billingModel = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// ImageID sets the value of the 'image_ID' attribute to the given value. +func (b *GCPImageOverrideBuilder) ImageID(value string) *GCPImageOverrideBuilder { + b.imageID = value + b.bitmap_ |= 16 + return b +} + +// Product sets the value of the 'product' attribute to the given value. +// +// Representation of an product that can be selected as a cluster type. +func (b *GCPImageOverrideBuilder) Product(value *ProductBuilder) *GCPImageOverrideBuilder { + b.product = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// ProjectID sets the value of the 'project_ID' attribute to the given value. +func (b *GCPImageOverrideBuilder) ProjectID(value string) *GCPImageOverrideBuilder { + b.projectID = value + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GCPImageOverrideBuilder) Copy(object *GCPImageOverride) *GCPImageOverrideBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.billingModel != nil { + b.billingModel = NewBillingModelItem().Copy(object.billingModel) + } else { + b.billingModel = nil + } + b.imageID = object.imageID + if object.product != nil { + b.product = NewProduct().Copy(object.product) + } else { + b.product = nil + } + b.projectID = object.projectID + return b +} + +// Build creates a 'GCP_image_override' object using the configuration stored in the builder. +func (b *GCPImageOverrideBuilder) Build() (object *GCPImageOverride, err error) { + object = new(GCPImageOverride) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.billingModel != nil { + object.billingModel, err = b.billingModel.Build() + if err != nil { + return + } + } + object.imageID = b.imageID + if b.product != nil { + object.product, err = b.product.Build() + if err != nil { + return + } + } + object.projectID = b.projectID + return +} diff --git a/clustersmgmt/v2alpha1/gcp_image_override_list_builder.go b/clustersmgmt/v2alpha1/gcp_image_override_list_builder.go new file mode 100644 index 00000000..c20dd654 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_image_override_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPImageOverrideListBuilder contains the data and logic needed to build +// 'GCP_image_override' objects. +type GCPImageOverrideListBuilder struct { + items []*GCPImageOverrideBuilder +} + +// NewGCPImageOverrideList creates a new builder of 'GCP_image_override' objects. +func NewGCPImageOverrideList() *GCPImageOverrideListBuilder { + return new(GCPImageOverrideListBuilder) +} + +// Items sets the items of the list. +func (b *GCPImageOverrideListBuilder) Items(values ...*GCPImageOverrideBuilder) *GCPImageOverrideListBuilder { + b.items = make([]*GCPImageOverrideBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GCPImageOverrideListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GCPImageOverrideListBuilder) Copy(list *GCPImageOverrideList) *GCPImageOverrideListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GCPImageOverrideBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGCPImageOverride().Copy(v) + } + } + return b +} + +// Build creates a list of 'GCP_image_override' objects using the +// configuration stored in the builder. +func (b *GCPImageOverrideListBuilder) Build() (list *GCPImageOverrideList, err error) { + items := make([]*GCPImageOverride, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GCPImageOverrideList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_image_override_list_type_json.go b/clustersmgmt/v2alpha1/gcp_image_override_list_type_json.go new file mode 100644 index 00000000..859b5364 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_image_override_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPImageOverrideList writes a list of values of the 'GCP_image_override' type to +// the given writer. +func MarshalGCPImageOverrideList(list []*GCPImageOverride, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPImageOverrideList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPImageOverrideList writes a list of value of the 'GCP_image_override' type to +// the given stream. +func writeGCPImageOverrideList(list []*GCPImageOverride, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGCPImageOverride(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGCPImageOverrideList reads a list of values of the 'GCP_image_override' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGCPImageOverrideList(source interface{}) (items []*GCPImageOverride, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGCPImageOverrideList(iterator) + err = iterator.Error + return +} + +// readGCPImageOverrideList reads list of values of the ”GCP_image_override' type from +// the given iterator. +func readGCPImageOverrideList(iterator *jsoniter.Iterator) []*GCPImageOverride { + list := []*GCPImageOverride{} + for iterator.ReadArray() { + item := readGCPImageOverride(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_image_override_type.go b/clustersmgmt/v2alpha1/gcp_image_override_type.go new file mode 100644 index 00000000..08f7a5c6 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_image_override_type.go @@ -0,0 +1,314 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPImageOverrideKind is the name of the type used to represent objects +// of type 'GCP_image_override'. +const GCPImageOverrideKind = "GCPImageOverride" + +// GCPImageOverrideLinkKind is the name of the type used to represent links +// to objects of type 'GCP_image_override'. +const GCPImageOverrideLinkKind = "GCPImageOverrideLink" + +// GCPImageOverrideNilKind is the name of the type used to nil references +// to objects of type 'GCP_image_override'. +const GCPImageOverrideNilKind = "GCPImageOverrideNil" + +// GCPImageOverride represents the values of the 'GCP_image_override' type. +// +// GcpImageOverride specifies what a GCP VM Image should be used for a particular product and billing model +type GCPImageOverride struct { + bitmap_ uint32 + id string + href string + billingModel *BillingModelItem + imageID string + product *Product + projectID string +} + +// Kind returns the name of the type of the object. +func (o *GCPImageOverride) Kind() string { + if o == nil { + return GCPImageOverrideNilKind + } + if o.bitmap_&1 != 0 { + return GCPImageOverrideLinkKind + } + return GCPImageOverrideKind +} + +// Link returns true iif this is a link. +func (o *GCPImageOverride) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *GCPImageOverride) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *GCPImageOverride) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *GCPImageOverride) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *GCPImageOverride) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GCPImageOverride) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// BillingModel returns the value of the 'billing_model' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the billing model. +func (o *GCPImageOverride) BillingModel() *BillingModelItem { + if o != nil && o.bitmap_&8 != 0 { + return o.billingModel + } + return nil +} + +// GetBillingModel returns the value of the 'billing_model' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the billing model. +func (o *GCPImageOverride) GetBillingModel() (value *BillingModelItem, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.billingModel + } + return +} + +// ImageID returns the value of the 'image_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ImageID is the id of the Google Cloud Platform image. +func (o *GCPImageOverride) ImageID() string { + if o != nil && o.bitmap_&16 != 0 { + return o.imageID + } + return "" +} + +// GetImageID returns the value of the 'image_ID' attribute and +// a flag indicating if the attribute has a value. +// +// ImageID is the id of the Google Cloud Platform image. +func (o *GCPImageOverride) GetImageID() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.imageID + } + return +} + +// Product returns the value of the 'product' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the product type. +func (o *GCPImageOverride) Product() *Product { + if o != nil && o.bitmap_&32 != 0 { + return o.product + } + return nil +} + +// GetProduct returns the value of the 'product' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the product type. +func (o *GCPImageOverride) GetProduct() (value *Product, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.product + } + return +} + +// ProjectID returns the value of the 'project_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ProjectID is the id of the Google Cloud Platform project that hosts the image. +func (o *GCPImageOverride) ProjectID() string { + if o != nil && o.bitmap_&64 != 0 { + return o.projectID + } + return "" +} + +// GetProjectID returns the value of the 'project_ID' attribute and +// a flag indicating if the attribute has a value. +// +// ProjectID is the id of the Google Cloud Platform project that hosts the image. +func (o *GCPImageOverride) GetProjectID() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.projectID + } + return +} + +// GCPImageOverrideListKind is the name of the type used to represent list of objects of +// type 'GCP_image_override'. +const GCPImageOverrideListKind = "GCPImageOverrideList" + +// GCPImageOverrideListLinkKind is the name of the type used to represent links to list +// of objects of type 'GCP_image_override'. +const GCPImageOverrideListLinkKind = "GCPImageOverrideListLink" + +// GCPImageOverrideNilKind is the name of the type used to nil lists of objects of +// type 'GCP_image_override'. +const GCPImageOverrideListNilKind = "GCPImageOverrideListNil" + +// GCPImageOverrideList is a list of values of the 'GCP_image_override' type. +type GCPImageOverrideList struct { + href string + link bool + items []*GCPImageOverride +} + +// Kind returns the name of the type of the object. +func (l *GCPImageOverrideList) Kind() string { + if l == nil { + return GCPImageOverrideListNilKind + } + if l.link { + return GCPImageOverrideListLinkKind + } + return GCPImageOverrideListKind +} + +// Link returns true iif this is a link. +func (l *GCPImageOverrideList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *GCPImageOverrideList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *GCPImageOverrideList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *GCPImageOverrideList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GCPImageOverrideList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GCPImageOverrideList) Get(i int) *GCPImageOverride { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GCPImageOverrideList) Slice() []*GCPImageOverride { + var slice []*GCPImageOverride + if l == nil { + slice = make([]*GCPImageOverride, 0) + } else { + slice = make([]*GCPImageOverride, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GCPImageOverrideList) Each(f func(item *GCPImageOverride) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GCPImageOverrideList) Range(f func(index int, item *GCPImageOverride) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_image_override_type_json.go b/clustersmgmt/v2alpha1/gcp_image_override_type_json.go new file mode 100644 index 00000000..e67a6eb6 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_image_override_type_json.go @@ -0,0 +1,159 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPImageOverride writes a value of the 'GCP_image_override' type to the given writer. +func MarshalGCPImageOverride(object *GCPImageOverride, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPImageOverride(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPImageOverride writes a value of the 'GCP_image_override' type to the given stream. +func writeGCPImageOverride(object *GCPImageOverride, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(GCPImageOverrideLinkKind) + } else { + stream.WriteString(GCPImageOverrideKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.billingModel != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("billing_model") + writeBillingModelItem(object.billingModel, stream) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("image_id") + stream.WriteString(object.imageID) + count++ + } + present_ = object.bitmap_&32 != 0 && object.product != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("product") + writeProduct(object.product, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("project_id") + stream.WriteString(object.projectID) + } + stream.WriteObjectEnd() +} + +// UnmarshalGCPImageOverride reads a value of the 'GCP_image_override' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGCPImageOverride(source interface{}) (object *GCPImageOverride, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGCPImageOverride(iterator) + err = iterator.Error + return +} + +// readGCPImageOverride reads a value of the 'GCP_image_override' type from the given iterator. +func readGCPImageOverride(iterator *jsoniter.Iterator) *GCPImageOverride { + object := &GCPImageOverride{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == GCPImageOverrideLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "billing_model": + value := readBillingModelItem(iterator) + object.billingModel = value + object.bitmap_ |= 8 + case "image_id": + value := iterator.ReadString() + object.imageID = value + object.bitmap_ |= 16 + case "product": + value := readProduct(iterator) + object.product = value + object.bitmap_ |= 32 + case "project_id": + value := iterator.ReadString() + object.projectID = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_inquiries_client.go b/clustersmgmt/v2alpha1/gcp_inquiries_client.go new file mode 100644 index 00000000..703401e2 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_inquiries_client.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "net/http" + "path" +) + +// GCPInquiriesClient is the client of the 'GCP_inquiries' resource. +// +// Manages the collection of gcp inquiries. +type GCPInquiriesClient struct { + transport http.RoundTripper + path string +} + +// NewGCPInquiriesClient creates a new client for the 'GCP_inquiries' +// resource using the given transport to send the requests and receive the +// responses. +func NewGCPInquiriesClient(transport http.RoundTripper, path string) *GCPInquiriesClient { + return &GCPInquiriesClient{ + transport: transport, + path: path, + } +} + +// EncryptionKeys returns the target 'encryption_keys_inquiry' resource. +// +// Reference to the resource that manages a collection of encryption keys. +func (c *GCPInquiriesClient) EncryptionKeys() *EncryptionKeysInquiryClient { + return NewEncryptionKeysInquiryClient( + c.transport, + path.Join(c.path, "encryption_keys"), + ) +} + +// KeyRings returns the target 'key_rings_inquiry' resource. +// +// Reference to the resource that manages a collection of key rings. +func (c *GCPInquiriesClient) KeyRings() *KeyRingsInquiryClient { + return NewKeyRingsInquiryClient( + c.transport, + path.Join(c.path, "key_rings"), + ) +} + +// MachineTypes returns the target 'GCP_region_machine_types_inquiry' resource. +// +// Reference to the resource that manages gcp machine types by regions. +func (c *GCPInquiriesClient) MachineTypes() *GCPRegionMachineTypesInquiryClient { + return NewGCPRegionMachineTypesInquiryClient( + c.transport, + path.Join(c.path, "machine_types"), + ) +} + +// Regions returns the target 'available_regions_inquiry' resource. +// +// Reference to the resource that manages a collection of regions. +func (c *GCPInquiriesClient) Regions() *AvailableRegionsInquiryClient { + return NewAvailableRegionsInquiryClient( + c.transport, + path.Join(c.path, "regions"), + ) +} + +// Vpcs returns the target 'vpcs_inquiry' resource. +// +// Reference to the resource that manages a collection of vpcs. +func (c *GCPInquiriesClient) Vpcs() *VpcsInquiryClient { + return NewVpcsInquiryClient( + c.transport, + path.Join(c.path, "vpcs"), + ) +} diff --git a/clustersmgmt/v2alpha1/gcp_inquiries_resource_json.go b/clustersmgmt/v2alpha1/gcp_inquiries_resource_json.go new file mode 100644 index 00000000..45f0dd4e --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_inquiries_resource_json.go @@ -0,0 +1,20 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 diff --git a/clustersmgmt/v2alpha1/gcp_list_builder.go b/clustersmgmt/v2alpha1/gcp_list_builder.go new file mode 100644 index 00000000..fcdf74a3 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPListBuilder contains the data and logic needed to build +// 'GCP' objects. +type GCPListBuilder struct { + items []*GCPBuilder +} + +// NewGCPList creates a new builder of 'GCP' objects. +func NewGCPList() *GCPListBuilder { + return new(GCPListBuilder) +} + +// Items sets the items of the list. +func (b *GCPListBuilder) Items(values ...*GCPBuilder) *GCPListBuilder { + b.items = make([]*GCPBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GCPListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GCPListBuilder) Copy(list *GCPList) *GCPListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GCPBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGCP().Copy(v) + } + } + return b +} + +// Build creates a list of 'GCP' objects using the +// configuration stored in the builder. +func (b *GCPListBuilder) Build() (list *GCPList, err error) { + items := make([]*GCP, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GCPList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_list_type_json.go b/clustersmgmt/v2alpha1/gcp_list_type_json.go new file mode 100644 index 00000000..33baf0d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPList writes a list of values of the 'GCP' type to +// the given writer. +func MarshalGCPList(list []*GCP, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPList writes a list of value of the 'GCP' type to +// the given stream. +func writeGCPList(list []*GCP, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGCP(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGCPList reads a list of values of the 'GCP' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGCPList(source interface{}) (items []*GCP, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGCPList(iterator) + err = iterator.Error + return +} + +// readGCPList reads list of values of the ”GCP' type from +// the given iterator. +func readGCPList(iterator *jsoniter.Iterator) []*GCP { + list := []*GCP{} + for iterator.ReadArray() { + item := readGCP(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_network_builder.go b/clustersmgmt/v2alpha1/gcp_network_builder.go new file mode 100644 index 00000000..d431f3cd --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_network_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPNetworkBuilder contains the data and logic needed to build 'GCP_network' objects. +// +// GCP Network configuration of a cluster. +type GCPNetworkBuilder struct { + bitmap_ uint32 + vpcName string + vpcProjectID string + computeSubnet string + controlPlaneSubnet string +} + +// NewGCPNetwork creates a new builder of 'GCP_network' objects. +func NewGCPNetwork() *GCPNetworkBuilder { + return &GCPNetworkBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GCPNetworkBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// VPCName sets the value of the 'VPC_name' attribute to the given value. +func (b *GCPNetworkBuilder) VPCName(value string) *GCPNetworkBuilder { + b.vpcName = value + b.bitmap_ |= 1 + return b +} + +// VPCProjectID sets the value of the 'VPC_project_ID' attribute to the given value. +func (b *GCPNetworkBuilder) VPCProjectID(value string) *GCPNetworkBuilder { + b.vpcProjectID = value + b.bitmap_ |= 2 + return b +} + +// ComputeSubnet sets the value of the 'compute_subnet' attribute to the given value. +func (b *GCPNetworkBuilder) ComputeSubnet(value string) *GCPNetworkBuilder { + b.computeSubnet = value + b.bitmap_ |= 4 + return b +} + +// ControlPlaneSubnet sets the value of the 'control_plane_subnet' attribute to the given value. +func (b *GCPNetworkBuilder) ControlPlaneSubnet(value string) *GCPNetworkBuilder { + b.controlPlaneSubnet = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GCPNetworkBuilder) Copy(object *GCPNetwork) *GCPNetworkBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.vpcName = object.vpcName + b.vpcProjectID = object.vpcProjectID + b.computeSubnet = object.computeSubnet + b.controlPlaneSubnet = object.controlPlaneSubnet + return b +} + +// Build creates a 'GCP_network' object using the configuration stored in the builder. +func (b *GCPNetworkBuilder) Build() (object *GCPNetwork, err error) { + object = new(GCPNetwork) + object.bitmap_ = b.bitmap_ + object.vpcName = b.vpcName + object.vpcProjectID = b.vpcProjectID + object.computeSubnet = b.computeSubnet + object.controlPlaneSubnet = b.controlPlaneSubnet + return +} diff --git a/clustersmgmt/v2alpha1/gcp_network_list_builder.go b/clustersmgmt/v2alpha1/gcp_network_list_builder.go new file mode 100644 index 00000000..81a65c06 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_network_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPNetworkListBuilder contains the data and logic needed to build +// 'GCP_network' objects. +type GCPNetworkListBuilder struct { + items []*GCPNetworkBuilder +} + +// NewGCPNetworkList creates a new builder of 'GCP_network' objects. +func NewGCPNetworkList() *GCPNetworkListBuilder { + return new(GCPNetworkListBuilder) +} + +// Items sets the items of the list. +func (b *GCPNetworkListBuilder) Items(values ...*GCPNetworkBuilder) *GCPNetworkListBuilder { + b.items = make([]*GCPNetworkBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GCPNetworkListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GCPNetworkListBuilder) Copy(list *GCPNetworkList) *GCPNetworkListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GCPNetworkBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGCPNetwork().Copy(v) + } + } + return b +} + +// Build creates a list of 'GCP_network' objects using the +// configuration stored in the builder. +func (b *GCPNetworkListBuilder) Build() (list *GCPNetworkList, err error) { + items := make([]*GCPNetwork, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GCPNetworkList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_network_list_type_json.go b/clustersmgmt/v2alpha1/gcp_network_list_type_json.go new file mode 100644 index 00000000..bb56cd32 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_network_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPNetworkList writes a list of values of the 'GCP_network' type to +// the given writer. +func MarshalGCPNetworkList(list []*GCPNetwork, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPNetworkList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPNetworkList writes a list of value of the 'GCP_network' type to +// the given stream. +func writeGCPNetworkList(list []*GCPNetwork, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGCPNetwork(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGCPNetworkList reads a list of values of the 'GCP_network' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGCPNetworkList(source interface{}) (items []*GCPNetwork, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGCPNetworkList(iterator) + err = iterator.Error + return +} + +// readGCPNetworkList reads list of values of the ”GCP_network' type from +// the given iterator. +func readGCPNetworkList(iterator *jsoniter.Iterator) []*GCPNetwork { + list := []*GCPNetwork{} + for iterator.ReadArray() { + item := readGCPNetwork(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_network_type.go b/clustersmgmt/v2alpha1/gcp_network_type.go new file mode 100644 index 00000000..f8482f98 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_network_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPNetwork represents the values of the 'GCP_network' type. +// +// GCP Network configuration of a cluster. +type GCPNetwork struct { + bitmap_ uint32 + vpcName string + vpcProjectID string + computeSubnet string + controlPlaneSubnet string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GCPNetwork) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// VPCName returns the value of the 'VPC_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// VPC mame used by the cluster. +func (o *GCPNetwork) VPCName() string { + if o != nil && o.bitmap_&1 != 0 { + return o.vpcName + } + return "" +} + +// GetVPCName returns the value of the 'VPC_name' attribute and +// a flag indicating if the attribute has a value. +// +// VPC mame used by the cluster. +func (o *GCPNetwork) GetVPCName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.vpcName + } + return +} + +// VPCProjectID returns the value of the 'VPC_project_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The name of the host project where the shared VPC exists. +func (o *GCPNetwork) VPCProjectID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.vpcProjectID + } + return "" +} + +// GetVPCProjectID returns the value of the 'VPC_project_ID' attribute and +// a flag indicating if the attribute has a value. +// +// The name of the host project where the shared VPC exists. +func (o *GCPNetwork) GetVPCProjectID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.vpcProjectID + } + return +} + +// ComputeSubnet returns the value of the 'compute_subnet' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Compute subnet used by the cluster. +func (o *GCPNetwork) ComputeSubnet() string { + if o != nil && o.bitmap_&4 != 0 { + return o.computeSubnet + } + return "" +} + +// GetComputeSubnet returns the value of the 'compute_subnet' attribute and +// a flag indicating if the attribute has a value. +// +// Compute subnet used by the cluster. +func (o *GCPNetwork) GetComputeSubnet() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.computeSubnet + } + return +} + +// ControlPlaneSubnet returns the value of the 'control_plane_subnet' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Control plane subnet used by the cluster. +func (o *GCPNetwork) ControlPlaneSubnet() string { + if o != nil && o.bitmap_&8 != 0 { + return o.controlPlaneSubnet + } + return "" +} + +// GetControlPlaneSubnet returns the value of the 'control_plane_subnet' attribute and +// a flag indicating if the attribute has a value. +// +// Control plane subnet used by the cluster. +func (o *GCPNetwork) GetControlPlaneSubnet() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.controlPlaneSubnet + } + return +} + +// GCPNetworkListKind is the name of the type used to represent list of objects of +// type 'GCP_network'. +const GCPNetworkListKind = "GCPNetworkList" + +// GCPNetworkListLinkKind is the name of the type used to represent links to list +// of objects of type 'GCP_network'. +const GCPNetworkListLinkKind = "GCPNetworkListLink" + +// GCPNetworkNilKind is the name of the type used to nil lists of objects of +// type 'GCP_network'. +const GCPNetworkListNilKind = "GCPNetworkListNil" + +// GCPNetworkList is a list of values of the 'GCP_network' type. +type GCPNetworkList struct { + href string + link bool + items []*GCPNetwork +} + +// Len returns the length of the list. +func (l *GCPNetworkList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GCPNetworkList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GCPNetworkList) Get(i int) *GCPNetwork { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GCPNetworkList) Slice() []*GCPNetwork { + var slice []*GCPNetwork + if l == nil { + slice = make([]*GCPNetwork, 0) + } else { + slice = make([]*GCPNetwork, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GCPNetworkList) Each(f func(item *GCPNetwork) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GCPNetworkList) Range(f func(index int, item *GCPNetwork) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_network_type_json.go b/clustersmgmt/v2alpha1/gcp_network_type_json.go new file mode 100644 index 00000000..1d5de7d2 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_network_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPNetwork writes a value of the 'GCP_network' type to the given writer. +func MarshalGCPNetwork(object *GCPNetwork, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPNetwork(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPNetwork writes a value of the 'GCP_network' type to the given stream. +func writeGCPNetwork(object *GCPNetwork, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("vpc_name") + stream.WriteString(object.vpcName) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("vpc_project_id") + stream.WriteString(object.vpcProjectID) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("compute_subnet") + stream.WriteString(object.computeSubnet) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("control_plane_subnet") + stream.WriteString(object.controlPlaneSubnet) + } + stream.WriteObjectEnd() +} + +// UnmarshalGCPNetwork reads a value of the 'GCP_network' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGCPNetwork(source interface{}) (object *GCPNetwork, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGCPNetwork(iterator) + err = iterator.Error + return +} + +// readGCPNetwork reads a value of the 'GCP_network' type from the given iterator. +func readGCPNetwork(iterator *jsoniter.Iterator) *GCPNetwork { + object := &GCPNetwork{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "vpc_name": + value := iterator.ReadString() + object.vpcName = value + object.bitmap_ |= 1 + case "vpc_project_id": + value := iterator.ReadString() + object.vpcProjectID = value + object.bitmap_ |= 2 + case "compute_subnet": + value := iterator.ReadString() + object.computeSubnet = value + object.bitmap_ |= 4 + case "control_plane_subnet": + value := iterator.ReadString() + object.controlPlaneSubnet = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_region_machine_types_inquiry_client.go b/clustersmgmt/v2alpha1/gcp_region_machine_types_inquiry_client.go new file mode 100644 index 00000000..4b8486ee --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_region_machine_types_inquiry_client.go @@ -0,0 +1,304 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// GCPRegionMachineTypesInquiryClient is the client of the 'GCP_region_machine_types_inquiry' resource. +// +// Manages machine types in region inquiry. +type GCPRegionMachineTypesInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewGCPRegionMachineTypesInquiryClient creates a new client for the 'GCP_region_machine_types_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewGCPRegionMachineTypesInquiryClient(transport http.RoundTripper, path string) *GCPRegionMachineTypesInquiryClient { + return &GCPRegionMachineTypesInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of machine types in the provided region. +func (c *GCPRegionMachineTypesInquiryClient) Search() *GCPRegionMachineTypesInquirySearchRequest { + return &GCPRegionMachineTypesInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// GCPRegionMachineTypesInquirySearchRequest is the request for the 'search' method. +type GCPRegionMachineTypesInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *GCPRegionMachineTypesInquirySearchRequest) Parameter(name string, value interface{}) *GCPRegionMachineTypesInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *GCPRegionMachineTypesInquirySearchRequest) Header(name string, value interface{}) *GCPRegionMachineTypesInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *GCPRegionMachineTypesInquirySearchRequest) Impersonate(user string) *GCPRegionMachineTypesInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry +func (r *GCPRegionMachineTypesInquirySearchRequest) Body(value *CloudProviderData) *GCPRegionMachineTypesInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *GCPRegionMachineTypesInquirySearchRequest) Page(value int) *GCPRegionMachineTypesInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *GCPRegionMachineTypesInquirySearchRequest) Size(value int) *GCPRegionMachineTypesInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *GCPRegionMachineTypesInquirySearchRequest) Send() (result *GCPRegionMachineTypesInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *GCPRegionMachineTypesInquirySearchRequest) SendContext(ctx context.Context) (result *GCPRegionMachineTypesInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeGCPRegionMachineTypesInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &GCPRegionMachineTypesInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readGCPRegionMachineTypesInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// GCPRegionMachineTypesInquirySearchResponse is the response for the 'search' method. +type GCPRegionMachineTypesInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + items *MachineTypeList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *GCPRegionMachineTypesInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *GCPRegionMachineTypesInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *GCPRegionMachineTypesInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of machine types. +func (r *GCPRegionMachineTypesInquirySearchResponse) Items() *MachineTypeList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of machine types. +func (r *GCPRegionMachineTypesInquirySearchResponse) GetItems() (value *MachineTypeList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *GCPRegionMachineTypesInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *GCPRegionMachineTypesInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *GCPRegionMachineTypesInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *GCPRegionMachineTypesInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *GCPRegionMachineTypesInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *GCPRegionMachineTypesInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/gcp_region_machine_types_inquiry_resource_json.go b/clustersmgmt/v2alpha1/gcp_region_machine_types_inquiry_resource_json.go new file mode 100644 index 00000000..4fa1cffe --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_region_machine_types_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeGCPRegionMachineTypesInquirySearchRequest(request *GCPRegionMachineTypesInquirySearchRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readGCPRegionMachineTypesInquirySearchResponse(response *GCPRegionMachineTypesInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readMachineTypeList(iterator) + response.items = &MachineTypeList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/gcp_security_builder.go b/clustersmgmt/v2alpha1/gcp_security_builder.go new file mode 100644 index 00000000..94f9fbce --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_security_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GcpSecurityBuilder contains the data and logic needed to build 'gcp_security' objects. +// +// Google cloud platform security settings of a cluster. +type GcpSecurityBuilder struct { + bitmap_ uint32 + secureBoot bool +} + +// NewGcpSecurity creates a new builder of 'gcp_security' objects. +func NewGcpSecurity() *GcpSecurityBuilder { + return &GcpSecurityBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GcpSecurityBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// SecureBoot sets the value of the 'secure_boot' attribute to the given value. +func (b *GcpSecurityBuilder) SecureBoot(value bool) *GcpSecurityBuilder { + b.secureBoot = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GcpSecurityBuilder) Copy(object *GcpSecurity) *GcpSecurityBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.secureBoot = object.secureBoot + return b +} + +// Build creates a 'gcp_security' object using the configuration stored in the builder. +func (b *GcpSecurityBuilder) Build() (object *GcpSecurity, err error) { + object = new(GcpSecurity) + object.bitmap_ = b.bitmap_ + object.secureBoot = b.secureBoot + return +} diff --git a/clustersmgmt/v2alpha1/gcp_security_list_builder.go b/clustersmgmt/v2alpha1/gcp_security_list_builder.go new file mode 100644 index 00000000..b6c912d5 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_security_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GcpSecurityListBuilder contains the data and logic needed to build +// 'gcp_security' objects. +type GcpSecurityListBuilder struct { + items []*GcpSecurityBuilder +} + +// NewGcpSecurityList creates a new builder of 'gcp_security' objects. +func NewGcpSecurityList() *GcpSecurityListBuilder { + return new(GcpSecurityListBuilder) +} + +// Items sets the items of the list. +func (b *GcpSecurityListBuilder) Items(values ...*GcpSecurityBuilder) *GcpSecurityListBuilder { + b.items = make([]*GcpSecurityBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GcpSecurityListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GcpSecurityListBuilder) Copy(list *GcpSecurityList) *GcpSecurityListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GcpSecurityBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGcpSecurity().Copy(v) + } + } + return b +} + +// Build creates a list of 'gcp_security' objects using the +// configuration stored in the builder. +func (b *GcpSecurityListBuilder) Build() (list *GcpSecurityList, err error) { + items := make([]*GcpSecurity, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GcpSecurityList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_security_list_type_json.go b/clustersmgmt/v2alpha1/gcp_security_list_type_json.go new file mode 100644 index 00000000..ebb0f169 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_security_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGcpSecurityList writes a list of values of the 'gcp_security' type to +// the given writer. +func MarshalGcpSecurityList(list []*GcpSecurity, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGcpSecurityList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGcpSecurityList writes a list of value of the 'gcp_security' type to +// the given stream. +func writeGcpSecurityList(list []*GcpSecurity, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGcpSecurity(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGcpSecurityList reads a list of values of the 'gcp_security' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGcpSecurityList(source interface{}) (items []*GcpSecurity, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGcpSecurityList(iterator) + err = iterator.Error + return +} + +// readGcpSecurityList reads list of values of the ”gcp_security' type from +// the given iterator. +func readGcpSecurityList(iterator *jsoniter.Iterator) []*GcpSecurity { + list := []*GcpSecurity{} + for iterator.ReadArray() { + item := readGcpSecurity(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_security_type.go b/clustersmgmt/v2alpha1/gcp_security_type.go new file mode 100644 index 00000000..a06592de --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_security_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GcpSecurity represents the values of the 'gcp_security' type. +// +// Google cloud platform security settings of a cluster. +type GcpSecurity struct { + bitmap_ uint32 + secureBoot bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GcpSecurity) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// SecureBoot returns the value of the 'secure_boot' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Determines if Shielded VM feature "Secure Boot" should be set for the nodes of the cluster. +func (o *GcpSecurity) SecureBoot() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.secureBoot + } + return false +} + +// GetSecureBoot returns the value of the 'secure_boot' attribute and +// a flag indicating if the attribute has a value. +// +// Determines if Shielded VM feature "Secure Boot" should be set for the nodes of the cluster. +func (o *GcpSecurity) GetSecureBoot() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.secureBoot + } + return +} + +// GcpSecurityListKind is the name of the type used to represent list of objects of +// type 'gcp_security'. +const GcpSecurityListKind = "GcpSecurityList" + +// GcpSecurityListLinkKind is the name of the type used to represent links to list +// of objects of type 'gcp_security'. +const GcpSecurityListLinkKind = "GcpSecurityListLink" + +// GcpSecurityNilKind is the name of the type used to nil lists of objects of +// type 'gcp_security'. +const GcpSecurityListNilKind = "GcpSecurityListNil" + +// GcpSecurityList is a list of values of the 'gcp_security' type. +type GcpSecurityList struct { + href string + link bool + items []*GcpSecurity +} + +// Len returns the length of the list. +func (l *GcpSecurityList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GcpSecurityList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GcpSecurityList) Get(i int) *GcpSecurity { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GcpSecurityList) Slice() []*GcpSecurity { + var slice []*GcpSecurity + if l == nil { + slice = make([]*GcpSecurity, 0) + } else { + slice = make([]*GcpSecurity, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GcpSecurityList) Each(f func(item *GcpSecurity) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GcpSecurityList) Range(f func(index int, item *GcpSecurity) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_security_type_json.go b/clustersmgmt/v2alpha1/gcp_security_type_json.go new file mode 100644 index 00000000..7ae4b822 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_security_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGcpSecurity writes a value of the 'gcp_security' type to the given writer. +func MarshalGcpSecurity(object *GcpSecurity, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGcpSecurity(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGcpSecurity writes a value of the 'gcp_security' type to the given stream. +func writeGcpSecurity(object *GcpSecurity, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("secure_boot") + stream.WriteBool(object.secureBoot) + } + stream.WriteObjectEnd() +} + +// UnmarshalGcpSecurity reads a value of the 'gcp_security' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGcpSecurity(source interface{}) (object *GcpSecurity, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGcpSecurity(iterator) + err = iterator.Error + return +} + +// readGcpSecurity reads a value of the 'gcp_security' type from the given iterator. +func readGcpSecurity(iterator *jsoniter.Iterator) *GcpSecurity { + object := &GcpSecurity{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "secure_boot": + value := iterator.ReadBool() + object.secureBoot = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_type.go b/clustersmgmt/v2alpha1/gcp_type.go new file mode 100644 index 00000000..8a04ff1d --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_type.go @@ -0,0 +1,406 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCP represents the values of the 'GCP' type. +// +// Google cloud platform settings of a cluster. +type GCP struct { + bitmap_ uint32 + authURI string + authProviderX509CertURL string + authentication *GcpAuthentication + clientID string + clientX509CertURL string + clientEmail string + privateKey string + privateKeyID string + projectID string + security *GcpSecurity + tokenURI string + type_ string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GCP) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AuthURI returns the value of the 'auth_URI' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP authentication uri +func (o *GCP) AuthURI() string { + if o != nil && o.bitmap_&1 != 0 { + return o.authURI + } + return "" +} + +// GetAuthURI returns the value of the 'auth_URI' attribute and +// a flag indicating if the attribute has a value. +// +// GCP authentication uri +func (o *GCP) GetAuthURI() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.authURI + } + return +} + +// AuthProviderX509CertURL returns the value of the 'auth_provider_X509_cert_URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP Authentication provider x509 certificate url +func (o *GCP) AuthProviderX509CertURL() string { + if o != nil && o.bitmap_&2 != 0 { + return o.authProviderX509CertURL + } + return "" +} + +// GetAuthProviderX509CertURL returns the value of the 'auth_provider_X509_cert_URL' attribute and +// a flag indicating if the attribute has a value. +// +// GCP Authentication provider x509 certificate url +func (o *GCP) GetAuthProviderX509CertURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.authProviderX509CertURL + } + return +} + +// Authentication returns the value of the 'authentication' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP Authentication Method +func (o *GCP) Authentication() *GcpAuthentication { + if o != nil && o.bitmap_&4 != 0 { + return o.authentication + } + return nil +} + +// GetAuthentication returns the value of the 'authentication' attribute and +// a flag indicating if the attribute has a value. +// +// GCP Authentication Method +func (o *GCP) GetAuthentication() (value *GcpAuthentication, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.authentication + } + return +} + +// ClientID returns the value of the 'client_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP client identifier +func (o *GCP) ClientID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clientID + } + return "" +} + +// GetClientID returns the value of the 'client_ID' attribute and +// a flag indicating if the attribute has a value. +// +// GCP client identifier +func (o *GCP) GetClientID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clientID + } + return +} + +// ClientX509CertURL returns the value of the 'client_X509_cert_URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP client x509 certificate url +func (o *GCP) ClientX509CertURL() string { + if o != nil && o.bitmap_&16 != 0 { + return o.clientX509CertURL + } + return "" +} + +// GetClientX509CertURL returns the value of the 'client_X509_cert_URL' attribute and +// a flag indicating if the attribute has a value. +// +// GCP client x509 certificate url +func (o *GCP) GetClientX509CertURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.clientX509CertURL + } + return +} + +// ClientEmail returns the value of the 'client_email' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP client email +func (o *GCP) ClientEmail() string { + if o != nil && o.bitmap_&32 != 0 { + return o.clientEmail + } + return "" +} + +// GetClientEmail returns the value of the 'client_email' attribute and +// a flag indicating if the attribute has a value. +// +// GCP client email +func (o *GCP) GetClientEmail() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.clientEmail + } + return +} + +// PrivateKey returns the value of the 'private_key' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP private key +func (o *GCP) PrivateKey() string { + if o != nil && o.bitmap_&64 != 0 { + return o.privateKey + } + return "" +} + +// GetPrivateKey returns the value of the 'private_key' attribute and +// a flag indicating if the attribute has a value. +// +// GCP private key +func (o *GCP) GetPrivateKey() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.privateKey + } + return +} + +// PrivateKeyID returns the value of the 'private_key_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP private key identifier +func (o *GCP) PrivateKeyID() string { + if o != nil && o.bitmap_&128 != 0 { + return o.privateKeyID + } + return "" +} + +// GetPrivateKeyID returns the value of the 'private_key_ID' attribute and +// a flag indicating if the attribute has a value. +// +// GCP private key identifier +func (o *GCP) GetPrivateKeyID() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.privateKeyID + } + return +} + +// ProjectID returns the value of the 'project_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP project identifier. +func (o *GCP) ProjectID() string { + if o != nil && o.bitmap_&256 != 0 { + return o.projectID + } + return "" +} + +// GetProjectID returns the value of the 'project_ID' attribute and +// a flag indicating if the attribute has a value. +// +// GCP project identifier. +func (o *GCP) GetProjectID() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.projectID + } + return +} + +// Security returns the value of the 'security' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP Security Settings +func (o *GCP) Security() *GcpSecurity { + if o != nil && o.bitmap_&512 != 0 { + return o.security + } + return nil +} + +// GetSecurity returns the value of the 'security' attribute and +// a flag indicating if the attribute has a value. +// +// GCP Security Settings +func (o *GCP) GetSecurity() (value *GcpSecurity, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.security + } + return +} + +// TokenURI returns the value of the 'token_URI' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP token uri +func (o *GCP) TokenURI() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.tokenURI + } + return "" +} + +// GetTokenURI returns the value of the 'token_URI' attribute and +// a flag indicating if the attribute has a value. +// +// GCP token uri +func (o *GCP) GetTokenURI() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.tokenURI + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP the type of the service the key belongs to +func (o *GCP) Type() string { + if o != nil && o.bitmap_&2048 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// GCP the type of the service the key belongs to +func (o *GCP) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.type_ + } + return +} + +// GCPListKind is the name of the type used to represent list of objects of +// type 'GCP'. +const GCPListKind = "GCPList" + +// GCPListLinkKind is the name of the type used to represent links to list +// of objects of type 'GCP'. +const GCPListLinkKind = "GCPListLink" + +// GCPNilKind is the name of the type used to nil lists of objects of +// type 'GCP'. +const GCPListNilKind = "GCPListNil" + +// GCPList is a list of values of the 'GCP' type. +type GCPList struct { + href string + link bool + items []*GCP +} + +// Len returns the length of the list. +func (l *GCPList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GCPList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GCPList) Get(i int) *GCP { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GCPList) Slice() []*GCP { + var slice []*GCP + if l == nil { + slice = make([]*GCP, 0) + } else { + slice = make([]*GCP, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GCPList) Each(f func(item *GCP) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GCPList) Range(f func(index int, item *GCP) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_type_json.go b/clustersmgmt/v2alpha1/gcp_type_json.go new file mode 100644 index 00000000..0f894e02 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_type_json.go @@ -0,0 +1,229 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCP writes a value of the 'GCP' type to the given writer. +func MarshalGCP(object *GCP, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCP(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCP writes a value of the 'GCP' type to the given stream. +func writeGCP(object *GCP, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("auth_uri") + stream.WriteString(object.authURI) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("auth_provider_x509_cert_url") + stream.WriteString(object.authProviderX509CertURL) + count++ + } + present_ = object.bitmap_&4 != 0 && object.authentication != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("authentication") + writeGcpAuthentication(object.authentication, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_id") + stream.WriteString(object.clientID) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_x509_cert_url") + stream.WriteString(object.clientX509CertURL) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_email") + stream.WriteString(object.clientEmail) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("private_key") + stream.WriteString(object.privateKey) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("private_key_id") + stream.WriteString(object.privateKeyID) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("project_id") + stream.WriteString(object.projectID) + count++ + } + present_ = object.bitmap_&512 != 0 && object.security != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("security") + writeGcpSecurity(object.security, stream) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("token_uri") + stream.WriteString(object.tokenURI) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalGCP reads a value of the 'GCP' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGCP(source interface{}) (object *GCP, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGCP(iterator) + err = iterator.Error + return +} + +// readGCP reads a value of the 'GCP' type from the given iterator. +func readGCP(iterator *jsoniter.Iterator) *GCP { + object := &GCP{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "auth_uri": + value := iterator.ReadString() + object.authURI = value + object.bitmap_ |= 1 + case "auth_provider_x509_cert_url": + value := iterator.ReadString() + object.authProviderX509CertURL = value + object.bitmap_ |= 2 + case "authentication": + value := readGcpAuthentication(iterator) + object.authentication = value + object.bitmap_ |= 4 + case "client_id": + value := iterator.ReadString() + object.clientID = value + object.bitmap_ |= 8 + case "client_x509_cert_url": + value := iterator.ReadString() + object.clientX509CertURL = value + object.bitmap_ |= 16 + case "client_email": + value := iterator.ReadString() + object.clientEmail = value + object.bitmap_ |= 32 + case "private_key": + value := iterator.ReadString() + object.privateKey = value + object.bitmap_ |= 64 + case "private_key_id": + value := iterator.ReadString() + object.privateKeyID = value + object.bitmap_ |= 128 + case "project_id": + value := iterator.ReadString() + object.projectID = value + object.bitmap_ |= 256 + case "security": + value := readGcpSecurity(iterator) + object.security = value + object.bitmap_ |= 512 + case "token_uri": + value := iterator.ReadString() + object.tokenURI = value + object.bitmap_ |= 1024 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 2048 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gcp_volume_builder.go b/clustersmgmt/v2alpha1/gcp_volume_builder.go new file mode 100644 index 00000000..62854c8c --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_volume_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPVolumeBuilder contains the data and logic needed to build 'GCP_volume' objects. +// +// Holds settings for an GCP storage volume. +type GCPVolumeBuilder struct { + bitmap_ uint32 + size int +} + +// NewGCPVolume creates a new builder of 'GCP_volume' objects. +func NewGCPVolume() *GCPVolumeBuilder { + return &GCPVolumeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GCPVolumeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Size sets the value of the 'size' attribute to the given value. +func (b *GCPVolumeBuilder) Size(value int) *GCPVolumeBuilder { + b.size = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GCPVolumeBuilder) Copy(object *GCPVolume) *GCPVolumeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.size = object.size + return b +} + +// Build creates a 'GCP_volume' object using the configuration stored in the builder. +func (b *GCPVolumeBuilder) Build() (object *GCPVolume, err error) { + object = new(GCPVolume) + object.bitmap_ = b.bitmap_ + object.size = b.size + return +} diff --git a/clustersmgmt/v2alpha1/gcp_volume_list_builder.go b/clustersmgmt/v2alpha1/gcp_volume_list_builder.go new file mode 100644 index 00000000..ed319ba6 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_volume_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPVolumeListBuilder contains the data and logic needed to build +// 'GCP_volume' objects. +type GCPVolumeListBuilder struct { + items []*GCPVolumeBuilder +} + +// NewGCPVolumeList creates a new builder of 'GCP_volume' objects. +func NewGCPVolumeList() *GCPVolumeListBuilder { + return new(GCPVolumeListBuilder) +} + +// Items sets the items of the list. +func (b *GCPVolumeListBuilder) Items(values ...*GCPVolumeBuilder) *GCPVolumeListBuilder { + b.items = make([]*GCPVolumeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GCPVolumeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GCPVolumeListBuilder) Copy(list *GCPVolumeList) *GCPVolumeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GCPVolumeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGCPVolume().Copy(v) + } + } + return b +} + +// Build creates a list of 'GCP_volume' objects using the +// configuration stored in the builder. +func (b *GCPVolumeListBuilder) Build() (list *GCPVolumeList, err error) { + items := make([]*GCPVolume, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GCPVolumeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gcp_volume_list_type_json.go b/clustersmgmt/v2alpha1/gcp_volume_list_type_json.go new file mode 100644 index 00000000..901f5ba2 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_volume_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPVolumeList writes a list of values of the 'GCP_volume' type to +// the given writer. +func MarshalGCPVolumeList(list []*GCPVolume, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPVolumeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPVolumeList writes a list of value of the 'GCP_volume' type to +// the given stream. +func writeGCPVolumeList(list []*GCPVolume, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGCPVolume(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGCPVolumeList reads a list of values of the 'GCP_volume' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGCPVolumeList(source interface{}) (items []*GCPVolume, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGCPVolumeList(iterator) + err = iterator.Error + return +} + +// readGCPVolumeList reads list of values of the ”GCP_volume' type from +// the given iterator. +func readGCPVolumeList(iterator *jsoniter.Iterator) []*GCPVolume { + list := []*GCPVolume{} + for iterator.ReadArray() { + item := readGCPVolume(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gcp_volume_type.go b/clustersmgmt/v2alpha1/gcp_volume_type.go new file mode 100644 index 00000000..2794ffc7 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_volume_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GCPVolume represents the values of the 'GCP_volume' type. +// +// Holds settings for an GCP storage volume. +type GCPVolume struct { + bitmap_ uint32 + size int +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GCPVolume) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Size returns the value of the 'size' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Volume size in Gib. +func (o *GCPVolume) Size() int { + if o != nil && o.bitmap_&1 != 0 { + return o.size + } + return 0 +} + +// GetSize returns the value of the 'size' attribute and +// a flag indicating if the attribute has a value. +// +// Volume size in Gib. +func (o *GCPVolume) GetSize() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.size + } + return +} + +// GCPVolumeListKind is the name of the type used to represent list of objects of +// type 'GCP_volume'. +const GCPVolumeListKind = "GCPVolumeList" + +// GCPVolumeListLinkKind is the name of the type used to represent links to list +// of objects of type 'GCP_volume'. +const GCPVolumeListLinkKind = "GCPVolumeListLink" + +// GCPVolumeNilKind is the name of the type used to nil lists of objects of +// type 'GCP_volume'. +const GCPVolumeListNilKind = "GCPVolumeListNil" + +// GCPVolumeList is a list of values of the 'GCP_volume' type. +type GCPVolumeList struct { + href string + link bool + items []*GCPVolume +} + +// Len returns the length of the list. +func (l *GCPVolumeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GCPVolumeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GCPVolumeList) Get(i int) *GCPVolume { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GCPVolumeList) Slice() []*GCPVolume { + var slice []*GCPVolume + if l == nil { + slice = make([]*GCPVolume, 0) + } else { + slice = make([]*GCPVolume, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GCPVolumeList) Each(f func(item *GCPVolume) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GCPVolumeList) Range(f func(index int, item *GCPVolume) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gcp_volume_type_json.go b/clustersmgmt/v2alpha1/gcp_volume_type_json.go new file mode 100644 index 00000000..1a08e1e1 --- /dev/null +++ b/clustersmgmt/v2alpha1/gcp_volume_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGCPVolume writes a value of the 'GCP_volume' type to the given writer. +func MarshalGCPVolume(object *GCPVolume, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGCPVolume(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGCPVolume writes a value of the 'GCP_volume' type to the given stream. +func writeGCPVolume(object *GCPVolume, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("size") + stream.WriteInt(object.size) + } + stream.WriteObjectEnd() +} + +// UnmarshalGCPVolume reads a value of the 'GCP_volume' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGCPVolume(source interface{}) (object *GCPVolume, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGCPVolume(iterator) + err = iterator.Error + return +} + +// readGCPVolume reads a value of the 'GCP_volume' type from the given iterator. +func readGCPVolume(iterator *jsoniter.Iterator) *GCPVolume { + object := &GCPVolume{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "size": + value := iterator.ReadInt() + object.size = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/github_identity_provider_builder.go b/clustersmgmt/v2alpha1/github_identity_provider_builder.go new file mode 100644 index 00000000..c882ddd1 --- /dev/null +++ b/clustersmgmt/v2alpha1/github_identity_provider_builder.go @@ -0,0 +1,131 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GithubIdentityProviderBuilder contains the data and logic needed to build 'github_identity_provider' objects. +// +// Details for `github` identity providers. +type GithubIdentityProviderBuilder struct { + bitmap_ uint32 + ca string + clientID string + clientSecret string + hostname string + organizations []string + teams []string +} + +// NewGithubIdentityProvider creates a new builder of 'github_identity_provider' objects. +func NewGithubIdentityProvider() *GithubIdentityProviderBuilder { + return &GithubIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GithubIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CA sets the value of the 'CA' attribute to the given value. +func (b *GithubIdentityProviderBuilder) CA(value string) *GithubIdentityProviderBuilder { + b.ca = value + b.bitmap_ |= 1 + return b +} + +// ClientID sets the value of the 'client_ID' attribute to the given value. +func (b *GithubIdentityProviderBuilder) ClientID(value string) *GithubIdentityProviderBuilder { + b.clientID = value + b.bitmap_ |= 2 + return b +} + +// ClientSecret sets the value of the 'client_secret' attribute to the given value. +func (b *GithubIdentityProviderBuilder) ClientSecret(value string) *GithubIdentityProviderBuilder { + b.clientSecret = value + b.bitmap_ |= 4 + return b +} + +// Hostname sets the value of the 'hostname' attribute to the given value. +func (b *GithubIdentityProviderBuilder) Hostname(value string) *GithubIdentityProviderBuilder { + b.hostname = value + b.bitmap_ |= 8 + return b +} + +// Organizations sets the value of the 'organizations' attribute to the given values. +func (b *GithubIdentityProviderBuilder) Organizations(values ...string) *GithubIdentityProviderBuilder { + b.organizations = make([]string, len(values)) + copy(b.organizations, values) + b.bitmap_ |= 16 + return b +} + +// Teams sets the value of the 'teams' attribute to the given values. +func (b *GithubIdentityProviderBuilder) Teams(values ...string) *GithubIdentityProviderBuilder { + b.teams = make([]string, len(values)) + copy(b.teams, values) + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GithubIdentityProviderBuilder) Copy(object *GithubIdentityProvider) *GithubIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.ca = object.ca + b.clientID = object.clientID + b.clientSecret = object.clientSecret + b.hostname = object.hostname + if object.organizations != nil { + b.organizations = make([]string, len(object.organizations)) + copy(b.organizations, object.organizations) + } else { + b.organizations = nil + } + if object.teams != nil { + b.teams = make([]string, len(object.teams)) + copy(b.teams, object.teams) + } else { + b.teams = nil + } + return b +} + +// Build creates a 'github_identity_provider' object using the configuration stored in the builder. +func (b *GithubIdentityProviderBuilder) Build() (object *GithubIdentityProvider, err error) { + object = new(GithubIdentityProvider) + object.bitmap_ = b.bitmap_ + object.ca = b.ca + object.clientID = b.clientID + object.clientSecret = b.clientSecret + object.hostname = b.hostname + if b.organizations != nil { + object.organizations = make([]string, len(b.organizations)) + copy(object.organizations, b.organizations) + } + if b.teams != nil { + object.teams = make([]string, len(b.teams)) + copy(object.teams, b.teams) + } + return +} diff --git a/clustersmgmt/v2alpha1/github_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/github_identity_provider_list_builder.go new file mode 100644 index 00000000..5eec2927 --- /dev/null +++ b/clustersmgmt/v2alpha1/github_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GithubIdentityProviderListBuilder contains the data and logic needed to build +// 'github_identity_provider' objects. +type GithubIdentityProviderListBuilder struct { + items []*GithubIdentityProviderBuilder +} + +// NewGithubIdentityProviderList creates a new builder of 'github_identity_provider' objects. +func NewGithubIdentityProviderList() *GithubIdentityProviderListBuilder { + return new(GithubIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *GithubIdentityProviderListBuilder) Items(values ...*GithubIdentityProviderBuilder) *GithubIdentityProviderListBuilder { + b.items = make([]*GithubIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GithubIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GithubIdentityProviderListBuilder) Copy(list *GithubIdentityProviderList) *GithubIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GithubIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGithubIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'github_identity_provider' objects using the +// configuration stored in the builder. +func (b *GithubIdentityProviderListBuilder) Build() (list *GithubIdentityProviderList, err error) { + items := make([]*GithubIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GithubIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/github_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/github_identity_provider_list_type_json.go new file mode 100644 index 00000000..8e4b6df1 --- /dev/null +++ b/clustersmgmt/v2alpha1/github_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGithubIdentityProviderList writes a list of values of the 'github_identity_provider' type to +// the given writer. +func MarshalGithubIdentityProviderList(list []*GithubIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGithubIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGithubIdentityProviderList writes a list of value of the 'github_identity_provider' type to +// the given stream. +func writeGithubIdentityProviderList(list []*GithubIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGithubIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGithubIdentityProviderList reads a list of values of the 'github_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGithubIdentityProviderList(source interface{}) (items []*GithubIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGithubIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readGithubIdentityProviderList reads list of values of the ”github_identity_provider' type from +// the given iterator. +func readGithubIdentityProviderList(iterator *jsoniter.Iterator) []*GithubIdentityProvider { + list := []*GithubIdentityProvider{} + for iterator.ReadArray() { + item := readGithubIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/github_identity_provider_type.go b/clustersmgmt/v2alpha1/github_identity_provider_type.go new file mode 100644 index 00000000..49b9164b --- /dev/null +++ b/clustersmgmt/v2alpha1/github_identity_provider_type.go @@ -0,0 +1,270 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GithubIdentityProvider represents the values of the 'github_identity_provider' type. +// +// Details for `github` identity providers. +type GithubIdentityProvider struct { + bitmap_ uint32 + ca string + clientID string + clientSecret string + hostname string + organizations []string + teams []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GithubIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CA returns the value of the 'CA' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional trusted certificate authority bundle to use when making requests tot he server. +func (o *GithubIdentityProvider) CA() string { + if o != nil && o.bitmap_&1 != 0 { + return o.ca + } + return "" +} + +// GetCA returns the value of the 'CA' attribute and +// a flag indicating if the attribute has a value. +// +// Optional trusted certificate authority bundle to use when making requests tot he server. +func (o *GithubIdentityProvider) GetCA() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.ca + } + return +} + +// ClientID returns the value of the 'client_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client identifier of a registered _GitHub_ OAuth application. +func (o *GithubIdentityProvider) ClientID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.clientID + } + return "" +} + +// GetClientID returns the value of the 'client_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Client identifier of a registered _GitHub_ OAuth application. +func (o *GithubIdentityProvider) GetClientID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.clientID + } + return +} + +// ClientSecret returns the value of the 'client_secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client secret of a registered _GitHub_ OAuth application. +func (o *GithubIdentityProvider) ClientSecret() string { + if o != nil && o.bitmap_&4 != 0 { + return o.clientSecret + } + return "" +} + +// GetClientSecret returns the value of the 'client_secret' attribute and +// a flag indicating if the attribute has a value. +// +// Client secret of a registered _GitHub_ OAuth application. +func (o *GithubIdentityProvider) GetClientSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.clientSecret + } + return +} + +// Hostname returns the value of the 'hostname' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// For _GitHub Enterprise_ you must provide the host name of your instance, such as +// `example.com`. This value must match the _GitHub Enterprise_ host name value in the +// `/setup/settings` file and cannot include a port number. +// +// For plain _GitHub_ omit this parameter. +func (o *GithubIdentityProvider) Hostname() string { + if o != nil && o.bitmap_&8 != 0 { + return o.hostname + } + return "" +} + +// GetHostname returns the value of the 'hostname' attribute and +// a flag indicating if the attribute has a value. +// +// For _GitHub Enterprise_ you must provide the host name of your instance, such as +// `example.com`. This value must match the _GitHub Enterprise_ host name value in the +// `/setup/settings` file and cannot include a port number. +// +// For plain _GitHub_ omit this parameter. +func (o *GithubIdentityProvider) GetHostname() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.hostname + } + return +} + +// Organizations returns the value of the 'organizations' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional list of organizations. Cannot be used in combination with the Teams field. +func (o *GithubIdentityProvider) Organizations() []string { + if o != nil && o.bitmap_&16 != 0 { + return o.organizations + } + return nil +} + +// GetOrganizations returns the value of the 'organizations' attribute and +// a flag indicating if the attribute has a value. +// +// Optional list of organizations. Cannot be used in combination with the Teams field. +func (o *GithubIdentityProvider) GetOrganizations() (value []string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.organizations + } + return +} + +// Teams returns the value of the 'teams' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional list of teams. Cannot be used in combination with the Organizations field. +func (o *GithubIdentityProvider) Teams() []string { + if o != nil && o.bitmap_&32 != 0 { + return o.teams + } + return nil +} + +// GetTeams returns the value of the 'teams' attribute and +// a flag indicating if the attribute has a value. +// +// Optional list of teams. Cannot be used in combination with the Organizations field. +func (o *GithubIdentityProvider) GetTeams() (value []string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.teams + } + return +} + +// GithubIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'github_identity_provider'. +const GithubIdentityProviderListKind = "GithubIdentityProviderList" + +// GithubIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'github_identity_provider'. +const GithubIdentityProviderListLinkKind = "GithubIdentityProviderListLink" + +// GithubIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'github_identity_provider'. +const GithubIdentityProviderListNilKind = "GithubIdentityProviderListNil" + +// GithubIdentityProviderList is a list of values of the 'github_identity_provider' type. +type GithubIdentityProviderList struct { + href string + link bool + items []*GithubIdentityProvider +} + +// Len returns the length of the list. +func (l *GithubIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GithubIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GithubIdentityProviderList) Get(i int) *GithubIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GithubIdentityProviderList) Slice() []*GithubIdentityProvider { + var slice []*GithubIdentityProvider + if l == nil { + slice = make([]*GithubIdentityProvider, 0) + } else { + slice = make([]*GithubIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GithubIdentityProviderList) Each(f func(item *GithubIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GithubIdentityProviderList) Range(f func(index int, item *GithubIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/github_identity_provider_type_json.go b/clustersmgmt/v2alpha1/github_identity_provider_type_json.go new file mode 100644 index 00000000..3b2ee9c4 --- /dev/null +++ b/clustersmgmt/v2alpha1/github_identity_provider_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGithubIdentityProvider writes a value of the 'github_identity_provider' type to the given writer. +func MarshalGithubIdentityProvider(object *GithubIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGithubIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGithubIdentityProvider writes a value of the 'github_identity_provider' type to the given stream. +func writeGithubIdentityProvider(object *GithubIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ca") + stream.WriteString(object.ca) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_id") + stream.WriteString(object.clientID) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_secret") + stream.WriteString(object.clientSecret) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hostname") + stream.WriteString(object.hostname) + count++ + } + present_ = object.bitmap_&16 != 0 && object.organizations != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("organizations") + writeStringList(object.organizations, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.teams != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("teams") + writeStringList(object.teams, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalGithubIdentityProvider reads a value of the 'github_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGithubIdentityProvider(source interface{}) (object *GithubIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGithubIdentityProvider(iterator) + err = iterator.Error + return +} + +// readGithubIdentityProvider reads a value of the 'github_identity_provider' type from the given iterator. +func readGithubIdentityProvider(iterator *jsoniter.Iterator) *GithubIdentityProvider { + object := &GithubIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "ca": + value := iterator.ReadString() + object.ca = value + object.bitmap_ |= 1 + case "client_id": + value := iterator.ReadString() + object.clientID = value + object.bitmap_ |= 2 + case "client_secret": + value := iterator.ReadString() + object.clientSecret = value + object.bitmap_ |= 4 + case "hostname": + value := iterator.ReadString() + object.hostname = value + object.bitmap_ |= 8 + case "organizations": + value := readStringList(iterator) + object.organizations = value + object.bitmap_ |= 16 + case "teams": + value := readStringList(iterator) + object.teams = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/gitlab_identity_provider_builder.go b/clustersmgmt/v2alpha1/gitlab_identity_provider_builder.go new file mode 100644 index 00000000..ac6c01f6 --- /dev/null +++ b/clustersmgmt/v2alpha1/gitlab_identity_provider_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GitlabIdentityProviderBuilder contains the data and logic needed to build 'gitlab_identity_provider' objects. +// +// Details for `gitlab` identity providers. +type GitlabIdentityProviderBuilder struct { + bitmap_ uint32 + ca string + url string + clientID string + clientSecret string +} + +// NewGitlabIdentityProvider creates a new builder of 'gitlab_identity_provider' objects. +func NewGitlabIdentityProvider() *GitlabIdentityProviderBuilder { + return &GitlabIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GitlabIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CA sets the value of the 'CA' attribute to the given value. +func (b *GitlabIdentityProviderBuilder) CA(value string) *GitlabIdentityProviderBuilder { + b.ca = value + b.bitmap_ |= 1 + return b +} + +// URL sets the value of the 'URL' attribute to the given value. +func (b *GitlabIdentityProviderBuilder) URL(value string) *GitlabIdentityProviderBuilder { + b.url = value + b.bitmap_ |= 2 + return b +} + +// ClientID sets the value of the 'client_ID' attribute to the given value. +func (b *GitlabIdentityProviderBuilder) ClientID(value string) *GitlabIdentityProviderBuilder { + b.clientID = value + b.bitmap_ |= 4 + return b +} + +// ClientSecret sets the value of the 'client_secret' attribute to the given value. +func (b *GitlabIdentityProviderBuilder) ClientSecret(value string) *GitlabIdentityProviderBuilder { + b.clientSecret = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GitlabIdentityProviderBuilder) Copy(object *GitlabIdentityProvider) *GitlabIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.ca = object.ca + b.url = object.url + b.clientID = object.clientID + b.clientSecret = object.clientSecret + return b +} + +// Build creates a 'gitlab_identity_provider' object using the configuration stored in the builder. +func (b *GitlabIdentityProviderBuilder) Build() (object *GitlabIdentityProvider, err error) { + object = new(GitlabIdentityProvider) + object.bitmap_ = b.bitmap_ + object.ca = b.ca + object.url = b.url + object.clientID = b.clientID + object.clientSecret = b.clientSecret + return +} diff --git a/clustersmgmt/v2alpha1/gitlab_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/gitlab_identity_provider_list_builder.go new file mode 100644 index 00000000..7bdb9618 --- /dev/null +++ b/clustersmgmt/v2alpha1/gitlab_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GitlabIdentityProviderListBuilder contains the data and logic needed to build +// 'gitlab_identity_provider' objects. +type GitlabIdentityProviderListBuilder struct { + items []*GitlabIdentityProviderBuilder +} + +// NewGitlabIdentityProviderList creates a new builder of 'gitlab_identity_provider' objects. +func NewGitlabIdentityProviderList() *GitlabIdentityProviderListBuilder { + return new(GitlabIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *GitlabIdentityProviderListBuilder) Items(values ...*GitlabIdentityProviderBuilder) *GitlabIdentityProviderListBuilder { + b.items = make([]*GitlabIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GitlabIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GitlabIdentityProviderListBuilder) Copy(list *GitlabIdentityProviderList) *GitlabIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GitlabIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGitlabIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'gitlab_identity_provider' objects using the +// configuration stored in the builder. +func (b *GitlabIdentityProviderListBuilder) Build() (list *GitlabIdentityProviderList, err error) { + items := make([]*GitlabIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GitlabIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/gitlab_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/gitlab_identity_provider_list_type_json.go new file mode 100644 index 00000000..4cb63350 --- /dev/null +++ b/clustersmgmt/v2alpha1/gitlab_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGitlabIdentityProviderList writes a list of values of the 'gitlab_identity_provider' type to +// the given writer. +func MarshalGitlabIdentityProviderList(list []*GitlabIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGitlabIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGitlabIdentityProviderList writes a list of value of the 'gitlab_identity_provider' type to +// the given stream. +func writeGitlabIdentityProviderList(list []*GitlabIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGitlabIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGitlabIdentityProviderList reads a list of values of the 'gitlab_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGitlabIdentityProviderList(source interface{}) (items []*GitlabIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGitlabIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readGitlabIdentityProviderList reads list of values of the ”gitlab_identity_provider' type from +// the given iterator. +func readGitlabIdentityProviderList(iterator *jsoniter.Iterator) []*GitlabIdentityProvider { + list := []*GitlabIdentityProvider{} + for iterator.ReadArray() { + item := readGitlabIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/gitlab_identity_provider_type.go b/clustersmgmt/v2alpha1/gitlab_identity_provider_type.go new file mode 100644 index 00000000..847a182a --- /dev/null +++ b/clustersmgmt/v2alpha1/gitlab_identity_provider_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GitlabIdentityProvider represents the values of the 'gitlab_identity_provider' type. +// +// Details for `gitlab` identity providers. +type GitlabIdentityProvider struct { + bitmap_ uint32 + ca string + url string + clientID string + clientSecret string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GitlabIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CA returns the value of the 'CA' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional trusted certificate authority bundle to use when making requests tot he server. +func (o *GitlabIdentityProvider) CA() string { + if o != nil && o.bitmap_&1 != 0 { + return o.ca + } + return "" +} + +// GetCA returns the value of the 'CA' attribute and +// a flag indicating if the attribute has a value. +// +// Optional trusted certificate authority bundle to use when making requests tot he server. +func (o *GitlabIdentityProvider) GetCA() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.ca + } + return +} + +// URL returns the value of the 'URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// URL of the _GitLab_ instance. +func (o *GitlabIdentityProvider) URL() string { + if o != nil && o.bitmap_&2 != 0 { + return o.url + } + return "" +} + +// GetURL returns the value of the 'URL' attribute and +// a flag indicating if the attribute has a value. +// +// URL of the _GitLab_ instance. +func (o *GitlabIdentityProvider) GetURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.url + } + return +} + +// ClientID returns the value of the 'client_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client identifier of a registered _GitLab_ OAuth application. +func (o *GitlabIdentityProvider) ClientID() string { + if o != nil && o.bitmap_&4 != 0 { + return o.clientID + } + return "" +} + +// GetClientID returns the value of the 'client_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Client identifier of a registered _GitLab_ OAuth application. +func (o *GitlabIdentityProvider) GetClientID() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.clientID + } + return +} + +// ClientSecret returns the value of the 'client_secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client secret issued by _GitLab_. +func (o *GitlabIdentityProvider) ClientSecret() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clientSecret + } + return "" +} + +// GetClientSecret returns the value of the 'client_secret' attribute and +// a flag indicating if the attribute has a value. +// +// Client secret issued by _GitLab_. +func (o *GitlabIdentityProvider) GetClientSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clientSecret + } + return +} + +// GitlabIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'gitlab_identity_provider'. +const GitlabIdentityProviderListKind = "GitlabIdentityProviderList" + +// GitlabIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'gitlab_identity_provider'. +const GitlabIdentityProviderListLinkKind = "GitlabIdentityProviderListLink" + +// GitlabIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'gitlab_identity_provider'. +const GitlabIdentityProviderListNilKind = "GitlabIdentityProviderListNil" + +// GitlabIdentityProviderList is a list of values of the 'gitlab_identity_provider' type. +type GitlabIdentityProviderList struct { + href string + link bool + items []*GitlabIdentityProvider +} + +// Len returns the length of the list. +func (l *GitlabIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GitlabIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GitlabIdentityProviderList) Get(i int) *GitlabIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GitlabIdentityProviderList) Slice() []*GitlabIdentityProvider { + var slice []*GitlabIdentityProvider + if l == nil { + slice = make([]*GitlabIdentityProvider, 0) + } else { + slice = make([]*GitlabIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GitlabIdentityProviderList) Each(f func(item *GitlabIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GitlabIdentityProviderList) Range(f func(index int, item *GitlabIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/gitlab_identity_provider_type_json.go b/clustersmgmt/v2alpha1/gitlab_identity_provider_type_json.go new file mode 100644 index 00000000..d30d2c40 --- /dev/null +++ b/clustersmgmt/v2alpha1/gitlab_identity_provider_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGitlabIdentityProvider writes a value of the 'gitlab_identity_provider' type to the given writer. +func MarshalGitlabIdentityProvider(object *GitlabIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGitlabIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGitlabIdentityProvider writes a value of the 'gitlab_identity_provider' type to the given stream. +func writeGitlabIdentityProvider(object *GitlabIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ca") + stream.WriteString(object.ca) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("url") + stream.WriteString(object.url) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_id") + stream.WriteString(object.clientID) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_secret") + stream.WriteString(object.clientSecret) + } + stream.WriteObjectEnd() +} + +// UnmarshalGitlabIdentityProvider reads a value of the 'gitlab_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGitlabIdentityProvider(source interface{}) (object *GitlabIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGitlabIdentityProvider(iterator) + err = iterator.Error + return +} + +// readGitlabIdentityProvider reads a value of the 'gitlab_identity_provider' type from the given iterator. +func readGitlabIdentityProvider(iterator *jsoniter.Iterator) *GitlabIdentityProvider { + object := &GitlabIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "ca": + value := iterator.ReadString() + object.ca = value + object.bitmap_ |= 1 + case "url": + value := iterator.ReadString() + object.url = value + object.bitmap_ |= 2 + case "client_id": + value := iterator.ReadString() + object.clientID = value + object.bitmap_ |= 4 + case "client_secret": + value := iterator.ReadString() + object.clientSecret = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/google_identity_provider_builder.go b/clustersmgmt/v2alpha1/google_identity_provider_builder.go new file mode 100644 index 00000000..45b1efff --- /dev/null +++ b/clustersmgmt/v2alpha1/google_identity_provider_builder.go @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GoogleIdentityProviderBuilder contains the data and logic needed to build 'google_identity_provider' objects. +// +// Details for `google` identity providers. +type GoogleIdentityProviderBuilder struct { + bitmap_ uint32 + clientID string + clientSecret string + hostedDomain string +} + +// NewGoogleIdentityProvider creates a new builder of 'google_identity_provider' objects. +func NewGoogleIdentityProvider() *GoogleIdentityProviderBuilder { + return &GoogleIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GoogleIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ClientID sets the value of the 'client_ID' attribute to the given value. +func (b *GoogleIdentityProviderBuilder) ClientID(value string) *GoogleIdentityProviderBuilder { + b.clientID = value + b.bitmap_ |= 1 + return b +} + +// ClientSecret sets the value of the 'client_secret' attribute to the given value. +func (b *GoogleIdentityProviderBuilder) ClientSecret(value string) *GoogleIdentityProviderBuilder { + b.clientSecret = value + b.bitmap_ |= 2 + return b +} + +// HostedDomain sets the value of the 'hosted_domain' attribute to the given value. +func (b *GoogleIdentityProviderBuilder) HostedDomain(value string) *GoogleIdentityProviderBuilder { + b.hostedDomain = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GoogleIdentityProviderBuilder) Copy(object *GoogleIdentityProvider) *GoogleIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.clientID = object.clientID + b.clientSecret = object.clientSecret + b.hostedDomain = object.hostedDomain + return b +} + +// Build creates a 'google_identity_provider' object using the configuration stored in the builder. +func (b *GoogleIdentityProviderBuilder) Build() (object *GoogleIdentityProvider, err error) { + object = new(GoogleIdentityProvider) + object.bitmap_ = b.bitmap_ + object.clientID = b.clientID + object.clientSecret = b.clientSecret + object.hostedDomain = b.hostedDomain + return +} diff --git a/clustersmgmt/v2alpha1/google_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/google_identity_provider_list_builder.go new file mode 100644 index 00000000..49cf01db --- /dev/null +++ b/clustersmgmt/v2alpha1/google_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GoogleIdentityProviderListBuilder contains the data and logic needed to build +// 'google_identity_provider' objects. +type GoogleIdentityProviderListBuilder struct { + items []*GoogleIdentityProviderBuilder +} + +// NewGoogleIdentityProviderList creates a new builder of 'google_identity_provider' objects. +func NewGoogleIdentityProviderList() *GoogleIdentityProviderListBuilder { + return new(GoogleIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *GoogleIdentityProviderListBuilder) Items(values ...*GoogleIdentityProviderBuilder) *GoogleIdentityProviderListBuilder { + b.items = make([]*GoogleIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GoogleIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GoogleIdentityProviderListBuilder) Copy(list *GoogleIdentityProviderList) *GoogleIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GoogleIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGoogleIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'google_identity_provider' objects using the +// configuration stored in the builder. +func (b *GoogleIdentityProviderListBuilder) Build() (list *GoogleIdentityProviderList, err error) { + items := make([]*GoogleIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GoogleIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/google_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/google_identity_provider_list_type_json.go new file mode 100644 index 00000000..984ff001 --- /dev/null +++ b/clustersmgmt/v2alpha1/google_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGoogleIdentityProviderList writes a list of values of the 'google_identity_provider' type to +// the given writer. +func MarshalGoogleIdentityProviderList(list []*GoogleIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGoogleIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGoogleIdentityProviderList writes a list of value of the 'google_identity_provider' type to +// the given stream. +func writeGoogleIdentityProviderList(list []*GoogleIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGoogleIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGoogleIdentityProviderList reads a list of values of the 'google_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGoogleIdentityProviderList(source interface{}) (items []*GoogleIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGoogleIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readGoogleIdentityProviderList reads list of values of the ”google_identity_provider' type from +// the given iterator. +func readGoogleIdentityProviderList(iterator *jsoniter.Iterator) []*GoogleIdentityProvider { + list := []*GoogleIdentityProvider{} + for iterator.ReadArray() { + item := readGoogleIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/google_identity_provider_type.go b/clustersmgmt/v2alpha1/google_identity_provider_type.go new file mode 100644 index 00000000..f6400d57 --- /dev/null +++ b/clustersmgmt/v2alpha1/google_identity_provider_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GoogleIdentityProvider represents the values of the 'google_identity_provider' type. +// +// Details for `google` identity providers. +type GoogleIdentityProvider struct { + bitmap_ uint32 + clientID string + clientSecret string + hostedDomain string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GoogleIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ClientID returns the value of the 'client_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client identifier of a registered _Google_ project. +func (o *GoogleIdentityProvider) ClientID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.clientID + } + return "" +} + +// GetClientID returns the value of the 'client_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Client identifier of a registered _Google_ project. +func (o *GoogleIdentityProvider) GetClientID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.clientID + } + return +} + +// ClientSecret returns the value of the 'client_secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client secret issued by _Google_. +func (o *GoogleIdentityProvider) ClientSecret() string { + if o != nil && o.bitmap_&2 != 0 { + return o.clientSecret + } + return "" +} + +// GetClientSecret returns the value of the 'client_secret' attribute and +// a flag indicating if the attribute has a value. +// +// Client secret issued by _Google_. +func (o *GoogleIdentityProvider) GetClientSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.clientSecret + } + return +} + +// HostedDomain returns the value of the 'hosted_domain' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional hosted domain to restrict sign-in accounts to. +func (o *GoogleIdentityProvider) HostedDomain() string { + if o != nil && o.bitmap_&4 != 0 { + return o.hostedDomain + } + return "" +} + +// GetHostedDomain returns the value of the 'hosted_domain' attribute and +// a flag indicating if the attribute has a value. +// +// Optional hosted domain to restrict sign-in accounts to. +func (o *GoogleIdentityProvider) GetHostedDomain() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.hostedDomain + } + return +} + +// GoogleIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'google_identity_provider'. +const GoogleIdentityProviderListKind = "GoogleIdentityProviderList" + +// GoogleIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'google_identity_provider'. +const GoogleIdentityProviderListLinkKind = "GoogleIdentityProviderListLink" + +// GoogleIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'google_identity_provider'. +const GoogleIdentityProviderListNilKind = "GoogleIdentityProviderListNil" + +// GoogleIdentityProviderList is a list of values of the 'google_identity_provider' type. +type GoogleIdentityProviderList struct { + href string + link bool + items []*GoogleIdentityProvider +} + +// Len returns the length of the list. +func (l *GoogleIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GoogleIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GoogleIdentityProviderList) Get(i int) *GoogleIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GoogleIdentityProviderList) Slice() []*GoogleIdentityProvider { + var slice []*GoogleIdentityProvider + if l == nil { + slice = make([]*GoogleIdentityProvider, 0) + } else { + slice = make([]*GoogleIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GoogleIdentityProviderList) Each(f func(item *GoogleIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GoogleIdentityProviderList) Range(f func(index int, item *GoogleIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/google_identity_provider_type_json.go b/clustersmgmt/v2alpha1/google_identity_provider_type_json.go new file mode 100644 index 00000000..7dd740f7 --- /dev/null +++ b/clustersmgmt/v2alpha1/google_identity_provider_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGoogleIdentityProvider writes a value of the 'google_identity_provider' type to the given writer. +func MarshalGoogleIdentityProvider(object *GoogleIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGoogleIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGoogleIdentityProvider writes a value of the 'google_identity_provider' type to the given stream. +func writeGoogleIdentityProvider(object *GoogleIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_id") + stream.WriteString(object.clientID) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_secret") + stream.WriteString(object.clientSecret) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hosted_domain") + stream.WriteString(object.hostedDomain) + } + stream.WriteObjectEnd() +} + +// UnmarshalGoogleIdentityProvider reads a value of the 'google_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGoogleIdentityProvider(source interface{}) (object *GoogleIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGoogleIdentityProvider(iterator) + err = iterator.Error + return +} + +// readGoogleIdentityProvider reads a value of the 'google_identity_provider' type from the given iterator. +func readGoogleIdentityProvider(iterator *jsoniter.Iterator) *GoogleIdentityProvider { + object := &GoogleIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "client_id": + value := iterator.ReadString() + object.clientID = value + object.bitmap_ |= 1 + case "client_secret": + value := iterator.ReadString() + object.clientSecret = value + object.bitmap_ |= 2 + case "hosted_domain": + value := iterator.ReadString() + object.hostedDomain = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/group_builder.go b/clustersmgmt/v2alpha1/group_builder.go new file mode 100644 index 00000000..935c5c14 --- /dev/null +++ b/clustersmgmt/v2alpha1/group_builder.go @@ -0,0 +1,98 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GroupBuilder contains the data and logic needed to build 'group' objects. +// +// Representation of a group of users. +type GroupBuilder struct { + bitmap_ uint32 + id string + href string + users *UserListBuilder +} + +// NewGroup creates a new builder of 'group' objects. +func NewGroup() *GroupBuilder { + return &GroupBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *GroupBuilder) Link(value bool) *GroupBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *GroupBuilder) ID(value string) *GroupBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *GroupBuilder) HREF(value string) *GroupBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GroupBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Users sets the value of the 'users' attribute to the given values. +func (b *GroupBuilder) Users(value *UserListBuilder) *GroupBuilder { + b.users = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GroupBuilder) Copy(object *Group) *GroupBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.users != nil { + b.users = NewUserList().Copy(object.users) + } else { + b.users = nil + } + return b +} + +// Build creates a 'group' object using the configuration stored in the builder. +func (b *GroupBuilder) Build() (object *Group, err error) { + object = new(Group) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.users != nil { + object.users, err = b.users.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/group_client.go b/clustersmgmt/v2alpha1/group_client.go new file mode 100644 index 00000000..af91885f --- /dev/null +++ b/clustersmgmt/v2alpha1/group_client.go @@ -0,0 +1,318 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// GroupClient is the client of the 'group' resource. +// +// Manages a specific group. +type GroupClient struct { + transport http.RoundTripper + path string +} + +// NewGroupClient creates a new client for the 'group' +// resource using the given transport to send the requests and receive the +// responses. +func NewGroupClient(transport http.RoundTripper, path string) *GroupClient { + return &GroupClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the group. +func (c *GroupClient) Get() *GroupGetRequest { + return &GroupGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Users returns the target 'users' resource. +// +// Reference to the resource that manages the collection of users. +func (c *GroupClient) Users() *UsersClient { + return NewUsersClient( + c.transport, + path.Join(c.path, "users"), + ) +} + +// GroupPollRequest is the request for the Poll method. +type GroupPollRequest struct { + request *GroupGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *GroupPollRequest) Parameter(name string, value interface{}) *GroupPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *GroupPollRequest) Header(name string, value interface{}) *GroupPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *GroupPollRequest) Interval(value time.Duration) *GroupPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *GroupPollRequest) Status(value int) *GroupPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *GroupPollRequest) Predicate(value func(*GroupGetResponse) bool) *GroupPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*GroupGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *GroupPollRequest) StartContext(ctx context.Context) (response *GroupPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &GroupPollResponse{ + response: result.(*GroupGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *GroupPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// GroupPollResponse is the response for the Poll method. +type GroupPollResponse struct { + response *GroupGetResponse +} + +// Status returns the response status code. +func (r *GroupPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *GroupPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *GroupPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *GroupPollResponse) Body() *Group { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *GroupPollResponse) GetBody() (value *Group, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *GroupClient) Poll() *GroupPollRequest { + return &GroupPollRequest{ + request: c.Get(), + } +} + +// GroupGetRequest is the request for the 'get' method. +type GroupGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *GroupGetRequest) Parameter(name string, value interface{}) *GroupGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *GroupGetRequest) Header(name string, value interface{}) *GroupGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *GroupGetRequest) Impersonate(user string) *GroupGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *GroupGetRequest) Send() (result *GroupGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *GroupGetRequest) SendContext(ctx context.Context) (result *GroupGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &GroupGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readGroupGetResponse(result, reader) + if err != nil { + return + } + return +} + +// GroupGetResponse is the response for the 'get' method. +type GroupGetResponse struct { + status int + header http.Header + err *errors.Error + body *Group +} + +// Status returns the response status code. +func (r *GroupGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *GroupGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *GroupGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *GroupGetResponse) Body() *Group { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *GroupGetResponse) GetBody() (value *Group, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/group_list_builder.go b/clustersmgmt/v2alpha1/group_list_builder.go new file mode 100644 index 00000000..c34dfe44 --- /dev/null +++ b/clustersmgmt/v2alpha1/group_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GroupListBuilder contains the data and logic needed to build +// 'group' objects. +type GroupListBuilder struct { + items []*GroupBuilder +} + +// NewGroupList creates a new builder of 'group' objects. +func NewGroupList() *GroupListBuilder { + return new(GroupListBuilder) +} + +// Items sets the items of the list. +func (b *GroupListBuilder) Items(values ...*GroupBuilder) *GroupListBuilder { + b.items = make([]*GroupBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GroupListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GroupListBuilder) Copy(list *GroupList) *GroupListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GroupBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGroup().Copy(v) + } + } + return b +} + +// Build creates a list of 'group' objects using the +// configuration stored in the builder. +func (b *GroupListBuilder) Build() (list *GroupList, err error) { + items := make([]*Group, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GroupList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/group_list_type_json.go b/clustersmgmt/v2alpha1/group_list_type_json.go new file mode 100644 index 00000000..ba6a55b1 --- /dev/null +++ b/clustersmgmt/v2alpha1/group_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGroupList writes a list of values of the 'group' type to +// the given writer. +func MarshalGroupList(list []*Group, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGroupList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGroupList writes a list of value of the 'group' type to +// the given stream. +func writeGroupList(list []*Group, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGroup(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGroupList reads a list of values of the 'group' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGroupList(source interface{}) (items []*Group, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGroupList(iterator) + err = iterator.Error + return +} + +// readGroupList reads list of values of the ”group' type from +// the given iterator. +func readGroupList(iterator *jsoniter.Iterator) []*Group { + list := []*Group{} + for iterator.ReadArray() { + item := readGroup(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/group_resource_json.go b/clustersmgmt/v2alpha1/group_resource_json.go new file mode 100644 index 00000000..3071a241 --- /dev/null +++ b/clustersmgmt/v2alpha1/group_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeGroupGetRequest(request *GroupGetRequest, writer io.Writer) error { + return nil +} +func readGroupGetResponse(response *GroupGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalGroup(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/group_type.go b/clustersmgmt/v2alpha1/group_type.go new file mode 100644 index 00000000..d3e0f1c4 --- /dev/null +++ b/clustersmgmt/v2alpha1/group_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GroupKind is the name of the type used to represent objects +// of type 'group'. +const GroupKind = "Group" + +// GroupLinkKind is the name of the type used to represent links +// to objects of type 'group'. +const GroupLinkKind = "GroupLink" + +// GroupNilKind is the name of the type used to nil references +// to objects of type 'group'. +const GroupNilKind = "GroupNil" + +// Group represents the values of the 'group' type. +// +// Representation of a group of users. +type Group struct { + bitmap_ uint32 + id string + href string + users *UserList +} + +// Kind returns the name of the type of the object. +func (o *Group) Kind() string { + if o == nil { + return GroupNilKind + } + if o.bitmap_&1 != 0 { + return GroupLinkKind + } + return GroupKind +} + +// Link returns true iif this is a link. +func (o *Group) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Group) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Group) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Group) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Group) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Group) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Users returns the value of the 'users' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of users of the group. +func (o *Group) Users() *UserList { + if o != nil && o.bitmap_&8 != 0 { + return o.users + } + return nil +} + +// GetUsers returns the value of the 'users' attribute and +// a flag indicating if the attribute has a value. +// +// List of users of the group. +func (o *Group) GetUsers() (value *UserList, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.users + } + return +} + +// GroupListKind is the name of the type used to represent list of objects of +// type 'group'. +const GroupListKind = "GroupList" + +// GroupListLinkKind is the name of the type used to represent links to list +// of objects of type 'group'. +const GroupListLinkKind = "GroupListLink" + +// GroupNilKind is the name of the type used to nil lists of objects of +// type 'group'. +const GroupListNilKind = "GroupListNil" + +// GroupList is a list of values of the 'group' type. +type GroupList struct { + href string + link bool + items []*Group +} + +// Kind returns the name of the type of the object. +func (l *GroupList) Kind() string { + if l == nil { + return GroupListNilKind + } + if l.link { + return GroupListLinkKind + } + return GroupListKind +} + +// Link returns true iif this is a link. +func (l *GroupList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *GroupList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *GroupList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *GroupList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GroupList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GroupList) Get(i int) *Group { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GroupList) Slice() []*Group { + var slice []*Group + if l == nil { + slice = make([]*Group, 0) + } else { + slice = make([]*Group, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GroupList) Each(f func(item *Group) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GroupList) Range(f func(index int, item *Group) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/group_type_json.go b/clustersmgmt/v2alpha1/group_type_json.go new file mode 100644 index 00000000..77210ed9 --- /dev/null +++ b/clustersmgmt/v2alpha1/group_type_json.go @@ -0,0 +1,140 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGroup writes a value of the 'group' type to the given writer. +func MarshalGroup(object *Group, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGroup(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGroup writes a value of the 'group' type to the given stream. +func writeGroup(object *Group, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(GroupLinkKind) + } else { + stream.WriteString(GroupKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.users != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("users") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeUserList(object.users.items, stream) + stream.WriteObjectEnd() + } + stream.WriteObjectEnd() +} + +// UnmarshalGroup reads a value of the 'group' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGroup(source interface{}) (object *Group, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGroup(iterator) + err = iterator.Error + return +} + +// readGroup reads a value of the 'group' type from the given iterator. +func readGroup(iterator *jsoniter.Iterator) *Group { + object := &Group{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == GroupLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "users": + value := &UserList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == UserListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readUserList(iterator) + default: + iterator.ReadAny() + } + } + object.users = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/groups_claim_builder.go b/clustersmgmt/v2alpha1/groups_claim_builder.go new file mode 100644 index 00000000..7a5cfdbb --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_claim_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GroupsClaimBuilder contains the data and logic needed to build 'groups_claim' objects. +type GroupsClaimBuilder struct { + bitmap_ uint32 + claim string + prefix string +} + +// NewGroupsClaim creates a new builder of 'groups_claim' objects. +func NewGroupsClaim() *GroupsClaimBuilder { + return &GroupsClaimBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *GroupsClaimBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Claim sets the value of the 'claim' attribute to the given value. +func (b *GroupsClaimBuilder) Claim(value string) *GroupsClaimBuilder { + b.claim = value + b.bitmap_ |= 1 + return b +} + +// Prefix sets the value of the 'prefix' attribute to the given value. +func (b *GroupsClaimBuilder) Prefix(value string) *GroupsClaimBuilder { + b.prefix = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *GroupsClaimBuilder) Copy(object *GroupsClaim) *GroupsClaimBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.claim = object.claim + b.prefix = object.prefix + return b +} + +// Build creates a 'groups_claim' object using the configuration stored in the builder. +func (b *GroupsClaimBuilder) Build() (object *GroupsClaim, err error) { + object = new(GroupsClaim) + object.bitmap_ = b.bitmap_ + object.claim = b.claim + object.prefix = b.prefix + return +} diff --git a/clustersmgmt/v2alpha1/groups_claim_list_builder.go b/clustersmgmt/v2alpha1/groups_claim_list_builder.go new file mode 100644 index 00000000..de1cf491 --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_claim_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GroupsClaimListBuilder contains the data and logic needed to build +// 'groups_claim' objects. +type GroupsClaimListBuilder struct { + items []*GroupsClaimBuilder +} + +// NewGroupsClaimList creates a new builder of 'groups_claim' objects. +func NewGroupsClaimList() *GroupsClaimListBuilder { + return new(GroupsClaimListBuilder) +} + +// Items sets the items of the list. +func (b *GroupsClaimListBuilder) Items(values ...*GroupsClaimBuilder) *GroupsClaimListBuilder { + b.items = make([]*GroupsClaimBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *GroupsClaimListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *GroupsClaimListBuilder) Copy(list *GroupsClaimList) *GroupsClaimListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*GroupsClaimBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewGroupsClaim().Copy(v) + } + } + return b +} + +// Build creates a list of 'groups_claim' objects using the +// configuration stored in the builder. +func (b *GroupsClaimListBuilder) Build() (list *GroupsClaimList, err error) { + items := make([]*GroupsClaim, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(GroupsClaimList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/groups_claim_list_type_json.go b/clustersmgmt/v2alpha1/groups_claim_list_type_json.go new file mode 100644 index 00000000..9f8a375a --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_claim_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGroupsClaimList writes a list of values of the 'groups_claim' type to +// the given writer. +func MarshalGroupsClaimList(list []*GroupsClaim, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGroupsClaimList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGroupsClaimList writes a list of value of the 'groups_claim' type to +// the given stream. +func writeGroupsClaimList(list []*GroupsClaim, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeGroupsClaim(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalGroupsClaimList reads a list of values of the 'groups_claim' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalGroupsClaimList(source interface{}) (items []*GroupsClaim, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readGroupsClaimList(iterator) + err = iterator.Error + return +} + +// readGroupsClaimList reads list of values of the ”groups_claim' type from +// the given iterator. +func readGroupsClaimList(iterator *jsoniter.Iterator) []*GroupsClaim { + list := []*GroupsClaim{} + for iterator.ReadArray() { + item := readGroupsClaim(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/groups_claim_type.go b/clustersmgmt/v2alpha1/groups_claim_type.go new file mode 100644 index 00000000..69153598 --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_claim_type.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// GroupsClaim represents the values of the 'groups_claim' type. +type GroupsClaim struct { + bitmap_ uint32 + claim string + prefix string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *GroupsClaim) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Claim returns the value of the 'claim' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The claim used in the token. +func (o *GroupsClaim) Claim() string { + if o != nil && o.bitmap_&1 != 0 { + return o.claim + } + return "" +} + +// GetClaim returns the value of the 'claim' attribute and +// a flag indicating if the attribute has a value. +// +// The claim used in the token. +func (o *GroupsClaim) GetClaim() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.claim + } + return +} + +// Prefix returns the value of the 'prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// A prefix contatenated in the claim (Optional). +func (o *GroupsClaim) Prefix() string { + if o != nil && o.bitmap_&2 != 0 { + return o.prefix + } + return "" +} + +// GetPrefix returns the value of the 'prefix' attribute and +// a flag indicating if the attribute has a value. +// +// A prefix contatenated in the claim (Optional). +func (o *GroupsClaim) GetPrefix() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.prefix + } + return +} + +// GroupsClaimListKind is the name of the type used to represent list of objects of +// type 'groups_claim'. +const GroupsClaimListKind = "GroupsClaimList" + +// GroupsClaimListLinkKind is the name of the type used to represent links to list +// of objects of type 'groups_claim'. +const GroupsClaimListLinkKind = "GroupsClaimListLink" + +// GroupsClaimNilKind is the name of the type used to nil lists of objects of +// type 'groups_claim'. +const GroupsClaimListNilKind = "GroupsClaimListNil" + +// GroupsClaimList is a list of values of the 'groups_claim' type. +type GroupsClaimList struct { + href string + link bool + items []*GroupsClaim +} + +// Len returns the length of the list. +func (l *GroupsClaimList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *GroupsClaimList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *GroupsClaimList) Get(i int) *GroupsClaim { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *GroupsClaimList) Slice() []*GroupsClaim { + var slice []*GroupsClaim + if l == nil { + slice = make([]*GroupsClaim, 0) + } else { + slice = make([]*GroupsClaim, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *GroupsClaimList) Each(f func(item *GroupsClaim) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *GroupsClaimList) Range(f func(index int, item *GroupsClaim) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/groups_claim_type_json.go b/clustersmgmt/v2alpha1/groups_claim_type_json.go new file mode 100644 index 00000000..7bb96149 --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_claim_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalGroupsClaim writes a value of the 'groups_claim' type to the given writer. +func MarshalGroupsClaim(object *GroupsClaim, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeGroupsClaim(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeGroupsClaim writes a value of the 'groups_claim' type to the given stream. +func writeGroupsClaim(object *GroupsClaim, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("claim") + stream.WriteString(object.claim) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("prefix") + stream.WriteString(object.prefix) + } + stream.WriteObjectEnd() +} + +// UnmarshalGroupsClaim reads a value of the 'groups_claim' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalGroupsClaim(source interface{}) (object *GroupsClaim, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readGroupsClaim(iterator) + err = iterator.Error + return +} + +// readGroupsClaim reads a value of the 'groups_claim' type from the given iterator. +func readGroupsClaim(iterator *jsoniter.Iterator) *GroupsClaim { + object := &GroupsClaim{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "claim": + value := iterator.ReadString() + object.claim = value + object.bitmap_ |= 1 + case "prefix": + value := iterator.ReadString() + object.prefix = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/groups_client.go b/clustersmgmt/v2alpha1/groups_client.go new file mode 100644 index 00000000..6fea93ed --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_client.go @@ -0,0 +1,297 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// GroupsClient is the client of the 'groups' resource. +// +// Manages the collection of groups of a cluster. +type GroupsClient struct { + transport http.RoundTripper + path string +} + +// NewGroupsClient creates a new client for the 'groups' +// resource using the given transport to send the requests and receive the +// responses. +func NewGroupsClient(transport http.RoundTripper, path string) *GroupsClient { + return &GroupsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of groups. +func (c *GroupsClient) List() *GroupsListRequest { + return &GroupsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Group returns the target 'group' resource for the given identifier. +// +// Reference to the service that manages an specific group. +func (c *GroupsClient) Group(id string) *GroupClient { + return NewGroupClient( + c.transport, + path.Join(c.path, id), + ) +} + +// GroupsListRequest is the request for the 'list' method. +type GroupsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *GroupsListRequest) Parameter(name string, value interface{}) *GroupsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *GroupsListRequest) Header(name string, value interface{}) *GroupsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *GroupsListRequest) Impersonate(user string) *GroupsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *GroupsListRequest) Page(value int) *GroupsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *GroupsListRequest) Size(value int) *GroupsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *GroupsListRequest) Send() (result *GroupsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *GroupsListRequest) SendContext(ctx context.Context) (result *GroupsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &GroupsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readGroupsListResponse(result, reader) + if err != nil { + return + } + return +} + +// GroupsListResponse is the response for the 'list' method. +type GroupsListResponse struct { + status int + header http.Header + err *errors.Error + items *GroupList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *GroupsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *GroupsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *GroupsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of groups. +func (r *GroupsListResponse) Items() *GroupList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of groups. +func (r *GroupsListResponse) GetItems() (value *GroupList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *GroupsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *GroupsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *GroupsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *GroupsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *GroupsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *GroupsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/groups_resource_json.go b/clustersmgmt/v2alpha1/groups_resource_json.go new file mode 100644 index 00000000..ea0143a0 --- /dev/null +++ b/clustersmgmt/v2alpha1/groups_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeGroupsListRequest(request *GroupsListRequest, writer io.Writer) error { + return nil +} +func readGroupsListResponse(response *GroupsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readGroupList(iterator) + response.items = &GroupList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/hcp_kubelet_config_client.go b/clustersmgmt/v2alpha1/hcp_kubelet_config_client.go new file mode 100644 index 00000000..395f0d1d --- /dev/null +++ b/clustersmgmt/v2alpha1/hcp_kubelet_config_client.go @@ -0,0 +1,579 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// HcpKubeletConfigClient is the client of the 'hcp_kubelet_config' resource. +// +// Manages KubeletConfig configuration for Hosted Control Plane clusters. This resource does not support POST operations +// in contrast to the KubeletConfig resource for Classic clusters. +type HcpKubeletConfigClient struct { + transport http.RoundTripper + path string +} + +// NewHcpKubeletConfigClient creates a new client for the 'hcp_kubelet_config' +// resource using the given transport to send the requests and receive the +// responses. +func NewHcpKubeletConfigClient(transport http.RoundTripper, path string) *HcpKubeletConfigClient { + return &HcpKubeletConfigClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the KubeletConfig specified by the id. +func (c *HcpKubeletConfigClient) Delete() *HcpKubeletConfigDeleteRequest { + return &HcpKubeletConfigDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the KubeletConfig specified by the id. +func (c *HcpKubeletConfigClient) Get() *HcpKubeletConfigGetRequest { + return &HcpKubeletConfigGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the KubeletConfig specified by the id. +func (c *HcpKubeletConfigClient) Update() *HcpKubeletConfigUpdateRequest { + return &HcpKubeletConfigUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// HcpKubeletConfigPollRequest is the request for the Poll method. +type HcpKubeletConfigPollRequest struct { + request *HcpKubeletConfigGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *HcpKubeletConfigPollRequest) Parameter(name string, value interface{}) *HcpKubeletConfigPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *HcpKubeletConfigPollRequest) Header(name string, value interface{}) *HcpKubeletConfigPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *HcpKubeletConfigPollRequest) Interval(value time.Duration) *HcpKubeletConfigPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *HcpKubeletConfigPollRequest) Status(value int) *HcpKubeletConfigPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *HcpKubeletConfigPollRequest) Predicate(value func(*HcpKubeletConfigGetResponse) bool) *HcpKubeletConfigPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*HcpKubeletConfigGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *HcpKubeletConfigPollRequest) StartContext(ctx context.Context) (response *HcpKubeletConfigPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &HcpKubeletConfigPollResponse{ + response: result.(*HcpKubeletConfigGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *HcpKubeletConfigPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// HcpKubeletConfigPollResponse is the response for the Poll method. +type HcpKubeletConfigPollResponse struct { + response *HcpKubeletConfigGetResponse +} + +// Status returns the response status code. +func (r *HcpKubeletConfigPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *HcpKubeletConfigPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *HcpKubeletConfigPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *HcpKubeletConfigPollResponse) Body() *KubeletConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HcpKubeletConfigPollResponse) GetBody() (value *KubeletConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *HcpKubeletConfigClient) Poll() *HcpKubeletConfigPollRequest { + return &HcpKubeletConfigPollRequest{ + request: c.Get(), + } +} + +// HcpKubeletConfigDeleteRequest is the request for the 'delete' method. +type HcpKubeletConfigDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *HcpKubeletConfigDeleteRequest) Parameter(name string, value interface{}) *HcpKubeletConfigDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HcpKubeletConfigDeleteRequest) Header(name string, value interface{}) *HcpKubeletConfigDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HcpKubeletConfigDeleteRequest) Impersonate(user string) *HcpKubeletConfigDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HcpKubeletConfigDeleteRequest) Send() (result *HcpKubeletConfigDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HcpKubeletConfigDeleteRequest) SendContext(ctx context.Context) (result *HcpKubeletConfigDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HcpKubeletConfigDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// HcpKubeletConfigDeleteResponse is the response for the 'delete' method. +type HcpKubeletConfigDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *HcpKubeletConfigDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HcpKubeletConfigDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HcpKubeletConfigDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// HcpKubeletConfigGetRequest is the request for the 'get' method. +type HcpKubeletConfigGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *HcpKubeletConfigGetRequest) Parameter(name string, value interface{}) *HcpKubeletConfigGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HcpKubeletConfigGetRequest) Header(name string, value interface{}) *HcpKubeletConfigGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HcpKubeletConfigGetRequest) Impersonate(user string) *HcpKubeletConfigGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HcpKubeletConfigGetRequest) Send() (result *HcpKubeletConfigGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HcpKubeletConfigGetRequest) SendContext(ctx context.Context) (result *HcpKubeletConfigGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HcpKubeletConfigGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHcpKubeletConfigGetResponse(result, reader) + if err != nil { + return + } + return +} + +// HcpKubeletConfigGetResponse is the response for the 'get' method. +type HcpKubeletConfigGetResponse struct { + status int + header http.Header + err *errors.Error + body *KubeletConfig +} + +// Status returns the response status code. +func (r *HcpKubeletConfigGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HcpKubeletConfigGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HcpKubeletConfigGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *HcpKubeletConfigGetResponse) Body() *KubeletConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HcpKubeletConfigGetResponse) GetBody() (value *KubeletConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// HcpKubeletConfigUpdateRequest is the request for the 'update' method. +type HcpKubeletConfigUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *KubeletConfig +} + +// Parameter adds a query parameter. +func (r *HcpKubeletConfigUpdateRequest) Parameter(name string, value interface{}) *HcpKubeletConfigUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HcpKubeletConfigUpdateRequest) Header(name string, value interface{}) *HcpKubeletConfigUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HcpKubeletConfigUpdateRequest) Impersonate(user string) *HcpKubeletConfigUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *HcpKubeletConfigUpdateRequest) Body(value *KubeletConfig) *HcpKubeletConfigUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HcpKubeletConfigUpdateRequest) Send() (result *HcpKubeletConfigUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HcpKubeletConfigUpdateRequest) SendContext(ctx context.Context) (result *HcpKubeletConfigUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeHcpKubeletConfigUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HcpKubeletConfigUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHcpKubeletConfigUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// HcpKubeletConfigUpdateResponse is the response for the 'update' method. +type HcpKubeletConfigUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *KubeletConfig +} + +// Status returns the response status code. +func (r *HcpKubeletConfigUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HcpKubeletConfigUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HcpKubeletConfigUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *HcpKubeletConfigUpdateResponse) Body() *KubeletConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HcpKubeletConfigUpdateResponse) GetBody() (value *KubeletConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/hcp_kubelet_config_resource_json.go b/clustersmgmt/v2alpha1/hcp_kubelet_config_resource_json.go new file mode 100644 index 00000000..6b31ac9c --- /dev/null +++ b/clustersmgmt/v2alpha1/hcp_kubelet_config_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeHcpKubeletConfigDeleteRequest(request *HcpKubeletConfigDeleteRequest, writer io.Writer) error { + return nil +} +func readHcpKubeletConfigDeleteResponse(response *HcpKubeletConfigDeleteResponse, reader io.Reader) error { + return nil +} +func writeHcpKubeletConfigGetRequest(request *HcpKubeletConfigGetRequest, writer io.Writer) error { + return nil +} +func readHcpKubeletConfigGetResponse(response *HcpKubeletConfigGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalKubeletConfig(reader) + return err +} +func writeHcpKubeletConfigUpdateRequest(request *HcpKubeletConfigUpdateRequest, writer io.Writer) error { + return MarshalKubeletConfig(request.body, writer) +} +func readHcpKubeletConfigUpdateResponse(response *HcpKubeletConfigUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalKubeletConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_identity_provider_builder.go b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_builder.go new file mode 100644 index 00000000..9df304bc --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_builder.go @@ -0,0 +1,92 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HTPasswdIdentityProviderBuilder contains the data and logic needed to build 'HT_passwd_identity_provider' objects. +// +// Details for `htpasswd` identity providers. +type HTPasswdIdentityProviderBuilder struct { + bitmap_ uint32 + password string + username string + users *HTPasswdUserListBuilder +} + +// NewHTPasswdIdentityProvider creates a new builder of 'HT_passwd_identity_provider' objects. +func NewHTPasswdIdentityProvider() *HTPasswdIdentityProviderBuilder { + return &HTPasswdIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *HTPasswdIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Password sets the value of the 'password' attribute to the given value. +func (b *HTPasswdIdentityProviderBuilder) Password(value string) *HTPasswdIdentityProviderBuilder { + b.password = value + b.bitmap_ |= 1 + return b +} + +// Username sets the value of the 'username' attribute to the given value. +func (b *HTPasswdIdentityProviderBuilder) Username(value string) *HTPasswdIdentityProviderBuilder { + b.username = value + b.bitmap_ |= 2 + return b +} + +// Users sets the value of the 'users' attribute to the given values. +func (b *HTPasswdIdentityProviderBuilder) Users(value *HTPasswdUserListBuilder) *HTPasswdIdentityProviderBuilder { + b.users = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *HTPasswdIdentityProviderBuilder) Copy(object *HTPasswdIdentityProvider) *HTPasswdIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.password = object.password + b.username = object.username + if object.users != nil { + b.users = NewHTPasswdUserList().Copy(object.users) + } else { + b.users = nil + } + return b +} + +// Build creates a 'HT_passwd_identity_provider' object using the configuration stored in the builder. +func (b *HTPasswdIdentityProviderBuilder) Build() (object *HTPasswdIdentityProvider, err error) { + object = new(HTPasswdIdentityProvider) + object.bitmap_ = b.bitmap_ + object.password = b.password + object.username = b.username + if b.users != nil { + object.users, err = b.users.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_list_builder.go new file mode 100644 index 00000000..8e968325 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HTPasswdIdentityProviderListBuilder contains the data and logic needed to build +// 'HT_passwd_identity_provider' objects. +type HTPasswdIdentityProviderListBuilder struct { + items []*HTPasswdIdentityProviderBuilder +} + +// NewHTPasswdIdentityProviderList creates a new builder of 'HT_passwd_identity_provider' objects. +func NewHTPasswdIdentityProviderList() *HTPasswdIdentityProviderListBuilder { + return new(HTPasswdIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *HTPasswdIdentityProviderListBuilder) Items(values ...*HTPasswdIdentityProviderBuilder) *HTPasswdIdentityProviderListBuilder { + b.items = make([]*HTPasswdIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *HTPasswdIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *HTPasswdIdentityProviderListBuilder) Copy(list *HTPasswdIdentityProviderList) *HTPasswdIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*HTPasswdIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewHTPasswdIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'HT_passwd_identity_provider' objects using the +// configuration stored in the builder. +func (b *HTPasswdIdentityProviderListBuilder) Build() (list *HTPasswdIdentityProviderList, err error) { + items := make([]*HTPasswdIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(HTPasswdIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_list_type_json.go new file mode 100644 index 00000000..56f3d7ff --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHTPasswdIdentityProviderList writes a list of values of the 'HT_passwd_identity_provider' type to +// the given writer. +func MarshalHTPasswdIdentityProviderList(list []*HTPasswdIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHTPasswdIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHTPasswdIdentityProviderList writes a list of value of the 'HT_passwd_identity_provider' type to +// the given stream. +func writeHTPasswdIdentityProviderList(list []*HTPasswdIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeHTPasswdIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalHTPasswdIdentityProviderList reads a list of values of the 'HT_passwd_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalHTPasswdIdentityProviderList(source interface{}) (items []*HTPasswdIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readHTPasswdIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readHTPasswdIdentityProviderList reads list of values of the ”HT_passwd_identity_provider' type from +// the given iterator. +func readHTPasswdIdentityProviderList(iterator *jsoniter.Iterator) []*HTPasswdIdentityProvider { + list := []*HTPasswdIdentityProvider{} + for iterator.ReadArray() { + item := readHTPasswdIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_identity_provider_type.go b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_type.go new file mode 100644 index 00000000..6f52eedc --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HTPasswdIdentityProvider represents the values of the 'HT_passwd_identity_provider' type. +// +// Details for `htpasswd` identity providers. +type HTPasswdIdentityProvider struct { + bitmap_ uint32 + password string + username string + users *HTPasswdUserList +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *HTPasswdIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Password returns the value of the 'password' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Password to be used in the _HTPasswd_ data file. +func (o *HTPasswdIdentityProvider) Password() string { + if o != nil && o.bitmap_&1 != 0 { + return o.password + } + return "" +} + +// GetPassword returns the value of the 'password' attribute and +// a flag indicating if the attribute has a value. +// +// Password to be used in the _HTPasswd_ data file. +func (o *HTPasswdIdentityProvider) GetPassword() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.password + } + return +} + +// Username returns the value of the 'username' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Username to be used in the _HTPasswd_ data file. +func (o *HTPasswdIdentityProvider) Username() string { + if o != nil && o.bitmap_&2 != 0 { + return o.username + } + return "" +} + +// GetUsername returns the value of the 'username' attribute and +// a flag indicating if the attribute has a value. +// +// Username to be used in the _HTPasswd_ data file. +func (o *HTPasswdIdentityProvider) GetUsername() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.username + } + return +} + +// Users returns the value of the 'users' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the collection of _HTPasswd_ users. +func (o *HTPasswdIdentityProvider) Users() *HTPasswdUserList { + if o != nil && o.bitmap_&4 != 0 { + return o.users + } + return nil +} + +// GetUsers returns the value of the 'users' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the collection of _HTPasswd_ users. +func (o *HTPasswdIdentityProvider) GetUsers() (value *HTPasswdUserList, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.users + } + return +} + +// HTPasswdIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'HT_passwd_identity_provider'. +const HTPasswdIdentityProviderListKind = "HTPasswdIdentityProviderList" + +// HTPasswdIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'HT_passwd_identity_provider'. +const HTPasswdIdentityProviderListLinkKind = "HTPasswdIdentityProviderListLink" + +// HTPasswdIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'HT_passwd_identity_provider'. +const HTPasswdIdentityProviderListNilKind = "HTPasswdIdentityProviderListNil" + +// HTPasswdIdentityProviderList is a list of values of the 'HT_passwd_identity_provider' type. +type HTPasswdIdentityProviderList struct { + href string + link bool + items []*HTPasswdIdentityProvider +} + +// Len returns the length of the list. +func (l *HTPasswdIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *HTPasswdIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *HTPasswdIdentityProviderList) Get(i int) *HTPasswdIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *HTPasswdIdentityProviderList) Slice() []*HTPasswdIdentityProvider { + var slice []*HTPasswdIdentityProvider + if l == nil { + slice = make([]*HTPasswdIdentityProvider, 0) + } else { + slice = make([]*HTPasswdIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *HTPasswdIdentityProviderList) Each(f func(item *HTPasswdIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *HTPasswdIdentityProviderList) Range(f func(index int, item *HTPasswdIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_identity_provider_type_json.go b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_type_json.go new file mode 100644 index 00000000..3170eb2c --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_identity_provider_type_json.go @@ -0,0 +1,132 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHTPasswdIdentityProvider writes a value of the 'HT_passwd_identity_provider' type to the given writer. +func MarshalHTPasswdIdentityProvider(object *HTPasswdIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHTPasswdIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHTPasswdIdentityProvider writes a value of the 'HT_passwd_identity_provider' type to the given stream. +func writeHTPasswdIdentityProvider(object *HTPasswdIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("password") + stream.WriteString(object.password) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("username") + stream.WriteString(object.username) + count++ + } + present_ = object.bitmap_&4 != 0 && object.users != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("users") + stream.WriteObjectStart() + stream.WriteObjectField("items") + writeHTPasswdUserList(object.users.items, stream) + stream.WriteObjectEnd() + } + stream.WriteObjectEnd() +} + +// UnmarshalHTPasswdIdentityProvider reads a value of the 'HT_passwd_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalHTPasswdIdentityProvider(source interface{}) (object *HTPasswdIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readHTPasswdIdentityProvider(iterator) + err = iterator.Error + return +} + +// readHTPasswdIdentityProvider reads a value of the 'HT_passwd_identity_provider' type from the given iterator. +func readHTPasswdIdentityProvider(iterator *jsoniter.Iterator) *HTPasswdIdentityProvider { + object := &HTPasswdIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "password": + value := iterator.ReadString() + object.password = value + object.bitmap_ |= 1 + case "username": + value := iterator.ReadString() + object.username = value + object.bitmap_ |= 2 + case "users": + value := &HTPasswdUserList{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + text := iterator.ReadString() + value.link = text == HTPasswdUserListLinkKind + case "href": + value.href = iterator.ReadString() + case "items": + value.items = readHTPasswdUserList(iterator) + default: + iterator.ReadAny() + } + } + object.users = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_builder.go b/clustersmgmt/v2alpha1/ht_passwd_user_builder.go new file mode 100644 index 00000000..1f8da2b9 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_builder.go @@ -0,0 +1,91 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HTPasswdUserBuilder contains the data and logic needed to build 'HT_passwd_user' objects. +type HTPasswdUserBuilder struct { + bitmap_ uint32 + id string + hashedPassword string + password string + username string +} + +// NewHTPasswdUser creates a new builder of 'HT_passwd_user' objects. +func NewHTPasswdUser() *HTPasswdUserBuilder { + return &HTPasswdUserBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *HTPasswdUserBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *HTPasswdUserBuilder) ID(value string) *HTPasswdUserBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// HashedPassword sets the value of the 'hashed_password' attribute to the given value. +func (b *HTPasswdUserBuilder) HashedPassword(value string) *HTPasswdUserBuilder { + b.hashedPassword = value + b.bitmap_ |= 2 + return b +} + +// Password sets the value of the 'password' attribute to the given value. +func (b *HTPasswdUserBuilder) Password(value string) *HTPasswdUserBuilder { + b.password = value + b.bitmap_ |= 4 + return b +} + +// Username sets the value of the 'username' attribute to the given value. +func (b *HTPasswdUserBuilder) Username(value string) *HTPasswdUserBuilder { + b.username = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *HTPasswdUserBuilder) Copy(object *HTPasswdUser) *HTPasswdUserBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.hashedPassword = object.hashedPassword + b.password = object.password + b.username = object.username + return b +} + +// Build creates a 'HT_passwd_user' object using the configuration stored in the builder. +func (b *HTPasswdUserBuilder) Build() (object *HTPasswdUser, err error) { + object = new(HTPasswdUser) + object.bitmap_ = b.bitmap_ + object.id = b.id + object.hashedPassword = b.hashedPassword + object.password = b.password + object.username = b.username + return +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_client.go b/clustersmgmt/v2alpha1/ht_passwd_user_client.go new file mode 100644 index 00000000..8c16c00f --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// HTPasswdUserClient is the client of the 'HT_passwd_user' resource. +// +// Manages a specific _HTPasswd_ user. +type HTPasswdUserClient struct { + transport http.RoundTripper + path string +} + +// NewHTPasswdUserClient creates a new client for the 'HT_passwd_user' +// resource using the given transport to send the requests and receive the +// responses. +func NewHTPasswdUserClient(transport http.RoundTripper, path string) *HTPasswdUserClient { + return &HTPasswdUserClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the user. +func (c *HTPasswdUserClient) Delete() *HTPasswdUserDeleteRequest { + return &HTPasswdUserDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the user. +func (c *HTPasswdUserClient) Get() *HTPasswdUserGetRequest { + return &HTPasswdUserGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the user's password. The username is not editable +func (c *HTPasswdUserClient) Update() *HTPasswdUserUpdateRequest { + return &HTPasswdUserUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// HTPasswdUserPollRequest is the request for the Poll method. +type HTPasswdUserPollRequest struct { + request *HTPasswdUserGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *HTPasswdUserPollRequest) Parameter(name string, value interface{}) *HTPasswdUserPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *HTPasswdUserPollRequest) Header(name string, value interface{}) *HTPasswdUserPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *HTPasswdUserPollRequest) Interval(value time.Duration) *HTPasswdUserPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *HTPasswdUserPollRequest) Status(value int) *HTPasswdUserPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *HTPasswdUserPollRequest) Predicate(value func(*HTPasswdUserGetResponse) bool) *HTPasswdUserPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*HTPasswdUserGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *HTPasswdUserPollRequest) StartContext(ctx context.Context) (response *HTPasswdUserPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &HTPasswdUserPollResponse{ + response: result.(*HTPasswdUserGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *HTPasswdUserPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// HTPasswdUserPollResponse is the response for the Poll method. +type HTPasswdUserPollResponse struct { + response *HTPasswdUserGetResponse +} + +// Status returns the response status code. +func (r *HTPasswdUserPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *HTPasswdUserPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *HTPasswdUserPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *HTPasswdUserPollResponse) Body() *HTPasswdUser { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HTPasswdUserPollResponse) GetBody() (value *HTPasswdUser, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *HTPasswdUserClient) Poll() *HTPasswdUserPollRequest { + return &HTPasswdUserPollRequest{ + request: c.Get(), + } +} + +// HTPasswdUserDeleteRequest is the request for the 'delete' method. +type HTPasswdUserDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *HTPasswdUserDeleteRequest) Parameter(name string, value interface{}) *HTPasswdUserDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HTPasswdUserDeleteRequest) Header(name string, value interface{}) *HTPasswdUserDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HTPasswdUserDeleteRequest) Impersonate(user string) *HTPasswdUserDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HTPasswdUserDeleteRequest) Send() (result *HTPasswdUserDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HTPasswdUserDeleteRequest) SendContext(ctx context.Context) (result *HTPasswdUserDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HTPasswdUserDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// HTPasswdUserDeleteResponse is the response for the 'delete' method. +type HTPasswdUserDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *HTPasswdUserDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HTPasswdUserDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HTPasswdUserDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// HTPasswdUserGetRequest is the request for the 'get' method. +type HTPasswdUserGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *HTPasswdUserGetRequest) Parameter(name string, value interface{}) *HTPasswdUserGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HTPasswdUserGetRequest) Header(name string, value interface{}) *HTPasswdUserGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HTPasswdUserGetRequest) Impersonate(user string) *HTPasswdUserGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HTPasswdUserGetRequest) Send() (result *HTPasswdUserGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HTPasswdUserGetRequest) SendContext(ctx context.Context) (result *HTPasswdUserGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HTPasswdUserGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHTPasswdUserGetResponse(result, reader) + if err != nil { + return + } + return +} + +// HTPasswdUserGetResponse is the response for the 'get' method. +type HTPasswdUserGetResponse struct { + status int + header http.Header + err *errors.Error + body *HTPasswdUser +} + +// Status returns the response status code. +func (r *HTPasswdUserGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HTPasswdUserGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HTPasswdUserGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *HTPasswdUserGetResponse) Body() *HTPasswdUser { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HTPasswdUserGetResponse) GetBody() (value *HTPasswdUser, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// HTPasswdUserUpdateRequest is the request for the 'update' method. +type HTPasswdUserUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *HTPasswdUser +} + +// Parameter adds a query parameter. +func (r *HTPasswdUserUpdateRequest) Parameter(name string, value interface{}) *HTPasswdUserUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HTPasswdUserUpdateRequest) Header(name string, value interface{}) *HTPasswdUserUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HTPasswdUserUpdateRequest) Impersonate(user string) *HTPasswdUserUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *HTPasswdUserUpdateRequest) Body(value *HTPasswdUser) *HTPasswdUserUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HTPasswdUserUpdateRequest) Send() (result *HTPasswdUserUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HTPasswdUserUpdateRequest) SendContext(ctx context.Context) (result *HTPasswdUserUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeHTPasswdUserUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HTPasswdUserUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHTPasswdUserUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// HTPasswdUserUpdateResponse is the response for the 'update' method. +type HTPasswdUserUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *HTPasswdUser +} + +// Status returns the response status code. +func (r *HTPasswdUserUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HTPasswdUserUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HTPasswdUserUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *HTPasswdUserUpdateResponse) Body() *HTPasswdUser { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HTPasswdUserUpdateResponse) GetBody() (value *HTPasswdUser, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_list_builder.go b/clustersmgmt/v2alpha1/ht_passwd_user_list_builder.go new file mode 100644 index 00000000..cd539a39 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HTPasswdUserListBuilder contains the data and logic needed to build +// 'HT_passwd_user' objects. +type HTPasswdUserListBuilder struct { + items []*HTPasswdUserBuilder +} + +// NewHTPasswdUserList creates a new builder of 'HT_passwd_user' objects. +func NewHTPasswdUserList() *HTPasswdUserListBuilder { + return new(HTPasswdUserListBuilder) +} + +// Items sets the items of the list. +func (b *HTPasswdUserListBuilder) Items(values ...*HTPasswdUserBuilder) *HTPasswdUserListBuilder { + b.items = make([]*HTPasswdUserBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *HTPasswdUserListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *HTPasswdUserListBuilder) Copy(list *HTPasswdUserList) *HTPasswdUserListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*HTPasswdUserBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewHTPasswdUser().Copy(v) + } + } + return b +} + +// Build creates a list of 'HT_passwd_user' objects using the +// configuration stored in the builder. +func (b *HTPasswdUserListBuilder) Build() (list *HTPasswdUserList, err error) { + items := make([]*HTPasswdUser, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(HTPasswdUserList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_list_type_json.go b/clustersmgmt/v2alpha1/ht_passwd_user_list_type_json.go new file mode 100644 index 00000000..7bc6a8f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHTPasswdUserList writes a list of values of the 'HT_passwd_user' type to +// the given writer. +func MarshalHTPasswdUserList(list []*HTPasswdUser, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHTPasswdUserList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHTPasswdUserList writes a list of value of the 'HT_passwd_user' type to +// the given stream. +func writeHTPasswdUserList(list []*HTPasswdUser, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeHTPasswdUser(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalHTPasswdUserList reads a list of values of the 'HT_passwd_user' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalHTPasswdUserList(source interface{}) (items []*HTPasswdUser, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readHTPasswdUserList(iterator) + err = iterator.Error + return +} + +// readHTPasswdUserList reads list of values of the ”HT_passwd_user' type from +// the given iterator. +func readHTPasswdUserList(iterator *jsoniter.Iterator) []*HTPasswdUser { + list := []*HTPasswdUser{} + for iterator.ReadArray() { + item := readHTPasswdUser(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_resource_json.go b/clustersmgmt/v2alpha1/ht_passwd_user_resource_json.go new file mode 100644 index 00000000..d6e97a97 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeHTPasswdUserDeleteRequest(request *HTPasswdUserDeleteRequest, writer io.Writer) error { + return nil +} +func readHTPasswdUserDeleteResponse(response *HTPasswdUserDeleteResponse, reader io.Reader) error { + return nil +} +func writeHTPasswdUserGetRequest(request *HTPasswdUserGetRequest, writer io.Writer) error { + return nil +} +func readHTPasswdUserGetResponse(response *HTPasswdUserGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalHTPasswdUser(reader) + return err +} +func writeHTPasswdUserUpdateRequest(request *HTPasswdUserUpdateRequest, writer io.Writer) error { + return MarshalHTPasswdUser(request.body, writer) +} +func readHTPasswdUserUpdateResponse(response *HTPasswdUserUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalHTPasswdUser(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_type.go b/clustersmgmt/v2alpha1/ht_passwd_user_type.go new file mode 100644 index 00000000..fe7650ef --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_type.go @@ -0,0 +1,216 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HTPasswdUser represents the values of the 'HT_passwd_user' type. +type HTPasswdUser struct { + bitmap_ uint32 + id string + hashedPassword string + password string + username string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *HTPasswdUser) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID for a secondary user in the _HTPasswd_ data file. +func (o *HTPasswdUser) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID for a secondary user in the _HTPasswd_ data file. +func (o *HTPasswdUser) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// HashedPassword returns the value of the 'hashed_password' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HTPasswd Hashed Password for a user in the _HTPasswd_ data file. +// The value of this field is set as-is in the _HTPasswd_ data file for the HTPasswd IDP +func (o *HTPasswdUser) HashedPassword() string { + if o != nil && o.bitmap_&2 != 0 { + return o.hashedPassword + } + return "" +} + +// GetHashedPassword returns the value of the 'hashed_password' attribute and +// a flag indicating if the attribute has a value. +// +// HTPasswd Hashed Password for a user in the _HTPasswd_ data file. +// The value of this field is set as-is in the _HTPasswd_ data file for the HTPasswd IDP +func (o *HTPasswdUser) GetHashedPassword() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.hashedPassword + } + return +} + +// Password returns the value of the 'password' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Password in plain-text for a user in the _HTPasswd_ data file. +// The value of this field is hashed before setting it in the _HTPasswd_ data file for the HTPasswd IDP +func (o *HTPasswdUser) Password() string { + if o != nil && o.bitmap_&4 != 0 { + return o.password + } + return "" +} + +// GetPassword returns the value of the 'password' attribute and +// a flag indicating if the attribute has a value. +// +// Password in plain-text for a user in the _HTPasswd_ data file. +// The value of this field is hashed before setting it in the _HTPasswd_ data file for the HTPasswd IDP +func (o *HTPasswdUser) GetPassword() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.password + } + return +} + +// Username returns the value of the 'username' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Username for a secondary user in the _HTPasswd_ data file. +func (o *HTPasswdUser) Username() string { + if o != nil && o.bitmap_&8 != 0 { + return o.username + } + return "" +} + +// GetUsername returns the value of the 'username' attribute and +// a flag indicating if the attribute has a value. +// +// Username for a secondary user in the _HTPasswd_ data file. +func (o *HTPasswdUser) GetUsername() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.username + } + return +} + +// HTPasswdUserListKind is the name of the type used to represent list of objects of +// type 'HT_passwd_user'. +const HTPasswdUserListKind = "HTPasswdUserList" + +// HTPasswdUserListLinkKind is the name of the type used to represent links to list +// of objects of type 'HT_passwd_user'. +const HTPasswdUserListLinkKind = "HTPasswdUserListLink" + +// HTPasswdUserNilKind is the name of the type used to nil lists of objects of +// type 'HT_passwd_user'. +const HTPasswdUserListNilKind = "HTPasswdUserListNil" + +// HTPasswdUserList is a list of values of the 'HT_passwd_user' type. +type HTPasswdUserList struct { + href string + link bool + items []*HTPasswdUser +} + +// Len returns the length of the list. +func (l *HTPasswdUserList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *HTPasswdUserList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *HTPasswdUserList) Get(i int) *HTPasswdUser { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *HTPasswdUserList) Slice() []*HTPasswdUser { + var slice []*HTPasswdUser + if l == nil { + slice = make([]*HTPasswdUser, 0) + } else { + slice = make([]*HTPasswdUser, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *HTPasswdUserList) Each(f func(item *HTPasswdUser) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *HTPasswdUserList) Range(f func(index int, item *HTPasswdUser) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_user_type_json.go b/clustersmgmt/v2alpha1/ht_passwd_user_type_json.go new file mode 100644 index 00000000..566fc3a7 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_user_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHTPasswdUser writes a value of the 'HT_passwd_user' type to the given writer. +func MarshalHTPasswdUser(object *HTPasswdUser, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHTPasswdUser(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHTPasswdUser writes a value of the 'HT_passwd_user' type to the given stream. +func writeHTPasswdUser(object *HTPasswdUser, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hashed_password") + stream.WriteString(object.hashedPassword) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("password") + stream.WriteString(object.password) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("username") + stream.WriteString(object.username) + } + stream.WriteObjectEnd() +} + +// UnmarshalHTPasswdUser reads a value of the 'HT_passwd_user' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalHTPasswdUser(source interface{}) (object *HTPasswdUser, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readHTPasswdUser(iterator) + err = iterator.Error + return +} + +// readHTPasswdUser reads a value of the 'HT_passwd_user' type from the given iterator. +func readHTPasswdUser(iterator *jsoniter.Iterator) *HTPasswdUser { + object := &HTPasswdUser{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "hashed_password": + value := iterator.ReadString() + object.hashedPassword = value + object.bitmap_ |= 2 + case "password": + value := iterator.ReadString() + object.password = value + object.bitmap_ |= 4 + case "username": + value := iterator.ReadString() + object.username = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_users_client.go b/clustersmgmt/v2alpha1/ht_passwd_users_client.go new file mode 100644 index 00000000..444cb9b4 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_users_client.go @@ -0,0 +1,703 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// HTPasswdUsersClient is the client of the 'HT_passwd_users' resource. +// +// Manages the collection of users in an _HTPasswd_ IDP of a cluster. +type HTPasswdUsersClient struct { + transport http.RoundTripper + path string +} + +// NewHTPasswdUsersClient creates a new client for the 'HT_passwd_users' +// resource using the given transport to send the requests and receive the +// responses. +func NewHTPasswdUsersClient(transport http.RoundTripper, path string) *HTPasswdUsersClient { + return &HTPasswdUsersClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new user to the _HTPasswd_ file. +func (c *HTPasswdUsersClient) Add() *HTPasswdUsersAddRequest { + return &HTPasswdUsersAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// Import creates a request for the 'import' method. +// +// Adds multiple new users to the _HTPasswd_ file. +func (c *HTPasswdUsersClient) Import() *HTPasswdUsersImportRequest { + return &HTPasswdUsersImportRequest{ + transport: c.transport, + path: path.Join(c.path, "import"), + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of _HTPasswd_ IDP users. +func (c *HTPasswdUsersClient) List() *HTPasswdUsersListRequest { + return &HTPasswdUsersListRequest{ + transport: c.transport, + path: c.path, + } +} + +// HtpasswdUser returns the target 'HT_passwd_user' resource for the given identifier. +// +// Reference to the service that manages a specific _HTPasswd_ user. +func (c *HTPasswdUsersClient) HtpasswdUser(id string) *HTPasswdUserClient { + return NewHTPasswdUserClient( + c.transport, + path.Join(c.path, id), + ) +} + +// HTPasswdUsersAddRequest is the request for the 'add' method. +type HTPasswdUsersAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *HTPasswdUser +} + +// Parameter adds a query parameter. +func (r *HTPasswdUsersAddRequest) Parameter(name string, value interface{}) *HTPasswdUsersAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HTPasswdUsersAddRequest) Header(name string, value interface{}) *HTPasswdUsersAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HTPasswdUsersAddRequest) Impersonate(user string) *HTPasswdUsersAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// New user to be added +func (r *HTPasswdUsersAddRequest) Body(value *HTPasswdUser) *HTPasswdUsersAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HTPasswdUsersAddRequest) Send() (result *HTPasswdUsersAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HTPasswdUsersAddRequest) SendContext(ctx context.Context) (result *HTPasswdUsersAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeHTPasswdUsersAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HTPasswdUsersAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHTPasswdUsersAddResponse(result, reader) + if err != nil { + return + } + return +} + +// HTPasswdUsersAddResponse is the response for the 'add' method. +type HTPasswdUsersAddResponse struct { + status int + header http.Header + err *errors.Error + body *HTPasswdUser +} + +// Status returns the response status code. +func (r *HTPasswdUsersAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HTPasswdUsersAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HTPasswdUsersAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// New user to be added +func (r *HTPasswdUsersAddResponse) Body() *HTPasswdUser { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// New user to be added +func (r *HTPasswdUsersAddResponse) GetBody() (value *HTPasswdUser, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// HTPasswdUsersImportRequest is the request for the 'import' method. +type HTPasswdUsersImportRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + items []*HTPasswdUser + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *HTPasswdUsersImportRequest) Parameter(name string, value interface{}) *HTPasswdUsersImportRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HTPasswdUsersImportRequest) Header(name string, value interface{}) *HTPasswdUsersImportRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HTPasswdUsersImportRequest) Impersonate(user string) *HTPasswdUsersImportRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Items sets the value of the 'items' parameter. +// +// List of users to add to the IDP. +func (r *HTPasswdUsersImportRequest) Items(value []*HTPasswdUser) *HTPasswdUsersImportRequest { + r.items = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *HTPasswdUsersImportRequest) Page(value int) *HTPasswdUsersImportRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *HTPasswdUsersImportRequest) Size(value int) *HTPasswdUsersImportRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HTPasswdUsersImportRequest) Send() (result *HTPasswdUsersImportResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HTPasswdUsersImportRequest) SendContext(ctx context.Context) (result *HTPasswdUsersImportResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeHTPasswdUsersImportRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HTPasswdUsersImportResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHTPasswdUsersImportResponse(result, reader) + if err != nil { + return + } + return +} + +// HTPasswdUsersImportResponse is the response for the 'import' method. +type HTPasswdUsersImportResponse struct { + status int + header http.Header + err *errors.Error + items []*HTPasswdUser + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *HTPasswdUsersImportResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HTPasswdUsersImportResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HTPasswdUsersImportResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Updated list of users of the IDP. +func (r *HTPasswdUsersImportResponse) Items() []*HTPasswdUser { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Updated list of users of the IDP. +func (r *HTPasswdUsersImportResponse) GetItems() (value []*HTPasswdUser, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *HTPasswdUsersImportResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *HTPasswdUsersImportResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *HTPasswdUsersImportResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *HTPasswdUsersImportResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *HTPasswdUsersImportResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *HTPasswdUsersImportResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} + +// HTPasswdUsersListRequest is the request for the 'list' method. +type HTPasswdUsersListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *HTPasswdUsersListRequest) Parameter(name string, value interface{}) *HTPasswdUsersListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HTPasswdUsersListRequest) Header(name string, value interface{}) *HTPasswdUsersListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HTPasswdUsersListRequest) Impersonate(user string) *HTPasswdUsersListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *HTPasswdUsersListRequest) Page(value int) *HTPasswdUsersListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *HTPasswdUsersListRequest) Size(value int) *HTPasswdUsersListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HTPasswdUsersListRequest) Send() (result *HTPasswdUsersListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HTPasswdUsersListRequest) SendContext(ctx context.Context) (result *HTPasswdUsersListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HTPasswdUsersListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHTPasswdUsersListResponse(result, reader) + if err != nil { + return + } + return +} + +// HTPasswdUsersListResponse is the response for the 'list' method. +type HTPasswdUsersListResponse struct { + status int + header http.Header + err *errors.Error + items *HTPasswdUserList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *HTPasswdUsersListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HTPasswdUsersListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HTPasswdUsersListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of users of the IDP. +func (r *HTPasswdUsersListResponse) Items() *HTPasswdUserList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of users of the IDP. +func (r *HTPasswdUsersListResponse) GetItems() (value *HTPasswdUserList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *HTPasswdUsersListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *HTPasswdUsersListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *HTPasswdUsersListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *HTPasswdUsersListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *HTPasswdUsersListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *HTPasswdUsersListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/ht_passwd_users_resource_json.go b/clustersmgmt/v2alpha1/ht_passwd_users_resource_json.go new file mode 100644 index 00000000..5a4aa0a9 --- /dev/null +++ b/clustersmgmt/v2alpha1/ht_passwd_users_resource_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeHTPasswdUsersAddRequest(request *HTPasswdUsersAddRequest, writer io.Writer) error { + return MarshalHTPasswdUser(request.body, writer) +} +func readHTPasswdUsersAddResponse(response *HTPasswdUsersAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalHTPasswdUser(reader) + return err +} +func writeHTPasswdUsersImportRequest(request *HTPasswdUsersImportRequest, writer io.Writer) error { + count := 0 + stream := helpers.NewStream(writer) + stream.WriteObjectStart() + if request.items != nil { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("items") + writeHTPasswdUserList(request.items, stream) + count++ + } + if request.page != nil { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("page") + stream.WriteInt(*request.page) + count++ + } + if request.size != nil { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("size") + stream.WriteInt(*request.size) + count++ + } + stream.WriteObjectEnd() + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} +func readHTPasswdUsersImportResponse(response *HTPasswdUsersImportResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "items": + value := readHTPasswdUserList(iterator) + response.items = value + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + default: + iterator.ReadAny() + } + } + return iterator.Error +} +func writeHTPasswdUsersListRequest(request *HTPasswdUsersListRequest, writer io.Writer) error { + return nil +} +func readHTPasswdUsersListResponse(response *HTPasswdUsersListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readHTPasswdUserList(iterator) + response.items = &HTPasswdUserList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/hypershift_builder.go b/clustersmgmt/v2alpha1/hypershift_builder.go new file mode 100644 index 00000000..8d45f457 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HypershiftBuilder contains the data and logic needed to build 'hypershift' objects. +// +// Hypershift configuration. +type HypershiftBuilder struct { + bitmap_ uint32 + enabled bool +} + +// NewHypershift creates a new builder of 'hypershift' objects. +func NewHypershift() *HypershiftBuilder { + return &HypershiftBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *HypershiftBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *HypershiftBuilder) Enabled(value bool) *HypershiftBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *HypershiftBuilder) Copy(object *Hypershift) *HypershiftBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + return b +} + +// Build creates a 'hypershift' object using the configuration stored in the builder. +func (b *HypershiftBuilder) Build() (object *Hypershift, err error) { + object = new(Hypershift) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + return +} diff --git a/clustersmgmt/v2alpha1/hypershift_client.go b/clustersmgmt/v2alpha1/hypershift_client.go new file mode 100644 index 00000000..fbb5f5e4 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_client.go @@ -0,0 +1,461 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// HypershiftClient is the client of the 'hypershift' resource. +// +// Manages a specific Hypershift cluster. +type HypershiftClient struct { + transport http.RoundTripper + path string +} + +// NewHypershiftClient creates a new client for the 'hypershift' +// resource using the given transport to send the requests and receive the +// responses. +func NewHypershiftClient(transport http.RoundTripper, path string) *HypershiftClient { + return &HypershiftClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the Hypershift details for a single cluster. +func (c *HypershiftClient) Get() *HypershiftGetRequest { + return &HypershiftGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the Hypershift details for a single cluster. +func (c *HypershiftClient) Update() *HypershiftUpdateRequest { + return &HypershiftUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// HypershiftPollRequest is the request for the Poll method. +type HypershiftPollRequest struct { + request *HypershiftGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *HypershiftPollRequest) Parameter(name string, value interface{}) *HypershiftPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *HypershiftPollRequest) Header(name string, value interface{}) *HypershiftPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *HypershiftPollRequest) Interval(value time.Duration) *HypershiftPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *HypershiftPollRequest) Status(value int) *HypershiftPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *HypershiftPollRequest) Predicate(value func(*HypershiftGetResponse) bool) *HypershiftPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*HypershiftGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *HypershiftPollRequest) StartContext(ctx context.Context) (response *HypershiftPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &HypershiftPollResponse{ + response: result.(*HypershiftGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *HypershiftPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// HypershiftPollResponse is the response for the Poll method. +type HypershiftPollResponse struct { + response *HypershiftGetResponse +} + +// Status returns the response status code. +func (r *HypershiftPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *HypershiftPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *HypershiftPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *HypershiftPollResponse) Body() *HypershiftConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HypershiftPollResponse) GetBody() (value *HypershiftConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *HypershiftClient) Poll() *HypershiftPollRequest { + return &HypershiftPollRequest{ + request: c.Get(), + } +} + +// HypershiftGetRequest is the request for the 'get' method. +type HypershiftGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *HypershiftGetRequest) Parameter(name string, value interface{}) *HypershiftGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HypershiftGetRequest) Header(name string, value interface{}) *HypershiftGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HypershiftGetRequest) Impersonate(user string) *HypershiftGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HypershiftGetRequest) Send() (result *HypershiftGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HypershiftGetRequest) SendContext(ctx context.Context) (result *HypershiftGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HypershiftGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHypershiftGetResponse(result, reader) + if err != nil { + return + } + return +} + +// HypershiftGetResponse is the response for the 'get' method. +type HypershiftGetResponse struct { + status int + header http.Header + err *errors.Error + body *HypershiftConfig +} + +// Status returns the response status code. +func (r *HypershiftGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HypershiftGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HypershiftGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *HypershiftGetResponse) Body() *HypershiftConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HypershiftGetResponse) GetBody() (value *HypershiftConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// HypershiftUpdateRequest is the request for the 'update' method. +type HypershiftUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *HypershiftConfig +} + +// Parameter adds a query parameter. +func (r *HypershiftUpdateRequest) Parameter(name string, value interface{}) *HypershiftUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *HypershiftUpdateRequest) Header(name string, value interface{}) *HypershiftUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *HypershiftUpdateRequest) Impersonate(user string) *HypershiftUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *HypershiftUpdateRequest) Body(value *HypershiftConfig) *HypershiftUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *HypershiftUpdateRequest) Send() (result *HypershiftUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *HypershiftUpdateRequest) SendContext(ctx context.Context) (result *HypershiftUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeHypershiftUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &HypershiftUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readHypershiftUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// HypershiftUpdateResponse is the response for the 'update' method. +type HypershiftUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *HypershiftConfig +} + +// Status returns the response status code. +func (r *HypershiftUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *HypershiftUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *HypershiftUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *HypershiftUpdateResponse) Body() *HypershiftConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *HypershiftUpdateResponse) GetBody() (value *HypershiftConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/hypershift_config_builder.go b/clustersmgmt/v2alpha1/hypershift_config_builder.go new file mode 100644 index 00000000..5957e132 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_config_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HypershiftConfigBuilder contains the data and logic needed to build 'hypershift_config' objects. +// +// Hypershift configuration. +type HypershiftConfigBuilder struct { + bitmap_ uint32 + managementCluster string + enabled bool +} + +// NewHypershiftConfig creates a new builder of 'hypershift_config' objects. +func NewHypershiftConfig() *HypershiftConfigBuilder { + return &HypershiftConfigBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *HypershiftConfigBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *HypershiftConfigBuilder) Enabled(value bool) *HypershiftConfigBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// ManagementCluster sets the value of the 'management_cluster' attribute to the given value. +func (b *HypershiftConfigBuilder) ManagementCluster(value string) *HypershiftConfigBuilder { + b.managementCluster = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *HypershiftConfigBuilder) Copy(object *HypershiftConfig) *HypershiftConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + b.managementCluster = object.managementCluster + return b +} + +// Build creates a 'hypershift_config' object using the configuration stored in the builder. +func (b *HypershiftConfigBuilder) Build() (object *HypershiftConfig, err error) { + object = new(HypershiftConfig) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + object.managementCluster = b.managementCluster + return +} diff --git a/clustersmgmt/v2alpha1/hypershift_config_list_builder.go b/clustersmgmt/v2alpha1/hypershift_config_list_builder.go new file mode 100644 index 00000000..f34a3f45 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HypershiftConfigListBuilder contains the data and logic needed to build +// 'hypershift_config' objects. +type HypershiftConfigListBuilder struct { + items []*HypershiftConfigBuilder +} + +// NewHypershiftConfigList creates a new builder of 'hypershift_config' objects. +func NewHypershiftConfigList() *HypershiftConfigListBuilder { + return new(HypershiftConfigListBuilder) +} + +// Items sets the items of the list. +func (b *HypershiftConfigListBuilder) Items(values ...*HypershiftConfigBuilder) *HypershiftConfigListBuilder { + b.items = make([]*HypershiftConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *HypershiftConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *HypershiftConfigListBuilder) Copy(list *HypershiftConfigList) *HypershiftConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*HypershiftConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewHypershiftConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'hypershift_config' objects using the +// configuration stored in the builder. +func (b *HypershiftConfigListBuilder) Build() (list *HypershiftConfigList, err error) { + items := make([]*HypershiftConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(HypershiftConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/hypershift_config_list_type_json.go b/clustersmgmt/v2alpha1/hypershift_config_list_type_json.go new file mode 100644 index 00000000..bd45e8b4 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHypershiftConfigList writes a list of values of the 'hypershift_config' type to +// the given writer. +func MarshalHypershiftConfigList(list []*HypershiftConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHypershiftConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHypershiftConfigList writes a list of value of the 'hypershift_config' type to +// the given stream. +func writeHypershiftConfigList(list []*HypershiftConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeHypershiftConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalHypershiftConfigList reads a list of values of the 'hypershift_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalHypershiftConfigList(source interface{}) (items []*HypershiftConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readHypershiftConfigList(iterator) + err = iterator.Error + return +} + +// readHypershiftConfigList reads list of values of the ”hypershift_config' type from +// the given iterator. +func readHypershiftConfigList(iterator *jsoniter.Iterator) []*HypershiftConfig { + list := []*HypershiftConfig{} + for iterator.ReadArray() { + item := readHypershiftConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/hypershift_config_type.go b/clustersmgmt/v2alpha1/hypershift_config_type.go new file mode 100644 index 00000000..7b3f98a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_config_type.go @@ -0,0 +1,178 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HypershiftConfig represents the values of the 'hypershift_config' type. +// +// Hypershift configuration. +type HypershiftConfig struct { + bitmap_ uint32 + managementCluster string + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *HypershiftConfig) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Boolean flag indicating if the cluster should be creating using _Hypershift_. +// +// By default this is `false`. +// +// To enable it the cluster needs to be ROSA cluster and the organization of the user needs +// to have the `hypershift` capability enabled. +func (o *HypershiftConfig) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Boolean flag indicating if the cluster should be creating using _Hypershift_. +// +// By default this is `false`. +// +// To enable it the cluster needs to be ROSA cluster and the organization of the user needs +// to have the `hypershift` capability enabled. +func (o *HypershiftConfig) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// ManagementCluster returns the value of the 'management_cluster' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the name of the current management cluster for this Hypershift cluster. +// Empty for non Hypershift clusters. +func (o *HypershiftConfig) ManagementCluster() string { + if o != nil && o.bitmap_&2 != 0 { + return o.managementCluster + } + return "" +} + +// GetManagementCluster returns the value of the 'management_cluster' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the name of the current management cluster for this Hypershift cluster. +// Empty for non Hypershift clusters. +func (o *HypershiftConfig) GetManagementCluster() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.managementCluster + } + return +} + +// HypershiftConfigListKind is the name of the type used to represent list of objects of +// type 'hypershift_config'. +const HypershiftConfigListKind = "HypershiftConfigList" + +// HypershiftConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'hypershift_config'. +const HypershiftConfigListLinkKind = "HypershiftConfigListLink" + +// HypershiftConfigNilKind is the name of the type used to nil lists of objects of +// type 'hypershift_config'. +const HypershiftConfigListNilKind = "HypershiftConfigListNil" + +// HypershiftConfigList is a list of values of the 'hypershift_config' type. +type HypershiftConfigList struct { + href string + link bool + items []*HypershiftConfig +} + +// Len returns the length of the list. +func (l *HypershiftConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *HypershiftConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *HypershiftConfigList) Get(i int) *HypershiftConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *HypershiftConfigList) Slice() []*HypershiftConfig { + var slice []*HypershiftConfig + if l == nil { + slice = make([]*HypershiftConfig, 0) + } else { + slice = make([]*HypershiftConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *HypershiftConfigList) Each(f func(item *HypershiftConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *HypershiftConfigList) Range(f func(index int, item *HypershiftConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/hypershift_config_type_json.go b/clustersmgmt/v2alpha1/hypershift_config_type_json.go new file mode 100644 index 00000000..8b4224b0 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_config_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHypershiftConfig writes a value of the 'hypershift_config' type to the given writer. +func MarshalHypershiftConfig(object *HypershiftConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHypershiftConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHypershiftConfig writes a value of the 'hypershift_config' type to the given stream. +func writeHypershiftConfig(object *HypershiftConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("management_cluster") + stream.WriteString(object.managementCluster) + } + stream.WriteObjectEnd() +} + +// UnmarshalHypershiftConfig reads a value of the 'hypershift_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalHypershiftConfig(source interface{}) (object *HypershiftConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readHypershiftConfig(iterator) + err = iterator.Error + return +} + +// readHypershiftConfig reads a value of the 'hypershift_config' type from the given iterator. +func readHypershiftConfig(iterator *jsoniter.Iterator) *HypershiftConfig { + object := &HypershiftConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + case "management_cluster": + value := iterator.ReadString() + object.managementCluster = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/hypershift_list_builder.go b/clustersmgmt/v2alpha1/hypershift_list_builder.go new file mode 100644 index 00000000..b43db4a9 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// HypershiftListBuilder contains the data and logic needed to build +// 'hypershift' objects. +type HypershiftListBuilder struct { + items []*HypershiftBuilder +} + +// NewHypershiftList creates a new builder of 'hypershift' objects. +func NewHypershiftList() *HypershiftListBuilder { + return new(HypershiftListBuilder) +} + +// Items sets the items of the list. +func (b *HypershiftListBuilder) Items(values ...*HypershiftBuilder) *HypershiftListBuilder { + b.items = make([]*HypershiftBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *HypershiftListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *HypershiftListBuilder) Copy(list *HypershiftList) *HypershiftListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*HypershiftBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewHypershift().Copy(v) + } + } + return b +} + +// Build creates a list of 'hypershift' objects using the +// configuration stored in the builder. +func (b *HypershiftListBuilder) Build() (list *HypershiftList, err error) { + items := make([]*Hypershift, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(HypershiftList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/hypershift_list_type_json.go b/clustersmgmt/v2alpha1/hypershift_list_type_json.go new file mode 100644 index 00000000..dca4f7da --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHypershiftList writes a list of values of the 'hypershift' type to +// the given writer. +func MarshalHypershiftList(list []*Hypershift, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHypershiftList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHypershiftList writes a list of value of the 'hypershift' type to +// the given stream. +func writeHypershiftList(list []*Hypershift, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeHypershift(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalHypershiftList reads a list of values of the 'hypershift' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalHypershiftList(source interface{}) (items []*Hypershift, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readHypershiftList(iterator) + err = iterator.Error + return +} + +// readHypershiftList reads list of values of the ”hypershift' type from +// the given iterator. +func readHypershiftList(iterator *jsoniter.Iterator) []*Hypershift { + list := []*Hypershift{} + for iterator.ReadArray() { + item := readHypershift(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/hypershift_resource_json.go b/clustersmgmt/v2alpha1/hypershift_resource_json.go new file mode 100644 index 00000000..a97af4f1 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeHypershiftGetRequest(request *HypershiftGetRequest, writer io.Writer) error { + return nil +} +func readHypershiftGetResponse(response *HypershiftGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalHypershiftConfig(reader) + return err +} +func writeHypershiftUpdateRequest(request *HypershiftUpdateRequest, writer io.Writer) error { + return MarshalHypershiftConfig(request.body, writer) +} +func readHypershiftUpdateResponse(response *HypershiftUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalHypershiftConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/hypershift_type.go b/clustersmgmt/v2alpha1/hypershift_type.go new file mode 100644 index 00000000..e7bc868b --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_type.go @@ -0,0 +1,152 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Hypershift represents the values of the 'hypershift' type. +// +// Hypershift configuration. +type Hypershift struct { + bitmap_ uint32 + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Hypershift) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Boolean flag indicating if the cluster should be creating using _Hypershift_. +// +// By default this is `false`. +// +// To enable it the cluster needs to be ROSA cluster and the organization of the user needs +// to have the `hypershift` capability enabled. +func (o *Hypershift) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Boolean flag indicating if the cluster should be creating using _Hypershift_. +// +// By default this is `false`. +// +// To enable it the cluster needs to be ROSA cluster and the organization of the user needs +// to have the `hypershift` capability enabled. +func (o *Hypershift) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// HypershiftListKind is the name of the type used to represent list of objects of +// type 'hypershift'. +const HypershiftListKind = "HypershiftList" + +// HypershiftListLinkKind is the name of the type used to represent links to list +// of objects of type 'hypershift'. +const HypershiftListLinkKind = "HypershiftListLink" + +// HypershiftNilKind is the name of the type used to nil lists of objects of +// type 'hypershift'. +const HypershiftListNilKind = "HypershiftListNil" + +// HypershiftList is a list of values of the 'hypershift' type. +type HypershiftList struct { + href string + link bool + items []*Hypershift +} + +// Len returns the length of the list. +func (l *HypershiftList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *HypershiftList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *HypershiftList) Get(i int) *Hypershift { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *HypershiftList) Slice() []*Hypershift { + var slice []*Hypershift + if l == nil { + slice = make([]*Hypershift, 0) + } else { + slice = make([]*Hypershift, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *HypershiftList) Each(f func(item *Hypershift) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *HypershiftList) Range(f func(index int, item *Hypershift) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/hypershift_type_json.go b/clustersmgmt/v2alpha1/hypershift_type_json.go new file mode 100644 index 00000000..a92ecbd8 --- /dev/null +++ b/clustersmgmt/v2alpha1/hypershift_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalHypershift writes a value of the 'hypershift' type to the given writer. +func MarshalHypershift(object *Hypershift, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeHypershift(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeHypershift writes a value of the 'hypershift' type to the given stream. +func writeHypershift(object *Hypershift, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + } + stream.WriteObjectEnd() +} + +// UnmarshalHypershift reads a value of the 'hypershift' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalHypershift(source interface{}) (object *Hypershift, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readHypershift(iterator) + err = iterator.Error + return +} + +// readHypershift reads a value of the 'hypershift' type from the given iterator. +func readHypershift(iterator *jsoniter.Iterator) *Hypershift { + object := &Hypershift{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/identity_provider_builder.go b/clustersmgmt/v2alpha1/identity_provider_builder.go new file mode 100644 index 00000000..a13cc5ec --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_builder.go @@ -0,0 +1,283 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IdentityProviderBuilder contains the data and logic needed to build 'identity_provider' objects. +// +// Representation of an identity provider. +type IdentityProviderBuilder struct { + bitmap_ uint32 + id string + href string + ldap *LDAPIdentityProviderBuilder + github *GithubIdentityProviderBuilder + gitlab *GitlabIdentityProviderBuilder + google *GoogleIdentityProviderBuilder + htpasswd *HTPasswdIdentityProviderBuilder + mappingMethod IdentityProviderMappingMethod + name string + openID *OpenIDIdentityProviderBuilder + type_ IdentityProviderType + challenge bool + login bool +} + +// NewIdentityProvider creates a new builder of 'identity_provider' objects. +func NewIdentityProvider() *IdentityProviderBuilder { + return &IdentityProviderBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *IdentityProviderBuilder) Link(value bool) *IdentityProviderBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *IdentityProviderBuilder) ID(value string) *IdentityProviderBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *IdentityProviderBuilder) HREF(value string) *IdentityProviderBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *IdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// LDAP sets the value of the 'LDAP' attribute to the given value. +// +// Details for `ldap` identity providers. +func (b *IdentityProviderBuilder) LDAP(value *LDAPIdentityProviderBuilder) *IdentityProviderBuilder { + b.ldap = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Challenge sets the value of the 'challenge' attribute to the given value. +func (b *IdentityProviderBuilder) Challenge(value bool) *IdentityProviderBuilder { + b.challenge = value + b.bitmap_ |= 16 + return b +} + +// Github sets the value of the 'github' attribute to the given value. +// +// Details for `github` identity providers. +func (b *IdentityProviderBuilder) Github(value *GithubIdentityProviderBuilder) *IdentityProviderBuilder { + b.github = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Gitlab sets the value of the 'gitlab' attribute to the given value. +// +// Details for `gitlab` identity providers. +func (b *IdentityProviderBuilder) Gitlab(value *GitlabIdentityProviderBuilder) *IdentityProviderBuilder { + b.gitlab = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// Google sets the value of the 'google' attribute to the given value. +// +// Details for `google` identity providers. +func (b *IdentityProviderBuilder) Google(value *GoogleIdentityProviderBuilder) *IdentityProviderBuilder { + b.google = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// Htpasswd sets the value of the 'htpasswd' attribute to the given value. +// +// Details for `htpasswd` identity providers. +func (b *IdentityProviderBuilder) Htpasswd(value *HTPasswdIdentityProviderBuilder) *IdentityProviderBuilder { + b.htpasswd = value + if value != nil { + b.bitmap_ |= 256 + } else { + b.bitmap_ &^= 256 + } + return b +} + +// Login sets the value of the 'login' attribute to the given value. +func (b *IdentityProviderBuilder) Login(value bool) *IdentityProviderBuilder { + b.login = value + b.bitmap_ |= 512 + return b +} + +// MappingMethod sets the value of the 'mapping_method' attribute to the given value. +// +// Controls how mappings are established between provider identities and user objects. +func (b *IdentityProviderBuilder) MappingMethod(value IdentityProviderMappingMethod) *IdentityProviderBuilder { + b.mappingMethod = value + b.bitmap_ |= 1024 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *IdentityProviderBuilder) Name(value string) *IdentityProviderBuilder { + b.name = value + b.bitmap_ |= 2048 + return b +} + +// OpenID sets the value of the 'open_ID' attribute to the given value. +// +// Details for `openid` identity providers. +func (b *IdentityProviderBuilder) OpenID(value *OpenIDIdentityProviderBuilder) *IdentityProviderBuilder { + b.openID = value + if value != nil { + b.bitmap_ |= 4096 + } else { + b.bitmap_ &^= 4096 + } + return b +} + +// Type sets the value of the 'type' attribute to the given value. +// +// Type of identity provider. +func (b *IdentityProviderBuilder) Type(value IdentityProviderType) *IdentityProviderBuilder { + b.type_ = value + b.bitmap_ |= 8192 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *IdentityProviderBuilder) Copy(object *IdentityProvider) *IdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.ldap != nil { + b.ldap = NewLDAPIdentityProvider().Copy(object.ldap) + } else { + b.ldap = nil + } + b.challenge = object.challenge + if object.github != nil { + b.github = NewGithubIdentityProvider().Copy(object.github) + } else { + b.github = nil + } + if object.gitlab != nil { + b.gitlab = NewGitlabIdentityProvider().Copy(object.gitlab) + } else { + b.gitlab = nil + } + if object.google != nil { + b.google = NewGoogleIdentityProvider().Copy(object.google) + } else { + b.google = nil + } + if object.htpasswd != nil { + b.htpasswd = NewHTPasswdIdentityProvider().Copy(object.htpasswd) + } else { + b.htpasswd = nil + } + b.login = object.login + b.mappingMethod = object.mappingMethod + b.name = object.name + if object.openID != nil { + b.openID = NewOpenIDIdentityProvider().Copy(object.openID) + } else { + b.openID = nil + } + b.type_ = object.type_ + return b +} + +// Build creates a 'identity_provider' object using the configuration stored in the builder. +func (b *IdentityProviderBuilder) Build() (object *IdentityProvider, err error) { + object = new(IdentityProvider) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.ldap != nil { + object.ldap, err = b.ldap.Build() + if err != nil { + return + } + } + object.challenge = b.challenge + if b.github != nil { + object.github, err = b.github.Build() + if err != nil { + return + } + } + if b.gitlab != nil { + object.gitlab, err = b.gitlab.Build() + if err != nil { + return + } + } + if b.google != nil { + object.google, err = b.google.Build() + if err != nil { + return + } + } + if b.htpasswd != nil { + object.htpasswd, err = b.htpasswd.Build() + if err != nil { + return + } + } + object.login = b.login + object.mappingMethod = b.mappingMethod + object.name = b.name + if b.openID != nil { + object.openID, err = b.openID.Build() + if err != nil { + return + } + } + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/identity_provider_client.go b/clustersmgmt/v2alpha1/identity_provider_client.go new file mode 100644 index 00000000..53ab9b9a --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_client.go @@ -0,0 +1,589 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// IdentityProviderClient is the client of the 'identity_provider' resource. +// +// Manages a specific identity provider. +type IdentityProviderClient struct { + transport http.RoundTripper + path string +} + +// NewIdentityProviderClient creates a new client for the 'identity_provider' +// resource using the given transport to send the requests and receive the +// responses. +func NewIdentityProviderClient(transport http.RoundTripper, path string) *IdentityProviderClient { + return &IdentityProviderClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the identity provider. +func (c *IdentityProviderClient) Delete() *IdentityProviderDeleteRequest { + return &IdentityProviderDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the identity provider. +func (c *IdentityProviderClient) Get() *IdentityProviderGetRequest { + return &IdentityProviderGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update identity provider in the cluster. +func (c *IdentityProviderClient) Update() *IdentityProviderUpdateRequest { + return &IdentityProviderUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// HtpasswdUsers returns the target 'HT_passwd_users' resource. +// +// Reference to the resource that manages the collection of _HTPasswd_ IDP users +func (c *IdentityProviderClient) HtpasswdUsers() *HTPasswdUsersClient { + return NewHTPasswdUsersClient( + c.transport, + path.Join(c.path, "htpasswd_users"), + ) +} + +// IdentityProviderPollRequest is the request for the Poll method. +type IdentityProviderPollRequest struct { + request *IdentityProviderGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *IdentityProviderPollRequest) Parameter(name string, value interface{}) *IdentityProviderPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *IdentityProviderPollRequest) Header(name string, value interface{}) *IdentityProviderPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *IdentityProviderPollRequest) Interval(value time.Duration) *IdentityProviderPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *IdentityProviderPollRequest) Status(value int) *IdentityProviderPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *IdentityProviderPollRequest) Predicate(value func(*IdentityProviderGetResponse) bool) *IdentityProviderPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*IdentityProviderGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *IdentityProviderPollRequest) StartContext(ctx context.Context) (response *IdentityProviderPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &IdentityProviderPollResponse{ + response: result.(*IdentityProviderGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *IdentityProviderPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// IdentityProviderPollResponse is the response for the Poll method. +type IdentityProviderPollResponse struct { + response *IdentityProviderGetResponse +} + +// Status returns the response status code. +func (r *IdentityProviderPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *IdentityProviderPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *IdentityProviderPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *IdentityProviderPollResponse) Body() *IdentityProvider { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IdentityProviderPollResponse) GetBody() (value *IdentityProvider, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *IdentityProviderClient) Poll() *IdentityProviderPollRequest { + return &IdentityProviderPollRequest{ + request: c.Get(), + } +} + +// IdentityProviderDeleteRequest is the request for the 'delete' method. +type IdentityProviderDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *IdentityProviderDeleteRequest) Parameter(name string, value interface{}) *IdentityProviderDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IdentityProviderDeleteRequest) Header(name string, value interface{}) *IdentityProviderDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IdentityProviderDeleteRequest) Impersonate(user string) *IdentityProviderDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IdentityProviderDeleteRequest) Send() (result *IdentityProviderDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IdentityProviderDeleteRequest) SendContext(ctx context.Context) (result *IdentityProviderDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IdentityProviderDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// IdentityProviderDeleteResponse is the response for the 'delete' method. +type IdentityProviderDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *IdentityProviderDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IdentityProviderDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IdentityProviderDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// IdentityProviderGetRequest is the request for the 'get' method. +type IdentityProviderGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *IdentityProviderGetRequest) Parameter(name string, value interface{}) *IdentityProviderGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IdentityProviderGetRequest) Header(name string, value interface{}) *IdentityProviderGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IdentityProviderGetRequest) Impersonate(user string) *IdentityProviderGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IdentityProviderGetRequest) Send() (result *IdentityProviderGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IdentityProviderGetRequest) SendContext(ctx context.Context) (result *IdentityProviderGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IdentityProviderGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIdentityProviderGetResponse(result, reader) + if err != nil { + return + } + return +} + +// IdentityProviderGetResponse is the response for the 'get' method. +type IdentityProviderGetResponse struct { + status int + header http.Header + err *errors.Error + body *IdentityProvider +} + +// Status returns the response status code. +func (r *IdentityProviderGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IdentityProviderGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IdentityProviderGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *IdentityProviderGetResponse) Body() *IdentityProvider { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IdentityProviderGetResponse) GetBody() (value *IdentityProvider, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// IdentityProviderUpdateRequest is the request for the 'update' method. +type IdentityProviderUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *IdentityProvider +} + +// Parameter adds a query parameter. +func (r *IdentityProviderUpdateRequest) Parameter(name string, value interface{}) *IdentityProviderUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IdentityProviderUpdateRequest) Header(name string, value interface{}) *IdentityProviderUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IdentityProviderUpdateRequest) Impersonate(user string) *IdentityProviderUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *IdentityProviderUpdateRequest) Body(value *IdentityProvider) *IdentityProviderUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IdentityProviderUpdateRequest) Send() (result *IdentityProviderUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IdentityProviderUpdateRequest) SendContext(ctx context.Context) (result *IdentityProviderUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeIdentityProviderUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IdentityProviderUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIdentityProviderUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// IdentityProviderUpdateResponse is the response for the 'update' method. +type IdentityProviderUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *IdentityProvider +} + +// Status returns the response status code. +func (r *IdentityProviderUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IdentityProviderUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IdentityProviderUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *IdentityProviderUpdateResponse) Body() *IdentityProvider { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IdentityProviderUpdateResponse) GetBody() (value *IdentityProvider, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/identity_provider_list_builder.go b/clustersmgmt/v2alpha1/identity_provider_list_builder.go new file mode 100644 index 00000000..39d9a4be --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IdentityProviderListBuilder contains the data and logic needed to build +// 'identity_provider' objects. +type IdentityProviderListBuilder struct { + items []*IdentityProviderBuilder +} + +// NewIdentityProviderList creates a new builder of 'identity_provider' objects. +func NewIdentityProviderList() *IdentityProviderListBuilder { + return new(IdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *IdentityProviderListBuilder) Items(values ...*IdentityProviderBuilder) *IdentityProviderListBuilder { + b.items = make([]*IdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *IdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *IdentityProviderListBuilder) Copy(list *IdentityProviderList) *IdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*IdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'identity_provider' objects using the +// configuration stored in the builder. +func (b *IdentityProviderListBuilder) Build() (list *IdentityProviderList, err error) { + items := make([]*IdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(IdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/identity_provider_list_type_json.go new file mode 100644 index 00000000..f0b04c9c --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIdentityProviderList writes a list of values of the 'identity_provider' type to +// the given writer. +func MarshalIdentityProviderList(list []*IdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIdentityProviderList writes a list of value of the 'identity_provider' type to +// the given stream. +func writeIdentityProviderList(list []*IdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalIdentityProviderList reads a list of values of the 'identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalIdentityProviderList(source interface{}) (items []*IdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readIdentityProviderList reads list of values of the ”identity_provider' type from +// the given iterator. +func readIdentityProviderList(iterator *jsoniter.Iterator) []*IdentityProvider { + list := []*IdentityProvider{} + for iterator.ReadArray() { + item := readIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/identity_provider_mapping_method_list_type_json.go b/clustersmgmt/v2alpha1/identity_provider_mapping_method_list_type_json.go new file mode 100644 index 00000000..470306cf --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_mapping_method_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIdentityProviderMappingMethodList writes a list of values of the 'identity_provider_mapping_method' type to +// the given writer. +func MarshalIdentityProviderMappingMethodList(list []IdentityProviderMappingMethod, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIdentityProviderMappingMethodList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIdentityProviderMappingMethodList writes a list of value of the 'identity_provider_mapping_method' type to +// the given stream. +func writeIdentityProviderMappingMethodList(list []IdentityProviderMappingMethod, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalIdentityProviderMappingMethodList reads a list of values of the 'identity_provider_mapping_method' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalIdentityProviderMappingMethodList(source interface{}) (items []IdentityProviderMappingMethod, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readIdentityProviderMappingMethodList(iterator) + err = iterator.Error + return +} + +// readIdentityProviderMappingMethodList reads list of values of the ”identity_provider_mapping_method' type from +// the given iterator. +func readIdentityProviderMappingMethodList(iterator *jsoniter.Iterator) []IdentityProviderMappingMethod { + list := []IdentityProviderMappingMethod{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := IdentityProviderMappingMethod(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/identity_provider_mapping_method_type.go b/clustersmgmt/v2alpha1/identity_provider_mapping_method_type.go new file mode 100644 index 00000000..de51201a --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_mapping_method_type.go @@ -0,0 +1,34 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IdentityProviderMappingMethod represents the values of the 'identity_provider_mapping_method' enumerated type. +type IdentityProviderMappingMethod string + +const ( + // + IdentityProviderMappingMethodAdd IdentityProviderMappingMethod = "add" + // + IdentityProviderMappingMethodClaim IdentityProviderMappingMethod = "claim" + // + IdentityProviderMappingMethodGenerate IdentityProviderMappingMethod = "generate" + // + IdentityProviderMappingMethodLookup IdentityProviderMappingMethod = "lookup" +) diff --git a/clustersmgmt/v2alpha1/identity_provider_resource_json.go b/clustersmgmt/v2alpha1/identity_provider_resource_json.go new file mode 100644 index 00000000..ba93cfcc --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeIdentityProviderDeleteRequest(request *IdentityProviderDeleteRequest, writer io.Writer) error { + return nil +} +func readIdentityProviderDeleteResponse(response *IdentityProviderDeleteResponse, reader io.Reader) error { + return nil +} +func writeIdentityProviderGetRequest(request *IdentityProviderGetRequest, writer io.Writer) error { + return nil +} +func readIdentityProviderGetResponse(response *IdentityProviderGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIdentityProvider(reader) + return err +} +func writeIdentityProviderUpdateRequest(request *IdentityProviderUpdateRequest, writer io.Writer) error { + return MarshalIdentityProvider(request.body, writer) +} +func readIdentityProviderUpdateResponse(response *IdentityProviderUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIdentityProvider(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/identity_provider_type.go b/clustersmgmt/v2alpha1/identity_provider_type.go new file mode 100644 index 00000000..e16d6d50 --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_type.go @@ -0,0 +1,492 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IdentityProviderKind is the name of the type used to represent objects +// of type 'identity_provider'. +const IdentityProviderKind = "IdentityProvider" + +// IdentityProviderLinkKind is the name of the type used to represent links +// to objects of type 'identity_provider'. +const IdentityProviderLinkKind = "IdentityProviderLink" + +// IdentityProviderNilKind is the name of the type used to nil references +// to objects of type 'identity_provider'. +const IdentityProviderNilKind = "IdentityProviderNil" + +// IdentityProvider represents the values of the 'identity_provider' type. +// +// Representation of an identity provider. +type IdentityProvider struct { + bitmap_ uint32 + id string + href string + ldap *LDAPIdentityProvider + github *GithubIdentityProvider + gitlab *GitlabIdentityProvider + google *GoogleIdentityProvider + htpasswd *HTPasswdIdentityProvider + mappingMethod IdentityProviderMappingMethod + name string + openID *OpenIDIdentityProvider + type_ IdentityProviderType + challenge bool + login bool +} + +// Kind returns the name of the type of the object. +func (o *IdentityProvider) Kind() string { + if o == nil { + return IdentityProviderNilKind + } + if o.bitmap_&1 != 0 { + return IdentityProviderLinkKind + } + return IdentityProviderKind +} + +// Link returns true iif this is a link. +func (o *IdentityProvider) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *IdentityProvider) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *IdentityProvider) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *IdentityProvider) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *IdentityProvider) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *IdentityProvider) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// LDAP returns the value of the 'LDAP' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `ldap` identity providers. +func (o *IdentityProvider) LDAP() *LDAPIdentityProvider { + if o != nil && o.bitmap_&8 != 0 { + return o.ldap + } + return nil +} + +// GetLDAP returns the value of the 'LDAP' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `ldap` identity providers. +func (o *IdentityProvider) GetLDAP() (value *LDAPIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.ldap + } + return +} + +// Challenge returns the value of the 'challenge' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// When `true` unauthenticated token requests from non-web clients (like the CLI) are sent a +// `WWW-Authenticate` challenge header for this provider. +func (o *IdentityProvider) Challenge() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.challenge + } + return false +} + +// GetChallenge returns the value of the 'challenge' attribute and +// a flag indicating if the attribute has a value. +// +// When `true` unauthenticated token requests from non-web clients (like the CLI) are sent a +// `WWW-Authenticate` challenge header for this provider. +func (o *IdentityProvider) GetChallenge() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.challenge + } + return +} + +// Github returns the value of the 'github' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `github` identity providers. +func (o *IdentityProvider) Github() *GithubIdentityProvider { + if o != nil && o.bitmap_&32 != 0 { + return o.github + } + return nil +} + +// GetGithub returns the value of the 'github' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `github` identity providers. +func (o *IdentityProvider) GetGithub() (value *GithubIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.github + } + return +} + +// Gitlab returns the value of the 'gitlab' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `gitlab` identity providers. +func (o *IdentityProvider) Gitlab() *GitlabIdentityProvider { + if o != nil && o.bitmap_&64 != 0 { + return o.gitlab + } + return nil +} + +// GetGitlab returns the value of the 'gitlab' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `gitlab` identity providers. +func (o *IdentityProvider) GetGitlab() (value *GitlabIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.gitlab + } + return +} + +// Google returns the value of the 'google' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `google` identity providers. +func (o *IdentityProvider) Google() *GoogleIdentityProvider { + if o != nil && o.bitmap_&128 != 0 { + return o.google + } + return nil +} + +// GetGoogle returns the value of the 'google' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `google` identity providers. +func (o *IdentityProvider) GetGoogle() (value *GoogleIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.google + } + return +} + +// Htpasswd returns the value of the 'htpasswd' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `htpasswd` identity providers. +func (o *IdentityProvider) Htpasswd() *HTPasswdIdentityProvider { + if o != nil && o.bitmap_&256 != 0 { + return o.htpasswd + } + return nil +} + +// GetHtpasswd returns the value of the 'htpasswd' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `htpasswd` identity providers. +func (o *IdentityProvider) GetHtpasswd() (value *HTPasswdIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.htpasswd + } + return +} + +// Login returns the value of the 'login' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// When `true` unauthenticated token requests from web clients (like the web console) are +// redirected to the authorize URL to log in. +func (o *IdentityProvider) Login() bool { + if o != nil && o.bitmap_&512 != 0 { + return o.login + } + return false +} + +// GetLogin returns the value of the 'login' attribute and +// a flag indicating if the attribute has a value. +// +// When `true` unauthenticated token requests from web clients (like the web console) are +// redirected to the authorize URL to log in. +func (o *IdentityProvider) GetLogin() (value bool, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.login + } + return +} + +// MappingMethod returns the value of the 'mapping_method' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Controls how mappings are established between this provider's identities and user +// objects. +func (o *IdentityProvider) MappingMethod() IdentityProviderMappingMethod { + if o != nil && o.bitmap_&1024 != 0 { + return o.mappingMethod + } + return IdentityProviderMappingMethod("") +} + +// GetMappingMethod returns the value of the 'mapping_method' attribute and +// a flag indicating if the attribute has a value. +// +// Controls how mappings are established between this provider's identities and user +// objects. +func (o *IdentityProvider) GetMappingMethod() (value IdentityProviderMappingMethod, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.mappingMethod + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The name of the identity provider. +func (o *IdentityProvider) Name() string { + if o != nil && o.bitmap_&2048 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// The name of the identity provider. +func (o *IdentityProvider) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.name + } + return +} + +// OpenID returns the value of the 'open_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for `openid` identity providers. +func (o *IdentityProvider) OpenID() *OpenIDIdentityProvider { + if o != nil && o.bitmap_&4096 != 0 { + return o.openID + } + return nil +} + +// GetOpenID returns the value of the 'open_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Details for `openid` identity providers. +func (o *IdentityProvider) GetOpenID() (value *OpenIDIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.openID + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Type of identity provider. The rest of the attributes will be populated according to this +// value. For example, if the type is `github` then only the `github` attribute will be +// populated. +func (o *IdentityProvider) Type() IdentityProviderType { + if o != nil && o.bitmap_&8192 != 0 { + return o.type_ + } + return IdentityProviderType("") +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// Type of identity provider. The rest of the attributes will be populated according to this +// value. For example, if the type is `github` then only the `github` attribute will be +// populated. +func (o *IdentityProvider) GetType() (value IdentityProviderType, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.type_ + } + return +} + +// IdentityProviderListKind is the name of the type used to represent list of objects of +// type 'identity_provider'. +const IdentityProviderListKind = "IdentityProviderList" + +// IdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'identity_provider'. +const IdentityProviderListLinkKind = "IdentityProviderListLink" + +// IdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'identity_provider'. +const IdentityProviderListNilKind = "IdentityProviderListNil" + +// IdentityProviderList is a list of values of the 'identity_provider' type. +type IdentityProviderList struct { + href string + link bool + items []*IdentityProvider +} + +// Kind returns the name of the type of the object. +func (l *IdentityProviderList) Kind() string { + if l == nil { + return IdentityProviderListNilKind + } + if l.link { + return IdentityProviderListLinkKind + } + return IdentityProviderListKind +} + +// Link returns true iif this is a link. +func (l *IdentityProviderList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *IdentityProviderList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *IdentityProviderList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *IdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *IdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *IdentityProviderList) Get(i int) *IdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *IdentityProviderList) Slice() []*IdentityProvider { + var slice []*IdentityProvider + if l == nil { + slice = make([]*IdentityProvider, 0) + } else { + slice = make([]*IdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *IdentityProviderList) Each(f func(item *IdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *IdentityProviderList) Range(f func(index int, item *IdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/identity_provider_type_json.go b/clustersmgmt/v2alpha1/identity_provider_type_json.go new file mode 100644 index 00000000..2320902f --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_type_json.go @@ -0,0 +1,252 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIdentityProvider writes a value of the 'identity_provider' type to the given writer. +func MarshalIdentityProvider(object *IdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIdentityProvider writes a value of the 'identity_provider' type to the given stream. +func writeIdentityProvider(object *IdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(IdentityProviderLinkKind) + } else { + stream.WriteString(IdentityProviderKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.ldap != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ldap") + writeLDAPIdentityProvider(object.ldap, stream) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("challenge") + stream.WriteBool(object.challenge) + count++ + } + present_ = object.bitmap_&32 != 0 && object.github != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("github") + writeGithubIdentityProvider(object.github, stream) + count++ + } + present_ = object.bitmap_&64 != 0 && object.gitlab != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gitlab") + writeGitlabIdentityProvider(object.gitlab, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.google != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("google") + writeGoogleIdentityProvider(object.google, stream) + count++ + } + present_ = object.bitmap_&256 != 0 && object.htpasswd != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("htpasswd") + writeHTPasswdIdentityProvider(object.htpasswd, stream) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("login") + stream.WriteBool(object.login) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("mapping_method") + stream.WriteString(string(object.mappingMethod)) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&4096 != 0 && object.openID != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("open_id") + writeOpenIDIdentityProvider(object.openID, stream) + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(string(object.type_)) + } + stream.WriteObjectEnd() +} + +// UnmarshalIdentityProvider reads a value of the 'identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalIdentityProvider(source interface{}) (object *IdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readIdentityProvider(iterator) + err = iterator.Error + return +} + +// readIdentityProvider reads a value of the 'identity_provider' type from the given iterator. +func readIdentityProvider(iterator *jsoniter.Iterator) *IdentityProvider { + object := &IdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == IdentityProviderLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "ldap": + value := readLDAPIdentityProvider(iterator) + object.ldap = value + object.bitmap_ |= 8 + case "challenge": + value := iterator.ReadBool() + object.challenge = value + object.bitmap_ |= 16 + case "github": + value := readGithubIdentityProvider(iterator) + object.github = value + object.bitmap_ |= 32 + case "gitlab": + value := readGitlabIdentityProvider(iterator) + object.gitlab = value + object.bitmap_ |= 64 + case "google": + value := readGoogleIdentityProvider(iterator) + object.google = value + object.bitmap_ |= 128 + case "htpasswd": + value := readHTPasswdIdentityProvider(iterator) + object.htpasswd = value + object.bitmap_ |= 256 + case "login": + value := iterator.ReadBool() + object.login = value + object.bitmap_ |= 512 + case "mapping_method": + text := iterator.ReadString() + value := IdentityProviderMappingMethod(text) + object.mappingMethod = value + object.bitmap_ |= 1024 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 2048 + case "open_id": + value := readOpenIDIdentityProvider(iterator) + object.openID = value + object.bitmap_ |= 4096 + case "type": + text := iterator.ReadString() + value := IdentityProviderType(text) + object.type_ = value + object.bitmap_ |= 8192 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/identity_provider_type_list_type_json.go b/clustersmgmt/v2alpha1/identity_provider_type_list_type_json.go new file mode 100644 index 00000000..ea4ad25c --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIdentityProviderTypeList writes a list of values of the 'identity_provider_type' type to +// the given writer. +func MarshalIdentityProviderTypeList(list []IdentityProviderType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIdentityProviderTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIdentityProviderTypeList writes a list of value of the 'identity_provider_type' type to +// the given stream. +func writeIdentityProviderTypeList(list []IdentityProviderType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalIdentityProviderTypeList reads a list of values of the 'identity_provider_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalIdentityProviderTypeList(source interface{}) (items []IdentityProviderType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readIdentityProviderTypeList(iterator) + err = iterator.Error + return +} + +// readIdentityProviderTypeList reads list of values of the ”identity_provider_type' type from +// the given iterator. +func readIdentityProviderTypeList(iterator *jsoniter.Iterator) []IdentityProviderType { + list := []IdentityProviderType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := IdentityProviderType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/identity_provider_type_type.go b/clustersmgmt/v2alpha1/identity_provider_type_type.go new file mode 100644 index 00000000..a80bc9f5 --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_provider_type_type.go @@ -0,0 +1,38 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IdentityProviderType represents the values of the 'identity_provider_type' enumerated type. +type IdentityProviderType string + +const ( + // + IdentityProviderTypeLDAP IdentityProviderType = "LDAPIdentityProvider" + // + IdentityProviderTypeGithub IdentityProviderType = "GithubIdentityProvider" + // + IdentityProviderTypeGitlab IdentityProviderType = "GitlabIdentityProvider" + // + IdentityProviderTypeGoogle IdentityProviderType = "GoogleIdentityProvider" + // + IdentityProviderTypeHtpasswd IdentityProviderType = "HTPasswdIdentityProvider" + // + IdentityProviderTypeOpenID IdentityProviderType = "OpenIDIdentityProvider" +) diff --git a/clustersmgmt/v2alpha1/identity_providers_client.go b/clustersmgmt/v2alpha1/identity_providers_client.go new file mode 100644 index 00000000..96ab56d1 --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_providers_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// IdentityProvidersClient is the client of the 'identity_providers' resource. +// +// Manages the collection of identity providers of a cluster. +type IdentityProvidersClient struct { + transport http.RoundTripper + path string +} + +// NewIdentityProvidersClient creates a new client for the 'identity_providers' +// resource using the given transport to send the requests and receive the +// responses. +func NewIdentityProvidersClient(transport http.RoundTripper, path string) *IdentityProvidersClient { + return &IdentityProvidersClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new identity provider to the cluster. +func (c *IdentityProvidersClient) Add() *IdentityProvidersAddRequest { + return &IdentityProvidersAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of identity providers. +func (c *IdentityProvidersClient) List() *IdentityProvidersListRequest { + return &IdentityProvidersListRequest{ + transport: c.transport, + path: c.path, + } +} + +// IdentityProvider returns the target 'identity_provider' resource for the given identifier. +// +// Reference to the service that manages an specific identity provider. +func (c *IdentityProvidersClient) IdentityProvider(id string) *IdentityProviderClient { + return NewIdentityProviderClient( + c.transport, + path.Join(c.path, id), + ) +} + +// IdentityProvidersAddRequest is the request for the 'add' method. +type IdentityProvidersAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *IdentityProvider +} + +// Parameter adds a query parameter. +func (r *IdentityProvidersAddRequest) Parameter(name string, value interface{}) *IdentityProvidersAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IdentityProvidersAddRequest) Header(name string, value interface{}) *IdentityProvidersAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IdentityProvidersAddRequest) Impersonate(user string) *IdentityProvidersAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the cluster. +func (r *IdentityProvidersAddRequest) Body(value *IdentityProvider) *IdentityProvidersAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IdentityProvidersAddRequest) Send() (result *IdentityProvidersAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IdentityProvidersAddRequest) SendContext(ctx context.Context) (result *IdentityProvidersAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeIdentityProvidersAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IdentityProvidersAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIdentityProvidersAddResponse(result, reader) + if err != nil { + return + } + return +} + +// IdentityProvidersAddResponse is the response for the 'add' method. +type IdentityProvidersAddResponse struct { + status int + header http.Header + err *errors.Error + body *IdentityProvider +} + +// Status returns the response status code. +func (r *IdentityProvidersAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IdentityProvidersAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IdentityProvidersAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the cluster. +func (r *IdentityProvidersAddResponse) Body() *IdentityProvider { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the cluster. +func (r *IdentityProvidersAddResponse) GetBody() (value *IdentityProvider, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// IdentityProvidersListRequest is the request for the 'list' method. +type IdentityProvidersListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *IdentityProvidersListRequest) Parameter(name string, value interface{}) *IdentityProvidersListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IdentityProvidersListRequest) Header(name string, value interface{}) *IdentityProvidersListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IdentityProvidersListRequest) Impersonate(user string) *IdentityProvidersListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *IdentityProvidersListRequest) Page(value int) *IdentityProvidersListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *IdentityProvidersListRequest) Size(value int) *IdentityProvidersListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IdentityProvidersListRequest) Send() (result *IdentityProvidersListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IdentityProvidersListRequest) SendContext(ctx context.Context) (result *IdentityProvidersListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IdentityProvidersListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIdentityProvidersListResponse(result, reader) + if err != nil { + return + } + return +} + +// IdentityProvidersListResponse is the response for the 'list' method. +type IdentityProvidersListResponse struct { + status int + header http.Header + err *errors.Error + items *IdentityProviderList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *IdentityProvidersListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IdentityProvidersListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IdentityProvidersListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of identity providers. +func (r *IdentityProvidersListResponse) Items() *IdentityProviderList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of identity providers. +func (r *IdentityProvidersListResponse) GetItems() (value *IdentityProviderList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *IdentityProvidersListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *IdentityProvidersListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *IdentityProvidersListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *IdentityProvidersListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *IdentityProvidersListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *IdentityProvidersListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/identity_providers_resource_json.go b/clustersmgmt/v2alpha1/identity_providers_resource_json.go new file mode 100644 index 00000000..e5a873cc --- /dev/null +++ b/clustersmgmt/v2alpha1/identity_providers_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeIdentityProvidersAddRequest(request *IdentityProvidersAddRequest, writer io.Writer) error { + return MarshalIdentityProvider(request.body, writer) +} +func readIdentityProvidersAddResponse(response *IdentityProvidersAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIdentityProvider(reader) + return err +} +func writeIdentityProvidersListRequest(request *IdentityProvidersListRequest, writer io.Writer) error { + return nil +} +func readIdentityProvidersListResponse(response *IdentityProvidersListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readIdentityProviderList(iterator) + response.items = &IdentityProviderList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/image_overrides_builder.go b/clustersmgmt/v2alpha1/image_overrides_builder.go new file mode 100644 index 00000000..7318320a --- /dev/null +++ b/clustersmgmt/v2alpha1/image_overrides_builder.go @@ -0,0 +1,131 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ImageOverridesBuilder contains the data and logic needed to build 'image_overrides' objects. +// +// ImageOverrides holds the lists of available images per cloud provider. +type ImageOverridesBuilder struct { + bitmap_ uint32 + id string + href string + aws []*AMIOverrideBuilder + gcp []*GCPImageOverrideBuilder +} + +// NewImageOverrides creates a new builder of 'image_overrides' objects. +func NewImageOverrides() *ImageOverridesBuilder { + return &ImageOverridesBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ImageOverridesBuilder) Link(value bool) *ImageOverridesBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ImageOverridesBuilder) ID(value string) *ImageOverridesBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ImageOverridesBuilder) HREF(value string) *ImageOverridesBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ImageOverridesBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AWS sets the value of the 'AWS' attribute to the given values. +func (b *ImageOverridesBuilder) AWS(values ...*AMIOverrideBuilder) *ImageOverridesBuilder { + b.aws = make([]*AMIOverrideBuilder, len(values)) + copy(b.aws, values) + b.bitmap_ |= 8 + return b +} + +// GCP sets the value of the 'GCP' attribute to the given values. +func (b *ImageOverridesBuilder) GCP(values ...*GCPImageOverrideBuilder) *ImageOverridesBuilder { + b.gcp = make([]*GCPImageOverrideBuilder, len(values)) + copy(b.gcp, values) + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ImageOverridesBuilder) Copy(object *ImageOverrides) *ImageOverridesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.aws != nil { + b.aws = make([]*AMIOverrideBuilder, len(object.aws)) + for i, v := range object.aws { + b.aws[i] = NewAMIOverride().Copy(v) + } + } else { + b.aws = nil + } + if object.gcp != nil { + b.gcp = make([]*GCPImageOverrideBuilder, len(object.gcp)) + for i, v := range object.gcp { + b.gcp[i] = NewGCPImageOverride().Copy(v) + } + } else { + b.gcp = nil + } + return b +} + +// Build creates a 'image_overrides' object using the configuration stored in the builder. +func (b *ImageOverridesBuilder) Build() (object *ImageOverrides, err error) { + object = new(ImageOverrides) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.aws != nil { + object.aws = make([]*AMIOverride, len(b.aws)) + for i, v := range b.aws { + object.aws[i], err = v.Build() + if err != nil { + return + } + } + } + if b.gcp != nil { + object.gcp = make([]*GCPImageOverride, len(b.gcp)) + for i, v := range b.gcp { + object.gcp[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/image_overrides_list_builder.go b/clustersmgmt/v2alpha1/image_overrides_list_builder.go new file mode 100644 index 00000000..fd36bbc3 --- /dev/null +++ b/clustersmgmt/v2alpha1/image_overrides_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ImageOverridesListBuilder contains the data and logic needed to build +// 'image_overrides' objects. +type ImageOverridesListBuilder struct { + items []*ImageOverridesBuilder +} + +// NewImageOverridesList creates a new builder of 'image_overrides' objects. +func NewImageOverridesList() *ImageOverridesListBuilder { + return new(ImageOverridesListBuilder) +} + +// Items sets the items of the list. +func (b *ImageOverridesListBuilder) Items(values ...*ImageOverridesBuilder) *ImageOverridesListBuilder { + b.items = make([]*ImageOverridesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ImageOverridesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ImageOverridesListBuilder) Copy(list *ImageOverridesList) *ImageOverridesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ImageOverridesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewImageOverrides().Copy(v) + } + } + return b +} + +// Build creates a list of 'image_overrides' objects using the +// configuration stored in the builder. +func (b *ImageOverridesListBuilder) Build() (list *ImageOverridesList, err error) { + items := make([]*ImageOverrides, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ImageOverridesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/image_overrides_list_type_json.go b/clustersmgmt/v2alpha1/image_overrides_list_type_json.go new file mode 100644 index 00000000..a889054a --- /dev/null +++ b/clustersmgmt/v2alpha1/image_overrides_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalImageOverridesList writes a list of values of the 'image_overrides' type to +// the given writer. +func MarshalImageOverridesList(list []*ImageOverrides, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeImageOverridesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeImageOverridesList writes a list of value of the 'image_overrides' type to +// the given stream. +func writeImageOverridesList(list []*ImageOverrides, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeImageOverrides(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalImageOverridesList reads a list of values of the 'image_overrides' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalImageOverridesList(source interface{}) (items []*ImageOverrides, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readImageOverridesList(iterator) + err = iterator.Error + return +} + +// readImageOverridesList reads list of values of the ”image_overrides' type from +// the given iterator. +func readImageOverridesList(iterator *jsoniter.Iterator) []*ImageOverrides { + list := []*ImageOverrides{} + for iterator.ReadArray() { + item := readImageOverrides(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/image_overrides_type.go b/clustersmgmt/v2alpha1/image_overrides_type.go new file mode 100644 index 00000000..e903ab29 --- /dev/null +++ b/clustersmgmt/v2alpha1/image_overrides_type.go @@ -0,0 +1,258 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ImageOverridesKind is the name of the type used to represent objects +// of type 'image_overrides'. +const ImageOverridesKind = "ImageOverrides" + +// ImageOverridesLinkKind is the name of the type used to represent links +// to objects of type 'image_overrides'. +const ImageOverridesLinkKind = "ImageOverridesLink" + +// ImageOverridesNilKind is the name of the type used to nil references +// to objects of type 'image_overrides'. +const ImageOverridesNilKind = "ImageOverridesNil" + +// ImageOverrides represents the values of the 'image_overrides' type. +// +// ImageOverrides holds the lists of available images per cloud provider. +type ImageOverrides struct { + bitmap_ uint32 + id string + href string + aws []*AMIOverride + gcp []*GCPImageOverride +} + +// Kind returns the name of the type of the object. +func (o *ImageOverrides) Kind() string { + if o == nil { + return ImageOverridesNilKind + } + if o.bitmap_&1 != 0 { + return ImageOverridesLinkKind + } + return ImageOverridesKind +} + +// Link returns true iif this is a link. +func (o *ImageOverrides) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ImageOverrides) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ImageOverrides) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ImageOverrides) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ImageOverrides) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ImageOverrides) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AWS returns the value of the 'AWS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *ImageOverrides) AWS() []*AMIOverride { + if o != nil && o.bitmap_&8 != 0 { + return o.aws + } + return nil +} + +// GetAWS returns the value of the 'AWS' attribute and +// a flag indicating if the attribute has a value. +func (o *ImageOverrides) GetAWS() (value []*AMIOverride, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.aws + } + return +} + +// GCP returns the value of the 'GCP' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *ImageOverrides) GCP() []*GCPImageOverride { + if o != nil && o.bitmap_&16 != 0 { + return o.gcp + } + return nil +} + +// GetGCP returns the value of the 'GCP' attribute and +// a flag indicating if the attribute has a value. +func (o *ImageOverrides) GetGCP() (value []*GCPImageOverride, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.gcp + } + return +} + +// ImageOverridesListKind is the name of the type used to represent list of objects of +// type 'image_overrides'. +const ImageOverridesListKind = "ImageOverridesList" + +// ImageOverridesListLinkKind is the name of the type used to represent links to list +// of objects of type 'image_overrides'. +const ImageOverridesListLinkKind = "ImageOverridesListLink" + +// ImageOverridesNilKind is the name of the type used to nil lists of objects of +// type 'image_overrides'. +const ImageOverridesListNilKind = "ImageOverridesListNil" + +// ImageOverridesList is a list of values of the 'image_overrides' type. +type ImageOverridesList struct { + href string + link bool + items []*ImageOverrides +} + +// Kind returns the name of the type of the object. +func (l *ImageOverridesList) Kind() string { + if l == nil { + return ImageOverridesListNilKind + } + if l.link { + return ImageOverridesListLinkKind + } + return ImageOverridesListKind +} + +// Link returns true iif this is a link. +func (l *ImageOverridesList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ImageOverridesList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ImageOverridesList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ImageOverridesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ImageOverridesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ImageOverridesList) Get(i int) *ImageOverrides { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ImageOverridesList) Slice() []*ImageOverrides { + var slice []*ImageOverrides + if l == nil { + slice = make([]*ImageOverrides, 0) + } else { + slice = make([]*ImageOverrides, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ImageOverridesList) Each(f func(item *ImageOverrides) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ImageOverridesList) Range(f func(index int, item *ImageOverrides) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/image_overrides_type_json.go b/clustersmgmt/v2alpha1/image_overrides_type_json.go new file mode 100644 index 00000000..1841caa5 --- /dev/null +++ b/clustersmgmt/v2alpha1/image_overrides_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalImageOverrides writes a value of the 'image_overrides' type to the given writer. +func MarshalImageOverrides(object *ImageOverrides, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeImageOverrides(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeImageOverrides writes a value of the 'image_overrides' type to the given stream. +func writeImageOverrides(object *ImageOverrides, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ImageOverridesLinkKind) + } else { + stream.WriteString(ImageOverridesKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.aws != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws") + writeAMIOverrideList(object.aws, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.gcp != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp") + writeGCPImageOverrideList(object.gcp, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalImageOverrides reads a value of the 'image_overrides' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalImageOverrides(source interface{}) (object *ImageOverrides, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readImageOverrides(iterator) + err = iterator.Error + return +} + +// readImageOverrides reads a value of the 'image_overrides' type from the given iterator. +func readImageOverrides(iterator *jsoniter.Iterator) *ImageOverrides { + object := &ImageOverrides{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ImageOverridesLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "aws": + value := readAMIOverrideList(iterator) + object.aws = value + object.bitmap_ |= 8 + case "gcp": + value := readGCPImageOverrideList(iterator) + object.gcp = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/inflight_check_builder.go b/clustersmgmt/v2alpha1/inflight_check_builder.go new file mode 100644 index 00000000..65bca436 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_builder.go @@ -0,0 +1,145 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// InflightCheckBuilder contains the data and logic needed to build 'inflight_check' objects. +// +// Representation of check running before the cluster is provisioned. +type InflightCheckBuilder struct { + bitmap_ uint32 + id string + href string + details interface{} + endedAt time.Time + name string + restarts int + startedAt time.Time + state InflightCheckState +} + +// NewInflightCheck creates a new builder of 'inflight_check' objects. +func NewInflightCheck() *InflightCheckBuilder { + return &InflightCheckBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *InflightCheckBuilder) Link(value bool) *InflightCheckBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *InflightCheckBuilder) ID(value string) *InflightCheckBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *InflightCheckBuilder) HREF(value string) *InflightCheckBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *InflightCheckBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Details sets the value of the 'details' attribute to the given value. +func (b *InflightCheckBuilder) Details(value interface{}) *InflightCheckBuilder { + b.details = value + b.bitmap_ |= 8 + return b +} + +// EndedAt sets the value of the 'ended_at' attribute to the given value. +func (b *InflightCheckBuilder) EndedAt(value time.Time) *InflightCheckBuilder { + b.endedAt = value + b.bitmap_ |= 16 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *InflightCheckBuilder) Name(value string) *InflightCheckBuilder { + b.name = value + b.bitmap_ |= 32 + return b +} + +// Restarts sets the value of the 'restarts' attribute to the given value. +func (b *InflightCheckBuilder) Restarts(value int) *InflightCheckBuilder { + b.restarts = value + b.bitmap_ |= 64 + return b +} + +// StartedAt sets the value of the 'started_at' attribute to the given value. +func (b *InflightCheckBuilder) StartedAt(value time.Time) *InflightCheckBuilder { + b.startedAt = value + b.bitmap_ |= 128 + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// State of an inflight check. +func (b *InflightCheckBuilder) State(value InflightCheckState) *InflightCheckBuilder { + b.state = value + b.bitmap_ |= 256 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *InflightCheckBuilder) Copy(object *InflightCheck) *InflightCheckBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.details = object.details + b.endedAt = object.endedAt + b.name = object.name + b.restarts = object.restarts + b.startedAt = object.startedAt + b.state = object.state + return b +} + +// Build creates a 'inflight_check' object using the configuration stored in the builder. +func (b *InflightCheckBuilder) Build() (object *InflightCheck, err error) { + object = new(InflightCheck) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.details = b.details + object.endedAt = b.endedAt + object.name = b.name + object.restarts = b.restarts + object.startedAt = b.startedAt + object.state = b.state + return +} diff --git a/clustersmgmt/v2alpha1/inflight_check_client.go b/clustersmgmt/v2alpha1/inflight_check_client.go new file mode 100644 index 00000000..a40ed3ec --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// InflightCheckClient is the client of the 'inflight_check' resource. +// +// Manages a specific inflight check. +type InflightCheckClient struct { + transport http.RoundTripper + path string +} + +// NewInflightCheckClient creates a new client for the 'inflight_check' +// resource using the given transport to send the requests and receive the +// responses. +func NewInflightCheckClient(transport http.RoundTripper, path string) *InflightCheckClient { + return &InflightCheckClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the inflight check. +func (c *InflightCheckClient) Get() *InflightCheckGetRequest { + return &InflightCheckGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// InflightCheckPollRequest is the request for the Poll method. +type InflightCheckPollRequest struct { + request *InflightCheckGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *InflightCheckPollRequest) Parameter(name string, value interface{}) *InflightCheckPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *InflightCheckPollRequest) Header(name string, value interface{}) *InflightCheckPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *InflightCheckPollRequest) Interval(value time.Duration) *InflightCheckPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *InflightCheckPollRequest) Status(value int) *InflightCheckPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *InflightCheckPollRequest) Predicate(value func(*InflightCheckGetResponse) bool) *InflightCheckPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*InflightCheckGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *InflightCheckPollRequest) StartContext(ctx context.Context) (response *InflightCheckPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &InflightCheckPollResponse{ + response: result.(*InflightCheckGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *InflightCheckPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// InflightCheckPollResponse is the response for the Poll method. +type InflightCheckPollResponse struct { + response *InflightCheckGetResponse +} + +// Status returns the response status code. +func (r *InflightCheckPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *InflightCheckPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *InflightCheckPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *InflightCheckPollResponse) Body() *InflightCheck { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *InflightCheckPollResponse) GetBody() (value *InflightCheck, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *InflightCheckClient) Poll() *InflightCheckPollRequest { + return &InflightCheckPollRequest{ + request: c.Get(), + } +} + +// InflightCheckGetRequest is the request for the 'get' method. +type InflightCheckGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *InflightCheckGetRequest) Parameter(name string, value interface{}) *InflightCheckGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *InflightCheckGetRequest) Header(name string, value interface{}) *InflightCheckGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *InflightCheckGetRequest) Impersonate(user string) *InflightCheckGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *InflightCheckGetRequest) Send() (result *InflightCheckGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *InflightCheckGetRequest) SendContext(ctx context.Context) (result *InflightCheckGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &InflightCheckGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readInflightCheckGetResponse(result, reader) + if err != nil { + return + } + return +} + +// InflightCheckGetResponse is the response for the 'get' method. +type InflightCheckGetResponse struct { + status int + header http.Header + err *errors.Error + body *InflightCheck +} + +// Status returns the response status code. +func (r *InflightCheckGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *InflightCheckGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *InflightCheckGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *InflightCheckGetResponse) Body() *InflightCheck { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *InflightCheckGetResponse) GetBody() (value *InflightCheck, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/inflight_check_list_builder.go b/clustersmgmt/v2alpha1/inflight_check_list_builder.go new file mode 100644 index 00000000..29e7dda9 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// InflightCheckListBuilder contains the data and logic needed to build +// 'inflight_check' objects. +type InflightCheckListBuilder struct { + items []*InflightCheckBuilder +} + +// NewInflightCheckList creates a new builder of 'inflight_check' objects. +func NewInflightCheckList() *InflightCheckListBuilder { + return new(InflightCheckListBuilder) +} + +// Items sets the items of the list. +func (b *InflightCheckListBuilder) Items(values ...*InflightCheckBuilder) *InflightCheckListBuilder { + b.items = make([]*InflightCheckBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *InflightCheckListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *InflightCheckListBuilder) Copy(list *InflightCheckList) *InflightCheckListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*InflightCheckBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewInflightCheck().Copy(v) + } + } + return b +} + +// Build creates a list of 'inflight_check' objects using the +// configuration stored in the builder. +func (b *InflightCheckListBuilder) Build() (list *InflightCheckList, err error) { + items := make([]*InflightCheck, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(InflightCheckList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/inflight_check_list_type_json.go b/clustersmgmt/v2alpha1/inflight_check_list_type_json.go new file mode 100644 index 00000000..1a765ba4 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalInflightCheckList writes a list of values of the 'inflight_check' type to +// the given writer. +func MarshalInflightCheckList(list []*InflightCheck, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeInflightCheckList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeInflightCheckList writes a list of value of the 'inflight_check' type to +// the given stream. +func writeInflightCheckList(list []*InflightCheck, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeInflightCheck(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalInflightCheckList reads a list of values of the 'inflight_check' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalInflightCheckList(source interface{}) (items []*InflightCheck, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readInflightCheckList(iterator) + err = iterator.Error + return +} + +// readInflightCheckList reads list of values of the ”inflight_check' type from +// the given iterator. +func readInflightCheckList(iterator *jsoniter.Iterator) []*InflightCheck { + list := []*InflightCheck{} + for iterator.ReadArray() { + item := readInflightCheck(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/inflight_check_resource_json.go b/clustersmgmt/v2alpha1/inflight_check_resource_json.go new file mode 100644 index 00000000..d68dc2a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeInflightCheckGetRequest(request *InflightCheckGetRequest, writer io.Writer) error { + return nil +} +func readInflightCheckGetResponse(response *InflightCheckGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalInflightCheck(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/inflight_check_state_list_type_json.go b/clustersmgmt/v2alpha1/inflight_check_state_list_type_json.go new file mode 100644 index 00000000..9875f4f4 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_state_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalInflightCheckStateList writes a list of values of the 'inflight_check_state' type to +// the given writer. +func MarshalInflightCheckStateList(list []InflightCheckState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeInflightCheckStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeInflightCheckStateList writes a list of value of the 'inflight_check_state' type to +// the given stream. +func writeInflightCheckStateList(list []InflightCheckState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalInflightCheckStateList reads a list of values of the 'inflight_check_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalInflightCheckStateList(source interface{}) (items []InflightCheckState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readInflightCheckStateList(iterator) + err = iterator.Error + return +} + +// readInflightCheckStateList reads list of values of the ”inflight_check_state' type from +// the given iterator. +func readInflightCheckStateList(iterator *jsoniter.Iterator) []InflightCheckState { + list := []InflightCheckState{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := InflightCheckState(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/inflight_check_state_type.go b/clustersmgmt/v2alpha1/inflight_check_state_type.go new file mode 100644 index 00000000..80ec5ab6 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_state_type.go @@ -0,0 +1,34 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// InflightCheckState represents the values of the 'inflight_check_state' enumerated type. +type InflightCheckState string + +const ( + // The inflight check failed. + InflightCheckStateFailed InflightCheckState = "failed" + // The inflight check passed. + InflightCheckStatePassed InflightCheckState = "passed" + // The inflight check did not start running yet. + InflightCheckStatePending InflightCheckState = "pending" + // The inflight check is currently running. + InflightCheckStateRunning InflightCheckState = "running" +) diff --git a/clustersmgmt/v2alpha1/inflight_check_type.go b/clustersmgmt/v2alpha1/inflight_check_type.go new file mode 100644 index 00000000..02d99ee1 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_type.go @@ -0,0 +1,366 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// InflightCheckKind is the name of the type used to represent objects +// of type 'inflight_check'. +const InflightCheckKind = "InflightCheck" + +// InflightCheckLinkKind is the name of the type used to represent links +// to objects of type 'inflight_check'. +const InflightCheckLinkKind = "InflightCheckLink" + +// InflightCheckNilKind is the name of the type used to nil references +// to objects of type 'inflight_check'. +const InflightCheckNilKind = "InflightCheckNil" + +// InflightCheck represents the values of the 'inflight_check' type. +// +// Representation of check running before the cluster is provisioned. +type InflightCheck struct { + bitmap_ uint32 + id string + href string + details interface{} + endedAt time.Time + name string + restarts int + startedAt time.Time + state InflightCheckState +} + +// Kind returns the name of the type of the object. +func (o *InflightCheck) Kind() string { + if o == nil { + return InflightCheckNilKind + } + if o.bitmap_&1 != 0 { + return InflightCheckLinkKind + } + return InflightCheckKind +} + +// Link returns true iif this is a link. +func (o *InflightCheck) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *InflightCheck) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *InflightCheck) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *InflightCheck) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *InflightCheck) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *InflightCheck) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Details returns the value of the 'details' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details regarding the state of the inflight check. +func (o *InflightCheck) Details() interface{} { + if o != nil && o.bitmap_&8 != 0 { + return o.details + } + return nil +} + +// GetDetails returns the value of the 'details' attribute and +// a flag indicating if the attribute has a value. +// +// Details regarding the state of the inflight check. +func (o *InflightCheck) GetDetails() (value interface{}, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.details + } + return +} + +// EndedAt returns the value of the 'ended_at' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The time the check finished running. +func (o *InflightCheck) EndedAt() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.endedAt + } + return time.Time{} +} + +// GetEndedAt returns the value of the 'ended_at' attribute and +// a flag indicating if the attribute has a value. +// +// The time the check finished running. +func (o *InflightCheck) GetEndedAt() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.endedAt + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The name of the inflight check. +func (o *InflightCheck) Name() string { + if o != nil && o.bitmap_&32 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// The name of the inflight check. +func (o *InflightCheck) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.name + } + return +} + +// Restarts returns the value of the 'restarts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The number of times the inflight check restarted. +func (o *InflightCheck) Restarts() int { + if o != nil && o.bitmap_&64 != 0 { + return o.restarts + } + return 0 +} + +// GetRestarts returns the value of the 'restarts' attribute and +// a flag indicating if the attribute has a value. +// +// The number of times the inflight check restarted. +func (o *InflightCheck) GetRestarts() (value int, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.restarts + } + return +} + +// StartedAt returns the value of the 'started_at' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The time the check started running. +func (o *InflightCheck) StartedAt() time.Time { + if o != nil && o.bitmap_&128 != 0 { + return o.startedAt + } + return time.Time{} +} + +// GetStartedAt returns the value of the 'started_at' attribute and +// a flag indicating if the attribute has a value. +// +// The time the check started running. +func (o *InflightCheck) GetStartedAt() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.startedAt + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State of the inflight check. +func (o *InflightCheck) State() InflightCheckState { + if o != nil && o.bitmap_&256 != 0 { + return o.state + } + return InflightCheckState("") +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// State of the inflight check. +func (o *InflightCheck) GetState() (value InflightCheckState, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.state + } + return +} + +// InflightCheckListKind is the name of the type used to represent list of objects of +// type 'inflight_check'. +const InflightCheckListKind = "InflightCheckList" + +// InflightCheckListLinkKind is the name of the type used to represent links to list +// of objects of type 'inflight_check'. +const InflightCheckListLinkKind = "InflightCheckListLink" + +// InflightCheckNilKind is the name of the type used to nil lists of objects of +// type 'inflight_check'. +const InflightCheckListNilKind = "InflightCheckListNil" + +// InflightCheckList is a list of values of the 'inflight_check' type. +type InflightCheckList struct { + href string + link bool + items []*InflightCheck +} + +// Kind returns the name of the type of the object. +func (l *InflightCheckList) Kind() string { + if l == nil { + return InflightCheckListNilKind + } + if l.link { + return InflightCheckListLinkKind + } + return InflightCheckListKind +} + +// Link returns true iif this is a link. +func (l *InflightCheckList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *InflightCheckList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *InflightCheckList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *InflightCheckList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *InflightCheckList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *InflightCheckList) Get(i int) *InflightCheck { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *InflightCheckList) Slice() []*InflightCheck { + var slice []*InflightCheck + if l == nil { + slice = make([]*InflightCheck, 0) + } else { + slice = make([]*InflightCheck, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *InflightCheckList) Each(f func(item *InflightCheck) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *InflightCheckList) Range(f func(index int, item *InflightCheck) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/inflight_check_type_json.go b/clustersmgmt/v2alpha1/inflight_check_type_json.go new file mode 100644 index 00000000..5db9faab --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_check_type_json.go @@ -0,0 +1,196 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalInflightCheck writes a value of the 'inflight_check' type to the given writer. +func MarshalInflightCheck(object *InflightCheck, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeInflightCheck(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeInflightCheck writes a value of the 'inflight_check' type to the given stream. +func writeInflightCheck(object *InflightCheck, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(InflightCheckLinkKind) + } else { + stream.WriteString(InflightCheckKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("details") + stream.WriteVal(object.details) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ended_at") + stream.WriteString((object.endedAt).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("restarts") + stream.WriteInt(object.restarts) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("started_at") + stream.WriteString((object.startedAt).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(string(object.state)) + } + stream.WriteObjectEnd() +} + +// UnmarshalInflightCheck reads a value of the 'inflight_check' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalInflightCheck(source interface{}) (object *InflightCheck, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readInflightCheck(iterator) + err = iterator.Error + return +} + +// readInflightCheck reads a value of the 'inflight_check' type from the given iterator. +func readInflightCheck(iterator *jsoniter.Iterator) *InflightCheck { + object := &InflightCheck{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == InflightCheckLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "details": + var value interface{} + iterator.ReadVal(&value) + object.details = value + object.bitmap_ |= 8 + case "ended_at": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.endedAt = value + object.bitmap_ |= 16 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 32 + case "restarts": + value := iterator.ReadInt() + object.restarts = value + object.bitmap_ |= 64 + case "started_at": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.startedAt = value + object.bitmap_ |= 128 + case "state": + text := iterator.ReadString() + value := InflightCheckState(text) + object.state = value + object.bitmap_ |= 256 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/inflight_checks_client.go b/clustersmgmt/v2alpha1/inflight_checks_client.go new file mode 100644 index 00000000..27db52e4 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_checks_client.go @@ -0,0 +1,297 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// InflightChecksClient is the client of the 'inflight_checks' resource. +// +// Manages the collection of inflight checks. +type InflightChecksClient struct { + transport http.RoundTripper + path string +} + +// NewInflightChecksClient creates a new client for the 'inflight_checks' +// resource using the given transport to send the requests and receive the +// responses. +func NewInflightChecksClient(transport http.RoundTripper, path string) *InflightChecksClient { + return &InflightChecksClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of inflight checks. +func (c *InflightChecksClient) List() *InflightChecksListRequest { + return &InflightChecksListRequest{ + transport: c.transport, + path: c.path, + } +} + +// InflightCheck returns the target 'inflight_check' resource for the given identifier. +// +// Returns a reference to the service that manages a specific inflight check. +func (c *InflightChecksClient) InflightCheck(id string) *InflightCheckClient { + return NewInflightCheckClient( + c.transport, + path.Join(c.path, id), + ) +} + +// InflightChecksListRequest is the request for the 'list' method. +type InflightChecksListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *InflightChecksListRequest) Parameter(name string, value interface{}) *InflightChecksListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *InflightChecksListRequest) Header(name string, value interface{}) *InflightChecksListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *InflightChecksListRequest) Impersonate(user string) *InflightChecksListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *InflightChecksListRequest) Page(value int) *InflightChecksListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *InflightChecksListRequest) Size(value int) *InflightChecksListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *InflightChecksListRequest) Send() (result *InflightChecksListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *InflightChecksListRequest) SendContext(ctx context.Context) (result *InflightChecksListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &InflightChecksListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readInflightChecksListResponse(result, reader) + if err != nil { + return + } + return +} + +// InflightChecksListResponse is the response for the 'list' method. +type InflightChecksListResponse struct { + status int + header http.Header + err *errors.Error + items *InflightCheckList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *InflightChecksListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *InflightChecksListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *InflightChecksListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of inflight checks. +func (r *InflightChecksListResponse) Items() *InflightCheckList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of inflight checks. +func (r *InflightChecksListResponse) GetItems() (value *InflightCheckList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *InflightChecksListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *InflightChecksListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *InflightChecksListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *InflightChecksListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *InflightChecksListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *InflightChecksListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/inflight_checks_resource_json.go b/clustersmgmt/v2alpha1/inflight_checks_resource_json.go new file mode 100644 index 00000000..ace51f54 --- /dev/null +++ b/clustersmgmt/v2alpha1/inflight_checks_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeInflightChecksListRequest(request *InflightChecksListRequest, writer io.Writer) error { + return nil +} +func readInflightChecksListResponse(response *InflightChecksListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readInflightCheckList(iterator) + response.items = &InflightCheckList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/ingress_builder.go b/clustersmgmt/v2alpha1/ingress_builder.go new file mode 100644 index 00000000..eb4b9a93 --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_builder.go @@ -0,0 +1,241 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IngressBuilder contains the data and logic needed to build 'ingress' objects. +// +// Representation of an ingress. +type IngressBuilder struct { + bitmap_ uint32 + id string + href string + dnsName string + clusterRoutesHostname string + clusterRoutesTlsSecretRef string + componentRoutes map[string]*ComponentRouteBuilder + excludedNamespaces []string + listening ListeningMethod + loadBalancerType LoadBalancerFlavor + routeNamespaceOwnershipPolicy NamespaceOwnershipPolicy + routeSelectors map[string]string + routeWildcardPolicy WildcardPolicy + default_ bool +} + +// NewIngress creates a new builder of 'ingress' objects. +func NewIngress() *IngressBuilder { + return &IngressBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *IngressBuilder) Link(value bool) *IngressBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *IngressBuilder) ID(value string) *IngressBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *IngressBuilder) HREF(value string) *IngressBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *IngressBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// DNSName sets the value of the 'DNS_name' attribute to the given value. +func (b *IngressBuilder) DNSName(value string) *IngressBuilder { + b.dnsName = value + b.bitmap_ |= 8 + return b +} + +// ClusterRoutesHostname sets the value of the 'cluster_routes_hostname' attribute to the given value. +func (b *IngressBuilder) ClusterRoutesHostname(value string) *IngressBuilder { + b.clusterRoutesHostname = value + b.bitmap_ |= 16 + return b +} + +// ClusterRoutesTlsSecretRef sets the value of the 'cluster_routes_tls_secret_ref' attribute to the given value. +func (b *IngressBuilder) ClusterRoutesTlsSecretRef(value string) *IngressBuilder { + b.clusterRoutesTlsSecretRef = value + b.bitmap_ |= 32 + return b +} + +// ComponentRoutes sets the value of the 'component_routes' attribute to the given value. +func (b *IngressBuilder) ComponentRoutes(value map[string]*ComponentRouteBuilder) *IngressBuilder { + b.componentRoutes = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// Default sets the value of the 'default' attribute to the given value. +func (b *IngressBuilder) Default(value bool) *IngressBuilder { + b.default_ = value + b.bitmap_ |= 128 + return b +} + +// ExcludedNamespaces sets the value of the 'excluded_namespaces' attribute to the given values. +func (b *IngressBuilder) ExcludedNamespaces(values ...string) *IngressBuilder { + b.excludedNamespaces = make([]string, len(values)) + copy(b.excludedNamespaces, values) + b.bitmap_ |= 256 + return b +} + +// Listening sets the value of the 'listening' attribute to the given value. +// +// Cluster components listening method. +func (b *IngressBuilder) Listening(value ListeningMethod) *IngressBuilder { + b.listening = value + b.bitmap_ |= 512 + return b +} + +// LoadBalancerType sets the value of the 'load_balancer_type' attribute to the given value. +// +// Type of load balancer for AWS cloud provider parameters. +func (b *IngressBuilder) LoadBalancerType(value LoadBalancerFlavor) *IngressBuilder { + b.loadBalancerType = value + b.bitmap_ |= 1024 + return b +} + +// RouteNamespaceOwnershipPolicy sets the value of the 'route_namespace_ownership_policy' attribute to the given value. +// +// Type of Namespace Ownership Policy. +func (b *IngressBuilder) RouteNamespaceOwnershipPolicy(value NamespaceOwnershipPolicy) *IngressBuilder { + b.routeNamespaceOwnershipPolicy = value + b.bitmap_ |= 2048 + return b +} + +// RouteSelectors sets the value of the 'route_selectors' attribute to the given value. +func (b *IngressBuilder) RouteSelectors(value map[string]string) *IngressBuilder { + b.routeSelectors = value + if value != nil { + b.bitmap_ |= 4096 + } else { + b.bitmap_ &^= 4096 + } + return b +} + +// RouteWildcardPolicy sets the value of the 'route_wildcard_policy' attribute to the given value. +// +// Type of wildcard policy. +func (b *IngressBuilder) RouteWildcardPolicy(value WildcardPolicy) *IngressBuilder { + b.routeWildcardPolicy = value + b.bitmap_ |= 8192 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *IngressBuilder) Copy(object *Ingress) *IngressBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.dnsName = object.dnsName + b.clusterRoutesHostname = object.clusterRoutesHostname + b.clusterRoutesTlsSecretRef = object.clusterRoutesTlsSecretRef + if len(object.componentRoutes) > 0 { + b.componentRoutes = map[string]*ComponentRouteBuilder{} + for k, v := range object.componentRoutes { + b.componentRoutes[k] = NewComponentRoute().Copy(v) + } + } else { + b.componentRoutes = nil + } + b.default_ = object.default_ + if object.excludedNamespaces != nil { + b.excludedNamespaces = make([]string, len(object.excludedNamespaces)) + copy(b.excludedNamespaces, object.excludedNamespaces) + } else { + b.excludedNamespaces = nil + } + b.listening = object.listening + b.loadBalancerType = object.loadBalancerType + b.routeNamespaceOwnershipPolicy = object.routeNamespaceOwnershipPolicy + if len(object.routeSelectors) > 0 { + b.routeSelectors = map[string]string{} + for k, v := range object.routeSelectors { + b.routeSelectors[k] = v + } + } else { + b.routeSelectors = nil + } + b.routeWildcardPolicy = object.routeWildcardPolicy + return b +} + +// Build creates a 'ingress' object using the configuration stored in the builder. +func (b *IngressBuilder) Build() (object *Ingress, err error) { + object = new(Ingress) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.dnsName = b.dnsName + object.clusterRoutesHostname = b.clusterRoutesHostname + object.clusterRoutesTlsSecretRef = b.clusterRoutesTlsSecretRef + if b.componentRoutes != nil { + object.componentRoutes = make(map[string]*ComponentRoute) + for k, v := range b.componentRoutes { + object.componentRoutes[k], err = v.Build() + if err != nil { + return + } + } + } + object.default_ = b.default_ + if b.excludedNamespaces != nil { + object.excludedNamespaces = make([]string, len(b.excludedNamespaces)) + copy(object.excludedNamespaces, b.excludedNamespaces) + } + object.listening = b.listening + object.loadBalancerType = b.loadBalancerType + object.routeNamespaceOwnershipPolicy = b.routeNamespaceOwnershipPolicy + if b.routeSelectors != nil { + object.routeSelectors = make(map[string]string) + for k, v := range b.routeSelectors { + object.routeSelectors[k] = v + } + } + object.routeWildcardPolicy = b.routeWildcardPolicy + return +} diff --git a/clustersmgmt/v2alpha1/ingress_client.go b/clustersmgmt/v2alpha1/ingress_client.go new file mode 100644 index 00000000..2ab00075 --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// IngressClient is the client of the 'ingress' resource. +// +// Manages a specific ingress. +type IngressClient struct { + transport http.RoundTripper + path string +} + +// NewIngressClient creates a new client for the 'ingress' +// resource using the given transport to send the requests and receive the +// responses. +func NewIngressClient(transport http.RoundTripper, path string) *IngressClient { + return &IngressClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the ingress. +func (c *IngressClient) Delete() *IngressDeleteRequest { + return &IngressDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the ingress. +func (c *IngressClient) Get() *IngressGetRequest { + return &IngressGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the ingress. +func (c *IngressClient) Update() *IngressUpdateRequest { + return &IngressUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// IngressPollRequest is the request for the Poll method. +type IngressPollRequest struct { + request *IngressGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *IngressPollRequest) Parameter(name string, value interface{}) *IngressPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *IngressPollRequest) Header(name string, value interface{}) *IngressPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *IngressPollRequest) Interval(value time.Duration) *IngressPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *IngressPollRequest) Status(value int) *IngressPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *IngressPollRequest) Predicate(value func(*IngressGetResponse) bool) *IngressPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*IngressGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *IngressPollRequest) StartContext(ctx context.Context) (response *IngressPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &IngressPollResponse{ + response: result.(*IngressGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *IngressPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// IngressPollResponse is the response for the Poll method. +type IngressPollResponse struct { + response *IngressGetResponse +} + +// Status returns the response status code. +func (r *IngressPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *IngressPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *IngressPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *IngressPollResponse) Body() *Ingress { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IngressPollResponse) GetBody() (value *Ingress, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *IngressClient) Poll() *IngressPollRequest { + return &IngressPollRequest{ + request: c.Get(), + } +} + +// IngressDeleteRequest is the request for the 'delete' method. +type IngressDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *IngressDeleteRequest) Parameter(name string, value interface{}) *IngressDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IngressDeleteRequest) Header(name string, value interface{}) *IngressDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IngressDeleteRequest) Impersonate(user string) *IngressDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IngressDeleteRequest) Send() (result *IngressDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IngressDeleteRequest) SendContext(ctx context.Context) (result *IngressDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IngressDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// IngressDeleteResponse is the response for the 'delete' method. +type IngressDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *IngressDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IngressDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IngressDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// IngressGetRequest is the request for the 'get' method. +type IngressGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *IngressGetRequest) Parameter(name string, value interface{}) *IngressGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IngressGetRequest) Header(name string, value interface{}) *IngressGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IngressGetRequest) Impersonate(user string) *IngressGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IngressGetRequest) Send() (result *IngressGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IngressGetRequest) SendContext(ctx context.Context) (result *IngressGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IngressGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIngressGetResponse(result, reader) + if err != nil { + return + } + return +} + +// IngressGetResponse is the response for the 'get' method. +type IngressGetResponse struct { + status int + header http.Header + err *errors.Error + body *Ingress +} + +// Status returns the response status code. +func (r *IngressGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IngressGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IngressGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *IngressGetResponse) Body() *Ingress { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IngressGetResponse) GetBody() (value *Ingress, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// IngressUpdateRequest is the request for the 'update' method. +type IngressUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Ingress +} + +// Parameter adds a query parameter. +func (r *IngressUpdateRequest) Parameter(name string, value interface{}) *IngressUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IngressUpdateRequest) Header(name string, value interface{}) *IngressUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IngressUpdateRequest) Impersonate(user string) *IngressUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *IngressUpdateRequest) Body(value *Ingress) *IngressUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IngressUpdateRequest) Send() (result *IngressUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IngressUpdateRequest) SendContext(ctx context.Context) (result *IngressUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeIngressUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IngressUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIngressUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// IngressUpdateResponse is the response for the 'update' method. +type IngressUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Ingress +} + +// Status returns the response status code. +func (r *IngressUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IngressUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IngressUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *IngressUpdateResponse) Body() *Ingress { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IngressUpdateResponse) GetBody() (value *Ingress, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/ingress_list_builder.go b/clustersmgmt/v2alpha1/ingress_list_builder.go new file mode 100644 index 00000000..3b5818d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IngressListBuilder contains the data and logic needed to build +// 'ingress' objects. +type IngressListBuilder struct { + items []*IngressBuilder +} + +// NewIngressList creates a new builder of 'ingress' objects. +func NewIngressList() *IngressListBuilder { + return new(IngressListBuilder) +} + +// Items sets the items of the list. +func (b *IngressListBuilder) Items(values ...*IngressBuilder) *IngressListBuilder { + b.items = make([]*IngressBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *IngressListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *IngressListBuilder) Copy(list *IngressList) *IngressListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*IngressBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewIngress().Copy(v) + } + } + return b +} + +// Build creates a list of 'ingress' objects using the +// configuration stored in the builder. +func (b *IngressListBuilder) Build() (list *IngressList, err error) { + items := make([]*Ingress, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(IngressList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ingress_list_type_json.go b/clustersmgmt/v2alpha1/ingress_list_type_json.go new file mode 100644 index 00000000..4f1329cc --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIngressList writes a list of values of the 'ingress' type to +// the given writer. +func MarshalIngressList(list []*Ingress, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIngressList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIngressList writes a list of value of the 'ingress' type to +// the given stream. +func writeIngressList(list []*Ingress, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeIngress(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalIngressList reads a list of values of the 'ingress' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalIngressList(source interface{}) (items []*Ingress, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readIngressList(iterator) + err = iterator.Error + return +} + +// readIngressList reads list of values of the ”ingress' type from +// the given iterator. +func readIngressList(iterator *jsoniter.Iterator) []*Ingress { + list := []*Ingress{} + for iterator.ReadArray() { + item := readIngress(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ingress_resource_json.go b/clustersmgmt/v2alpha1/ingress_resource_json.go new file mode 100644 index 00000000..f6e086a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeIngressDeleteRequest(request *IngressDeleteRequest, writer io.Writer) error { + return nil +} +func readIngressDeleteResponse(response *IngressDeleteResponse, reader io.Reader) error { + return nil +} +func writeIngressGetRequest(request *IngressGetRequest, writer io.Writer) error { + return nil +} +func readIngressGetResponse(response *IngressGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIngress(reader) + return err +} +func writeIngressUpdateRequest(request *IngressUpdateRequest, writer io.Writer) error { + return MarshalIngress(request.body, writer) +} +func readIngressUpdateResponse(response *IngressUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIngress(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/ingress_type.go b/clustersmgmt/v2alpha1/ingress_type.go new file mode 100644 index 00000000..b18d3515 --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_type.go @@ -0,0 +1,482 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// IngressKind is the name of the type used to represent objects +// of type 'ingress'. +const IngressKind = "Ingress" + +// IngressLinkKind is the name of the type used to represent links +// to objects of type 'ingress'. +const IngressLinkKind = "IngressLink" + +// IngressNilKind is the name of the type used to nil references +// to objects of type 'ingress'. +const IngressNilKind = "IngressNil" + +// Ingress represents the values of the 'ingress' type. +// +// Representation of an ingress. +type Ingress struct { + bitmap_ uint32 + id string + href string + dnsName string + clusterRoutesHostname string + clusterRoutesTlsSecretRef string + componentRoutes map[string]*ComponentRoute + excludedNamespaces []string + listening ListeningMethod + loadBalancerType LoadBalancerFlavor + routeNamespaceOwnershipPolicy NamespaceOwnershipPolicy + routeSelectors map[string]string + routeWildcardPolicy WildcardPolicy + default_ bool +} + +// Kind returns the name of the type of the object. +func (o *Ingress) Kind() string { + if o == nil { + return IngressNilKind + } + if o.bitmap_&1 != 0 { + return IngressLinkKind + } + return IngressKind +} + +// Link returns true iif this is a link. +func (o *Ingress) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Ingress) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Ingress) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Ingress) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Ingress) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Ingress) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// DNSName returns the value of the 'DNS_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// DNS Name of the ingress. +func (o *Ingress) DNSName() string { + if o != nil && o.bitmap_&8 != 0 { + return o.dnsName + } + return "" +} + +// GetDNSName returns the value of the 'DNS_name' attribute and +// a flag indicating if the attribute has a value. +// +// DNS Name of the ingress. +func (o *Ingress) GetDNSName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.dnsName + } + return +} + +// ClusterRoutesHostname returns the value of the 'cluster_routes_hostname' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster routes hostname. +func (o *Ingress) ClusterRoutesHostname() string { + if o != nil && o.bitmap_&16 != 0 { + return o.clusterRoutesHostname + } + return "" +} + +// GetClusterRoutesHostname returns the value of the 'cluster_routes_hostname' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster routes hostname. +func (o *Ingress) GetClusterRoutesHostname() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.clusterRoutesHostname + } + return +} + +// ClusterRoutesTlsSecretRef returns the value of the 'cluster_routes_tls_secret_ref' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster routes TLS Secret reference. +func (o *Ingress) ClusterRoutesTlsSecretRef() string { + if o != nil && o.bitmap_&32 != 0 { + return o.clusterRoutesTlsSecretRef + } + return "" +} + +// GetClusterRoutesTlsSecretRef returns the value of the 'cluster_routes_tls_secret_ref' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster routes TLS Secret reference. +func (o *Ingress) GetClusterRoutesTlsSecretRef() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.clusterRoutesTlsSecretRef + } + return +} + +// ComponentRoutes returns the value of the 'component_routes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Component Routes settings. +func (o *Ingress) ComponentRoutes() map[string]*ComponentRoute { + if o != nil && o.bitmap_&64 != 0 { + return o.componentRoutes + } + return nil +} + +// GetComponentRoutes returns the value of the 'component_routes' attribute and +// a flag indicating if the attribute has a value. +// +// Component Routes settings. +func (o *Ingress) GetComponentRoutes() (value map[string]*ComponentRoute, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.componentRoutes + } + return +} + +// Default returns the value of the 'default' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this is the default ingress. +func (o *Ingress) Default() bool { + if o != nil && o.bitmap_&128 != 0 { + return o.default_ + } + return false +} + +// GetDefault returns the value of the 'default' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this is the default ingress. +func (o *Ingress) GetDefault() (value bool, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.default_ + } + return +} + +// ExcludedNamespaces returns the value of the 'excluded_namespaces' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// A set of excluded namespaces for the ingress. +func (o *Ingress) ExcludedNamespaces() []string { + if o != nil && o.bitmap_&256 != 0 { + return o.excludedNamespaces + } + return nil +} + +// GetExcludedNamespaces returns the value of the 'excluded_namespaces' attribute and +// a flag indicating if the attribute has a value. +// +// A set of excluded namespaces for the ingress. +func (o *Ingress) GetExcludedNamespaces() (value []string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.excludedNamespaces + } + return +} + +// Listening returns the value of the 'listening' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Listening method of the ingress +func (o *Ingress) Listening() ListeningMethod { + if o != nil && o.bitmap_&512 != 0 { + return o.listening + } + return ListeningMethod("") +} + +// GetListening returns the value of the 'listening' attribute and +// a flag indicating if the attribute has a value. +// +// Listening method of the ingress +func (o *Ingress) GetListening() (value ListeningMethod, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.listening + } + return +} + +// LoadBalancerType returns the value of the 'load_balancer_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Load Balancer type of the ingress +func (o *Ingress) LoadBalancerType() LoadBalancerFlavor { + if o != nil && o.bitmap_&1024 != 0 { + return o.loadBalancerType + } + return LoadBalancerFlavor("") +} + +// GetLoadBalancerType returns the value of the 'load_balancer_type' attribute and +// a flag indicating if the attribute has a value. +// +// Load Balancer type of the ingress +func (o *Ingress) GetLoadBalancerType() (value LoadBalancerFlavor, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.loadBalancerType + } + return +} + +// RouteNamespaceOwnershipPolicy returns the value of the 'route_namespace_ownership_policy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Namespace Ownership Policy for the ingress. +func (o *Ingress) RouteNamespaceOwnershipPolicy() NamespaceOwnershipPolicy { + if o != nil && o.bitmap_&2048 != 0 { + return o.routeNamespaceOwnershipPolicy + } + return NamespaceOwnershipPolicy("") +} + +// GetRouteNamespaceOwnershipPolicy returns the value of the 'route_namespace_ownership_policy' attribute and +// a flag indicating if the attribute has a value. +// +// Namespace Ownership Policy for the ingress. +func (o *Ingress) GetRouteNamespaceOwnershipPolicy() (value NamespaceOwnershipPolicy, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.routeNamespaceOwnershipPolicy + } + return +} + +// RouteSelectors returns the value of the 'route_selectors' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// A set of labels for the ingress. +func (o *Ingress) RouteSelectors() map[string]string { + if o != nil && o.bitmap_&4096 != 0 { + return o.routeSelectors + } + return nil +} + +// GetRouteSelectors returns the value of the 'route_selectors' attribute and +// a flag indicating if the attribute has a value. +// +// A set of labels for the ingress. +func (o *Ingress) GetRouteSelectors() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.routeSelectors + } + return +} + +// RouteWildcardPolicy returns the value of the 'route_wildcard_policy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Wildcard policy for the ingress. +func (o *Ingress) RouteWildcardPolicy() WildcardPolicy { + if o != nil && o.bitmap_&8192 != 0 { + return o.routeWildcardPolicy + } + return WildcardPolicy("") +} + +// GetRouteWildcardPolicy returns the value of the 'route_wildcard_policy' attribute and +// a flag indicating if the attribute has a value. +// +// Wildcard policy for the ingress. +func (o *Ingress) GetRouteWildcardPolicy() (value WildcardPolicy, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.routeWildcardPolicy + } + return +} + +// IngressListKind is the name of the type used to represent list of objects of +// type 'ingress'. +const IngressListKind = "IngressList" + +// IngressListLinkKind is the name of the type used to represent links to list +// of objects of type 'ingress'. +const IngressListLinkKind = "IngressListLink" + +// IngressNilKind is the name of the type used to nil lists of objects of +// type 'ingress'. +const IngressListNilKind = "IngressListNil" + +// IngressList is a list of values of the 'ingress' type. +type IngressList struct { + href string + link bool + items []*Ingress +} + +// Kind returns the name of the type of the object. +func (l *IngressList) Kind() string { + if l == nil { + return IngressListNilKind + } + if l.link { + return IngressListLinkKind + } + return IngressListKind +} + +// Link returns true iif this is a link. +func (l *IngressList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *IngressList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *IngressList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *IngressList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *IngressList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *IngressList) Get(i int) *Ingress { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *IngressList) Slice() []*Ingress { + var slice []*Ingress + if l == nil { + slice = make([]*Ingress, 0) + } else { + slice = make([]*Ingress, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *IngressList) Each(f func(item *Ingress) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *IngressList) Range(f func(index int, item *Ingress) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ingress_type_json.go b/clustersmgmt/v2alpha1/ingress_type_json.go new file mode 100644 index 00000000..3ed234dc --- /dev/null +++ b/clustersmgmt/v2alpha1/ingress_type_json.go @@ -0,0 +1,311 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIngress writes a value of the 'ingress' type to the given writer. +func MarshalIngress(object *Ingress, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIngress(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIngress writes a value of the 'ingress' type to the given stream. +func writeIngress(object *Ingress, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(IngressLinkKind) + } else { + stream.WriteString(IngressKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("dns_name") + stream.WriteString(object.dnsName) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_routes_hostname") + stream.WriteString(object.clusterRoutesHostname) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_routes_tls_secret_ref") + stream.WriteString(object.clusterRoutesTlsSecretRef) + count++ + } + present_ = object.bitmap_&64 != 0 && object.componentRoutes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("component_routes") + if object.componentRoutes != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.componentRoutes)) + i := 0 + for key := range object.componentRoutes { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.componentRoutes[key] + stream.WriteObjectField(key) + writeComponentRoute(item, stream) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("default") + stream.WriteBool(object.default_) + count++ + } + present_ = object.bitmap_&256 != 0 && object.excludedNamespaces != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("excluded_namespaces") + writeStringList(object.excludedNamespaces, stream) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("listening") + stream.WriteString(string(object.listening)) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("load_balancer_type") + stream.WriteString(string(object.loadBalancerType)) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("route_namespace_ownership_policy") + stream.WriteString(string(object.routeNamespaceOwnershipPolicy)) + count++ + } + present_ = object.bitmap_&4096 != 0 && object.routeSelectors != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("route_selectors") + if object.routeSelectors != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.routeSelectors)) + i := 0 + for key := range object.routeSelectors { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.routeSelectors[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("route_wildcard_policy") + stream.WriteString(string(object.routeWildcardPolicy)) + } + stream.WriteObjectEnd() +} + +// UnmarshalIngress reads a value of the 'ingress' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalIngress(source interface{}) (object *Ingress, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readIngress(iterator) + err = iterator.Error + return +} + +// readIngress reads a value of the 'ingress' type from the given iterator. +func readIngress(iterator *jsoniter.Iterator) *Ingress { + object := &Ingress{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == IngressLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "dns_name": + value := iterator.ReadString() + object.dnsName = value + object.bitmap_ |= 8 + case "cluster_routes_hostname": + value := iterator.ReadString() + object.clusterRoutesHostname = value + object.bitmap_ |= 16 + case "cluster_routes_tls_secret_ref": + value := iterator.ReadString() + object.clusterRoutesTlsSecretRef = value + object.bitmap_ |= 32 + case "component_routes": + value := map[string]*ComponentRoute{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := readComponentRoute(iterator) + value[key] = item + } + object.componentRoutes = value + object.bitmap_ |= 64 + case "default": + value := iterator.ReadBool() + object.default_ = value + object.bitmap_ |= 128 + case "excluded_namespaces": + value := readStringList(iterator) + object.excludedNamespaces = value + object.bitmap_ |= 256 + case "listening": + text := iterator.ReadString() + value := ListeningMethod(text) + object.listening = value + object.bitmap_ |= 512 + case "load_balancer_type": + text := iterator.ReadString() + value := LoadBalancerFlavor(text) + object.loadBalancerType = value + object.bitmap_ |= 1024 + case "route_namespace_ownership_policy": + text := iterator.ReadString() + value := NamespaceOwnershipPolicy(text) + object.routeNamespaceOwnershipPolicy = value + object.bitmap_ |= 2048 + case "route_selectors": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.routeSelectors = value + object.bitmap_ |= 4096 + case "route_wildcard_policy": + text := iterator.ReadString() + value := WildcardPolicy(text) + object.routeWildcardPolicy = value + object.bitmap_ |= 8192 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/ingresses_client.go b/clustersmgmt/v2alpha1/ingresses_client.go new file mode 100644 index 00000000..7b470e6e --- /dev/null +++ b/clustersmgmt/v2alpha1/ingresses_client.go @@ -0,0 +1,610 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// IngressesClient is the client of the 'ingresses' resource. +// +// Manages the collection of ingresses of a cluster. +type IngressesClient struct { + transport http.RoundTripper + path string +} + +// NewIngressesClient creates a new client for the 'ingresses' +// resource using the given transport to send the requests and receive the +// responses. +func NewIngressesClient(transport http.RoundTripper, path string) *IngressesClient { + return &IngressesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new ingress to the cluster. +func (c *IngressesClient) Add() *IngressesAddRequest { + return &IngressesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of ingresses. +func (c *IngressesClient) List() *IngressesListRequest { + return &IngressesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates all ingresses +func (c *IngressesClient) Update() *IngressesUpdateRequest { + return &IngressesUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// Ingress returns the target 'ingress' resource for the given identifier. +// +// Reference to the service that manages a specific ingress. +func (c *IngressesClient) Ingress(id string) *IngressClient { + return NewIngressClient( + c.transport, + path.Join(c.path, id), + ) +} + +// IngressesAddRequest is the request for the 'add' method. +type IngressesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Ingress +} + +// Parameter adds a query parameter. +func (r *IngressesAddRequest) Parameter(name string, value interface{}) *IngressesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IngressesAddRequest) Header(name string, value interface{}) *IngressesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IngressesAddRequest) Impersonate(user string) *IngressesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the ingress +func (r *IngressesAddRequest) Body(value *Ingress) *IngressesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IngressesAddRequest) Send() (result *IngressesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IngressesAddRequest) SendContext(ctx context.Context) (result *IngressesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeIngressesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IngressesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIngressesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// IngressesAddResponse is the response for the 'add' method. +type IngressesAddResponse struct { + status int + header http.Header + err *errors.Error + body *Ingress +} + +// Status returns the response status code. +func (r *IngressesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IngressesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IngressesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the ingress +func (r *IngressesAddResponse) Body() *Ingress { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the ingress +func (r *IngressesAddResponse) GetBody() (value *Ingress, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// IngressesListRequest is the request for the 'list' method. +type IngressesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *IngressesListRequest) Parameter(name string, value interface{}) *IngressesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IngressesListRequest) Header(name string, value interface{}) *IngressesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IngressesListRequest) Impersonate(user string) *IngressesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *IngressesListRequest) Page(value int) *IngressesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *IngressesListRequest) Size(value int) *IngressesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IngressesListRequest) Send() (result *IngressesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IngressesListRequest) SendContext(ctx context.Context) (result *IngressesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IngressesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIngressesListResponse(result, reader) + if err != nil { + return + } + return +} + +// IngressesListResponse is the response for the 'list' method. +type IngressesListResponse struct { + status int + header http.Header + err *errors.Error + items *IngressList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *IngressesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IngressesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IngressesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of ingresses. +func (r *IngressesListResponse) Items() *IngressList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of ingresses. +func (r *IngressesListResponse) GetItems() (value *IngressList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *IngressesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *IngressesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *IngressesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *IngressesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *IngressesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *IngressesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} + +// IngressesUpdateRequest is the request for the 'update' method. +type IngressesUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body []*Ingress +} + +// Parameter adds a query parameter. +func (r *IngressesUpdateRequest) Parameter(name string, value interface{}) *IngressesUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *IngressesUpdateRequest) Header(name string, value interface{}) *IngressesUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *IngressesUpdateRequest) Impersonate(user string) *IngressesUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *IngressesUpdateRequest) Body(value []*Ingress) *IngressesUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *IngressesUpdateRequest) Send() (result *IngressesUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *IngressesUpdateRequest) SendContext(ctx context.Context) (result *IngressesUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeIngressesUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &IngressesUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readIngressesUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// IngressesUpdateResponse is the response for the 'update' method. +type IngressesUpdateResponse struct { + status int + header http.Header + err *errors.Error + body []*Ingress +} + +// Status returns the response status code. +func (r *IngressesUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *IngressesUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *IngressesUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *IngressesUpdateResponse) Body() []*Ingress { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *IngressesUpdateResponse) GetBody() (value []*Ingress, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/ingresses_resource_json.go b/clustersmgmt/v2alpha1/ingresses_resource_json.go new file mode 100644 index 00000000..0080b965 --- /dev/null +++ b/clustersmgmt/v2alpha1/ingresses_resource_json.go @@ -0,0 +1,77 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeIngressesAddRequest(request *IngressesAddRequest, writer io.Writer) error { + return MarshalIngress(request.body, writer) +} +func readIngressesAddResponse(response *IngressesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIngress(reader) + return err +} +func writeIngressesListRequest(request *IngressesListRequest, writer io.Writer) error { + return nil +} +func readIngressesListResponse(response *IngressesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readIngressList(iterator) + response.items = &IngressList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} +func writeIngressesUpdateRequest(request *IngressesUpdateRequest, writer io.Writer) error { + return MarshalIngressList(request.body, writer) +} +func readIngressesUpdateResponse(response *IngressesUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalIngressList(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/instance_iam_roles_builder.go b/clustersmgmt/v2alpha1/instance_iam_roles_builder.go new file mode 100644 index 00000000..6a06130e --- /dev/null +++ b/clustersmgmt/v2alpha1/instance_iam_roles_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// InstanceIAMRolesBuilder contains the data and logic needed to build 'instance_IAM_roles' objects. +// +// Contains the necessary attributes to support role-based authentication on AWS. +type InstanceIAMRolesBuilder struct { + bitmap_ uint32 + masterRoleARN string + workerRoleARN string +} + +// NewInstanceIAMRoles creates a new builder of 'instance_IAM_roles' objects. +func NewInstanceIAMRoles() *InstanceIAMRolesBuilder { + return &InstanceIAMRolesBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *InstanceIAMRolesBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// MasterRoleARN sets the value of the 'master_role_ARN' attribute to the given value. +func (b *InstanceIAMRolesBuilder) MasterRoleARN(value string) *InstanceIAMRolesBuilder { + b.masterRoleARN = value + b.bitmap_ |= 1 + return b +} + +// WorkerRoleARN sets the value of the 'worker_role_ARN' attribute to the given value. +func (b *InstanceIAMRolesBuilder) WorkerRoleARN(value string) *InstanceIAMRolesBuilder { + b.workerRoleARN = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *InstanceIAMRolesBuilder) Copy(object *InstanceIAMRoles) *InstanceIAMRolesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.masterRoleARN = object.masterRoleARN + b.workerRoleARN = object.workerRoleARN + return b +} + +// Build creates a 'instance_IAM_roles' object using the configuration stored in the builder. +func (b *InstanceIAMRolesBuilder) Build() (object *InstanceIAMRoles, err error) { + object = new(InstanceIAMRoles) + object.bitmap_ = b.bitmap_ + object.masterRoleARN = b.masterRoleARN + object.workerRoleARN = b.workerRoleARN + return +} diff --git a/clustersmgmt/v2alpha1/instance_iam_roles_list_builder.go b/clustersmgmt/v2alpha1/instance_iam_roles_list_builder.go new file mode 100644 index 00000000..98642167 --- /dev/null +++ b/clustersmgmt/v2alpha1/instance_iam_roles_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// InstanceIAMRolesListBuilder contains the data and logic needed to build +// 'instance_IAM_roles' objects. +type InstanceIAMRolesListBuilder struct { + items []*InstanceIAMRolesBuilder +} + +// NewInstanceIAMRolesList creates a new builder of 'instance_IAM_roles' objects. +func NewInstanceIAMRolesList() *InstanceIAMRolesListBuilder { + return new(InstanceIAMRolesListBuilder) +} + +// Items sets the items of the list. +func (b *InstanceIAMRolesListBuilder) Items(values ...*InstanceIAMRolesBuilder) *InstanceIAMRolesListBuilder { + b.items = make([]*InstanceIAMRolesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *InstanceIAMRolesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *InstanceIAMRolesListBuilder) Copy(list *InstanceIAMRolesList) *InstanceIAMRolesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*InstanceIAMRolesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewInstanceIAMRoles().Copy(v) + } + } + return b +} + +// Build creates a list of 'instance_IAM_roles' objects using the +// configuration stored in the builder. +func (b *InstanceIAMRolesListBuilder) Build() (list *InstanceIAMRolesList, err error) { + items := make([]*InstanceIAMRoles, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(InstanceIAMRolesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/instance_iam_roles_list_type_json.go b/clustersmgmt/v2alpha1/instance_iam_roles_list_type_json.go new file mode 100644 index 00000000..e7275d69 --- /dev/null +++ b/clustersmgmt/v2alpha1/instance_iam_roles_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalInstanceIAMRolesList writes a list of values of the 'instance_IAM_roles' type to +// the given writer. +func MarshalInstanceIAMRolesList(list []*InstanceIAMRoles, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeInstanceIAMRolesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeInstanceIAMRolesList writes a list of value of the 'instance_IAM_roles' type to +// the given stream. +func writeInstanceIAMRolesList(list []*InstanceIAMRoles, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeInstanceIAMRoles(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalInstanceIAMRolesList reads a list of values of the 'instance_IAM_roles' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalInstanceIAMRolesList(source interface{}) (items []*InstanceIAMRoles, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readInstanceIAMRolesList(iterator) + err = iterator.Error + return +} + +// readInstanceIAMRolesList reads list of values of the ”instance_IAM_roles' type from +// the given iterator. +func readInstanceIAMRolesList(iterator *jsoniter.Iterator) []*InstanceIAMRoles { + list := []*InstanceIAMRoles{} + for iterator.ReadArray() { + item := readInstanceIAMRoles(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/instance_iam_roles_type.go b/clustersmgmt/v2alpha1/instance_iam_roles_type.go new file mode 100644 index 00000000..a2cc0515 --- /dev/null +++ b/clustersmgmt/v2alpha1/instance_iam_roles_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// InstanceIAMRoles represents the values of the 'instance_IAM_roles' type. +// +// Contains the necessary attributes to support role-based authentication on AWS. +type InstanceIAMRoles struct { + bitmap_ uint32 + masterRoleARN string + workerRoleARN string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *InstanceIAMRoles) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// MasterRoleARN returns the value of the 'master_role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The IAM role ARN that will be attached to master instances +func (o *InstanceIAMRoles) MasterRoleARN() string { + if o != nil && o.bitmap_&1 != 0 { + return o.masterRoleARN + } + return "" +} + +// GetMasterRoleARN returns the value of the 'master_role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// The IAM role ARN that will be attached to master instances +func (o *InstanceIAMRoles) GetMasterRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.masterRoleARN + } + return +} + +// WorkerRoleARN returns the value of the 'worker_role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The IAM role ARN that will be attached to worker instances +func (o *InstanceIAMRoles) WorkerRoleARN() string { + if o != nil && o.bitmap_&2 != 0 { + return o.workerRoleARN + } + return "" +} + +// GetWorkerRoleARN returns the value of the 'worker_role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// The IAM role ARN that will be attached to worker instances +func (o *InstanceIAMRoles) GetWorkerRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.workerRoleARN + } + return +} + +// InstanceIAMRolesListKind is the name of the type used to represent list of objects of +// type 'instance_IAM_roles'. +const InstanceIAMRolesListKind = "InstanceIAMRolesList" + +// InstanceIAMRolesListLinkKind is the name of the type used to represent links to list +// of objects of type 'instance_IAM_roles'. +const InstanceIAMRolesListLinkKind = "InstanceIAMRolesListLink" + +// InstanceIAMRolesNilKind is the name of the type used to nil lists of objects of +// type 'instance_IAM_roles'. +const InstanceIAMRolesListNilKind = "InstanceIAMRolesListNil" + +// InstanceIAMRolesList is a list of values of the 'instance_IAM_roles' type. +type InstanceIAMRolesList struct { + href string + link bool + items []*InstanceIAMRoles +} + +// Len returns the length of the list. +func (l *InstanceIAMRolesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *InstanceIAMRolesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *InstanceIAMRolesList) Get(i int) *InstanceIAMRoles { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *InstanceIAMRolesList) Slice() []*InstanceIAMRoles { + var slice []*InstanceIAMRoles + if l == nil { + slice = make([]*InstanceIAMRoles, 0) + } else { + slice = make([]*InstanceIAMRoles, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *InstanceIAMRolesList) Each(f func(item *InstanceIAMRoles) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *InstanceIAMRolesList) Range(f func(index int, item *InstanceIAMRoles) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/instance_iam_roles_type_json.go b/clustersmgmt/v2alpha1/instance_iam_roles_type_json.go new file mode 100644 index 00000000..c73ba860 --- /dev/null +++ b/clustersmgmt/v2alpha1/instance_iam_roles_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalInstanceIAMRoles writes a value of the 'instance_IAM_roles' type to the given writer. +func MarshalInstanceIAMRoles(object *InstanceIAMRoles, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeInstanceIAMRoles(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeInstanceIAMRoles writes a value of the 'instance_IAM_roles' type to the given stream. +func writeInstanceIAMRoles(object *InstanceIAMRoles, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("master_role_arn") + stream.WriteString(object.masterRoleARN) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("worker_role_arn") + stream.WriteString(object.workerRoleARN) + } + stream.WriteObjectEnd() +} + +// UnmarshalInstanceIAMRoles reads a value of the 'instance_IAM_roles' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalInstanceIAMRoles(source interface{}) (object *InstanceIAMRoles, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readInstanceIAMRoles(iterator) + err = iterator.Error + return +} + +// readInstanceIAMRoles reads a value of the 'instance_IAM_roles' type from the given iterator. +func readInstanceIAMRoles(iterator *jsoniter.Iterator) *InstanceIAMRoles { + object := &InstanceIAMRoles{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "master_role_arn": + value := iterator.ReadString() + object.masterRoleARN = value + object.bitmap_ |= 1 + case "worker_role_arn": + value := iterator.ReadString() + object.workerRoleARN = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/integer_list_type_json.go b/clustersmgmt/v2alpha1/integer_list_type_json.go new file mode 100644 index 00000000..ca743f6c --- /dev/null +++ b/clustersmgmt/v2alpha1/integer_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalIntegerList writes a list of values of the 'integer' type to +// the given writer. +func MarshalIntegerList(list []int, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeIntegerList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeIntegerList writes a list of value of the 'integer' type to +// the given stream. +func writeIntegerList(list []int, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteInt(value) + } + stream.WriteArrayEnd() +} + +// UnmarshalIntegerList reads a list of values of the 'integer' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalIntegerList(source interface{}) (items []int, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readIntegerList(iterator) + err = iterator.Error + return +} + +// readIntegerList reads list of values of the ”integer' type from +// the given iterator. +func readIntegerList(iterator *jsoniter.Iterator) []int { + list := []int{} + for iterator.ReadArray() { + item := iterator.ReadInt() + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/interface_list_type_json.go b/clustersmgmt/v2alpha1/interface_list_type_json.go new file mode 100644 index 00000000..1485f49e --- /dev/null +++ b/clustersmgmt/v2alpha1/interface_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalInterfaceList writes a list of values of the 'interface' type to +// the given writer. +func MarshalInterfaceList(list []interface{}, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeInterfaceList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeInterfaceList writes a list of value of the 'interface' type to +// the given stream. +func writeInterfaceList(list []interface{}, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteVal(value) + } + stream.WriteArrayEnd() +} + +// UnmarshalInterfaceList reads a list of values of the 'interface' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalInterfaceList(source interface{}) (items []interface{}, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readInterfaceList(iterator) + err = iterator.Error + return +} + +// readInterfaceList reads list of values of the ”interface' type from +// the given iterator. +func readInterfaceList(iterator *jsoniter.Iterator) []interface{} { + list := []interface{}{} + for iterator.ReadArray() { + var item interface{} + iterator.ReadVal(&item) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/key_ring_builder.go b/clustersmgmt/v2alpha1/key_ring_builder.go new file mode 100644 index 00000000..fa4a8a36 --- /dev/null +++ b/clustersmgmt/v2alpha1/key_ring_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// KeyRingBuilder contains the data and logic needed to build 'key_ring' objects. +// +// Description of a cloud provider key ring. +type KeyRingBuilder struct { + bitmap_ uint32 + id string + href string + name string +} + +// NewKeyRing creates a new builder of 'key_ring' objects. +func NewKeyRing() *KeyRingBuilder { + return &KeyRingBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *KeyRingBuilder) Link(value bool) *KeyRingBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *KeyRingBuilder) ID(value string) *KeyRingBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *KeyRingBuilder) HREF(value string) *KeyRingBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *KeyRingBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *KeyRingBuilder) Name(value string) *KeyRingBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *KeyRingBuilder) Copy(object *KeyRing) *KeyRingBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.name = object.name + return b +} + +// Build creates a 'key_ring' object using the configuration stored in the builder. +func (b *KeyRingBuilder) Build() (object *KeyRing, err error) { + object = new(KeyRing) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.name = b.name + return +} diff --git a/clustersmgmt/v2alpha1/key_ring_list_builder.go b/clustersmgmt/v2alpha1/key_ring_list_builder.go new file mode 100644 index 00000000..678d61e4 --- /dev/null +++ b/clustersmgmt/v2alpha1/key_ring_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// KeyRingListBuilder contains the data and logic needed to build +// 'key_ring' objects. +type KeyRingListBuilder struct { + items []*KeyRingBuilder +} + +// NewKeyRingList creates a new builder of 'key_ring' objects. +func NewKeyRingList() *KeyRingListBuilder { + return new(KeyRingListBuilder) +} + +// Items sets the items of the list. +func (b *KeyRingListBuilder) Items(values ...*KeyRingBuilder) *KeyRingListBuilder { + b.items = make([]*KeyRingBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *KeyRingListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *KeyRingListBuilder) Copy(list *KeyRingList) *KeyRingListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*KeyRingBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewKeyRing().Copy(v) + } + } + return b +} + +// Build creates a list of 'key_ring' objects using the +// configuration stored in the builder. +func (b *KeyRingListBuilder) Build() (list *KeyRingList, err error) { + items := make([]*KeyRing, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(KeyRingList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/key_ring_list_type_json.go b/clustersmgmt/v2alpha1/key_ring_list_type_json.go new file mode 100644 index 00000000..6709d1ad --- /dev/null +++ b/clustersmgmt/v2alpha1/key_ring_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalKeyRingList writes a list of values of the 'key_ring' type to +// the given writer. +func MarshalKeyRingList(list []*KeyRing, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeKeyRingList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeKeyRingList writes a list of value of the 'key_ring' type to +// the given stream. +func writeKeyRingList(list []*KeyRing, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeKeyRing(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalKeyRingList reads a list of values of the 'key_ring' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalKeyRingList(source interface{}) (items []*KeyRing, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readKeyRingList(iterator) + err = iterator.Error + return +} + +// readKeyRingList reads list of values of the ”key_ring' type from +// the given iterator. +func readKeyRingList(iterator *jsoniter.Iterator) []*KeyRing { + list := []*KeyRing{} + for iterator.ReadArray() { + item := readKeyRing(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/key_ring_type.go b/clustersmgmt/v2alpha1/key_ring_type.go new file mode 100644 index 00000000..749c6243 --- /dev/null +++ b/clustersmgmt/v2alpha1/key_ring_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// KeyRingKind is the name of the type used to represent objects +// of type 'key_ring'. +const KeyRingKind = "KeyRing" + +// KeyRingLinkKind is the name of the type used to represent links +// to objects of type 'key_ring'. +const KeyRingLinkKind = "KeyRingLink" + +// KeyRingNilKind is the name of the type used to nil references +// to objects of type 'key_ring'. +const KeyRingNilKind = "KeyRingNil" + +// KeyRing represents the values of the 'key_ring' type. +// +// Description of a cloud provider key ring. +type KeyRing struct { + bitmap_ uint32 + id string + href string + name string +} + +// Kind returns the name of the type of the object. +func (o *KeyRing) Kind() string { + if o == nil { + return KeyRingNilKind + } + if o.bitmap_&1 != 0 { + return KeyRingLinkKind + } + return KeyRingKind +} + +// Link returns true iif this is a link. +func (o *KeyRing) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *KeyRing) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *KeyRing) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *KeyRing) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *KeyRing) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *KeyRing) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the key ring. +func (o *KeyRing) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the key ring. +func (o *KeyRing) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// KeyRingListKind is the name of the type used to represent list of objects of +// type 'key_ring'. +const KeyRingListKind = "KeyRingList" + +// KeyRingListLinkKind is the name of the type used to represent links to list +// of objects of type 'key_ring'. +const KeyRingListLinkKind = "KeyRingListLink" + +// KeyRingNilKind is the name of the type used to nil lists of objects of +// type 'key_ring'. +const KeyRingListNilKind = "KeyRingListNil" + +// KeyRingList is a list of values of the 'key_ring' type. +type KeyRingList struct { + href string + link bool + items []*KeyRing +} + +// Kind returns the name of the type of the object. +func (l *KeyRingList) Kind() string { + if l == nil { + return KeyRingListNilKind + } + if l.link { + return KeyRingListLinkKind + } + return KeyRingListKind +} + +// Link returns true iif this is a link. +func (l *KeyRingList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *KeyRingList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *KeyRingList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *KeyRingList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *KeyRingList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *KeyRingList) Get(i int) *KeyRing { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *KeyRingList) Slice() []*KeyRing { + var slice []*KeyRing + if l == nil { + slice = make([]*KeyRing, 0) + } else { + slice = make([]*KeyRing, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *KeyRingList) Each(f func(item *KeyRing) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *KeyRingList) Range(f func(index int, item *KeyRing) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/key_ring_type_json.go b/clustersmgmt/v2alpha1/key_ring_type_json.go new file mode 100644 index 00000000..049b2d9e --- /dev/null +++ b/clustersmgmt/v2alpha1/key_ring_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalKeyRing writes a value of the 'key_ring' type to the given writer. +func MarshalKeyRing(object *KeyRing, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeKeyRing(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeKeyRing writes a value of the 'key_ring' type to the given stream. +func writeKeyRing(object *KeyRing, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(KeyRingLinkKind) + } else { + stream.WriteString(KeyRingKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + } + stream.WriteObjectEnd() +} + +// UnmarshalKeyRing reads a value of the 'key_ring' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalKeyRing(source interface{}) (object *KeyRing, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readKeyRing(iterator) + err = iterator.Error + return +} + +// readKeyRing reads a value of the 'key_ring' type from the given iterator. +func readKeyRing(iterator *jsoniter.Iterator) *KeyRing { + object := &KeyRing{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == KeyRingLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/key_rings_inquiry_client.go b/clustersmgmt/v2alpha1/key_rings_inquiry_client.go new file mode 100644 index 00000000..be5464bf --- /dev/null +++ b/clustersmgmt/v2alpha1/key_rings_inquiry_client.go @@ -0,0 +1,318 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// KeyRingsInquiryClient is the client of the 'key_rings_inquiry' resource. +// +// Manages the collection of key rings inquiry. +type KeyRingsInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewKeyRingsInquiryClient creates a new client for the 'key_rings_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewKeyRingsInquiryClient(transport http.RoundTripper, path string) *KeyRingsInquiryClient { + return &KeyRingsInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of available key rings of the cloud provider. +// IMPORTANT: This collection doesn't currently support paging or searching, so the returned +// `page` will always be 1 and `size` and `total` will always be the total number of available regions +// of the provider. +func (c *KeyRingsInquiryClient) Search() *KeyRingsInquirySearchRequest { + return &KeyRingsInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// KeyRingsInquirySearchRequest is the request for the 'search' method. +type KeyRingsInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *KeyRingsInquirySearchRequest) Parameter(name string, value interface{}) *KeyRingsInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KeyRingsInquirySearchRequest) Header(name string, value interface{}) *KeyRingsInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KeyRingsInquirySearchRequest) Impersonate(user string) *KeyRingsInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry +func (r *KeyRingsInquirySearchRequest) Body(value *CloudProviderData) *KeyRingsInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *KeyRingsInquirySearchRequest) Page(value int) *KeyRingsInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// key rings of the provider. +func (r *KeyRingsInquirySearchRequest) Size(value int) *KeyRingsInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KeyRingsInquirySearchRequest) Send() (result *KeyRingsInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KeyRingsInquirySearchRequest) SendContext(ctx context.Context) (result *KeyRingsInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeKeyRingsInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KeyRingsInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readKeyRingsInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// KeyRingsInquirySearchResponse is the response for the 'search' method. +type KeyRingsInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + items *KeyRingList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *KeyRingsInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KeyRingsInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KeyRingsInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of key rings. +func (r *KeyRingsInquirySearchResponse) Items() *KeyRingList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of key rings. +func (r *KeyRingsInquirySearchResponse) GetItems() (value *KeyRingList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *KeyRingsInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *KeyRingsInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// key rings of the provider. +func (r *KeyRingsInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// key rings of the provider. +func (r *KeyRingsInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available key rings of the provider. +func (r *KeyRingsInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available key rings of the provider. +func (r *KeyRingsInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/key_rings_inquiry_resource_json.go b/clustersmgmt/v2alpha1/key_rings_inquiry_resource_json.go new file mode 100644 index 00000000..da2d60c9 --- /dev/null +++ b/clustersmgmt/v2alpha1/key_rings_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeKeyRingsInquirySearchRequest(request *KeyRingsInquirySearchRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readKeyRingsInquirySearchResponse(response *KeyRingsInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readKeyRingList(iterator) + response.items = &KeyRingList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_builder.go b/clustersmgmt/v2alpha1/kubelet_config_builder.go new file mode 100644 index 00000000..2b047f07 --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_builder.go @@ -0,0 +1,100 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// KubeletConfigBuilder contains the data and logic needed to build 'kubelet_config' objects. +// +// OCM representation of KubeletConfig, exposing the fields of Kubernetes +// KubeletConfig that can be managed by users +type KubeletConfigBuilder struct { + bitmap_ uint32 + id string + href string + name string + podPidsLimit int +} + +// NewKubeletConfig creates a new builder of 'kubelet_config' objects. +func NewKubeletConfig() *KubeletConfigBuilder { + return &KubeletConfigBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *KubeletConfigBuilder) Link(value bool) *KubeletConfigBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *KubeletConfigBuilder) ID(value string) *KubeletConfigBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *KubeletConfigBuilder) HREF(value string) *KubeletConfigBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *KubeletConfigBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *KubeletConfigBuilder) Name(value string) *KubeletConfigBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// PodPidsLimit sets the value of the 'pod_pids_limit' attribute to the given value. +func (b *KubeletConfigBuilder) PodPidsLimit(value int) *KubeletConfigBuilder { + b.podPidsLimit = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *KubeletConfigBuilder) Copy(object *KubeletConfig) *KubeletConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.name = object.name + b.podPidsLimit = object.podPidsLimit + return b +} + +// Build creates a 'kubelet_config' object using the configuration stored in the builder. +func (b *KubeletConfigBuilder) Build() (object *KubeletConfig, err error) { + object = new(KubeletConfig) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.name = b.name + object.podPidsLimit = b.podPidsLimit + return +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_client.go b/clustersmgmt/v2alpha1/kubelet_config_client.go new file mode 100644 index 00000000..e9ec0d9f --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_client.go @@ -0,0 +1,731 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// KubeletConfigClient is the client of the 'kubelet_config' resource. +// +// Manages global KubeletConfig configuration for worker nodes in a cluster. +type KubeletConfigClient struct { + transport http.RoundTripper + path string +} + +// NewKubeletConfigClient creates a new client for the 'kubelet_config' +// resource using the given transport to send the requests and receive the +// responses. +func NewKubeletConfigClient(transport http.RoundTripper, path string) *KubeletConfigClient { + return &KubeletConfigClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the cluster KubeletConfig +func (c *KubeletConfigClient) Delete() *KubeletConfigDeleteRequest { + return &KubeletConfigDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the KubeletConfig for a cluster +func (c *KubeletConfigClient) Get() *KubeletConfigGetRequest { + return &KubeletConfigGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Post creates a request for the 'post' method. +// +// Creates a new cluster KubeletConfig +func (c *KubeletConfigClient) Post() *KubeletConfigPostRequest { + return &KubeletConfigPostRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the existing cluster KubeletConfig +func (c *KubeletConfigClient) Update() *KubeletConfigUpdateRequest { + return &KubeletConfigUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// KubeletConfigPollRequest is the request for the Poll method. +type KubeletConfigPollRequest struct { + request *KubeletConfigGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *KubeletConfigPollRequest) Parameter(name string, value interface{}) *KubeletConfigPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *KubeletConfigPollRequest) Header(name string, value interface{}) *KubeletConfigPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *KubeletConfigPollRequest) Interval(value time.Duration) *KubeletConfigPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *KubeletConfigPollRequest) Status(value int) *KubeletConfigPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *KubeletConfigPollRequest) Predicate(value func(*KubeletConfigGetResponse) bool) *KubeletConfigPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*KubeletConfigGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *KubeletConfigPollRequest) StartContext(ctx context.Context) (response *KubeletConfigPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &KubeletConfigPollResponse{ + response: result.(*KubeletConfigGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *KubeletConfigPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// KubeletConfigPollResponse is the response for the Poll method. +type KubeletConfigPollResponse struct { + response *KubeletConfigGetResponse +} + +// Status returns the response status code. +func (r *KubeletConfigPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *KubeletConfigPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *KubeletConfigPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *KubeletConfigPollResponse) Body() *KubeletConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *KubeletConfigPollResponse) GetBody() (value *KubeletConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *KubeletConfigClient) Poll() *KubeletConfigPollRequest { + return &KubeletConfigPollRequest{ + request: c.Get(), + } +} + +// KubeletConfigDeleteRequest is the request for the 'delete' method. +type KubeletConfigDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *KubeletConfigDeleteRequest) Parameter(name string, value interface{}) *KubeletConfigDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KubeletConfigDeleteRequest) Header(name string, value interface{}) *KubeletConfigDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KubeletConfigDeleteRequest) Impersonate(user string) *KubeletConfigDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KubeletConfigDeleteRequest) Send() (result *KubeletConfigDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KubeletConfigDeleteRequest) SendContext(ctx context.Context) (result *KubeletConfigDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KubeletConfigDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// KubeletConfigDeleteResponse is the response for the 'delete' method. +type KubeletConfigDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *KubeletConfigDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KubeletConfigDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KubeletConfigDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// KubeletConfigGetRequest is the request for the 'get' method. +type KubeletConfigGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *KubeletConfigGetRequest) Parameter(name string, value interface{}) *KubeletConfigGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KubeletConfigGetRequest) Header(name string, value interface{}) *KubeletConfigGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KubeletConfigGetRequest) Impersonate(user string) *KubeletConfigGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KubeletConfigGetRequest) Send() (result *KubeletConfigGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KubeletConfigGetRequest) SendContext(ctx context.Context) (result *KubeletConfigGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KubeletConfigGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readKubeletConfigGetResponse(result, reader) + if err != nil { + return + } + return +} + +// KubeletConfigGetResponse is the response for the 'get' method. +type KubeletConfigGetResponse struct { + status int + header http.Header + err *errors.Error + body *KubeletConfig +} + +// Status returns the response status code. +func (r *KubeletConfigGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KubeletConfigGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KubeletConfigGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *KubeletConfigGetResponse) Body() *KubeletConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *KubeletConfigGetResponse) GetBody() (value *KubeletConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// KubeletConfigPostRequest is the request for the 'post' method. +type KubeletConfigPostRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *KubeletConfig +} + +// Parameter adds a query parameter. +func (r *KubeletConfigPostRequest) Parameter(name string, value interface{}) *KubeletConfigPostRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KubeletConfigPostRequest) Header(name string, value interface{}) *KubeletConfigPostRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KubeletConfigPostRequest) Impersonate(user string) *KubeletConfigPostRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *KubeletConfigPostRequest) Body(value *KubeletConfig) *KubeletConfigPostRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KubeletConfigPostRequest) Send() (result *KubeletConfigPostResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KubeletConfigPostRequest) SendContext(ctx context.Context) (result *KubeletConfigPostResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeKubeletConfigPostRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KubeletConfigPostResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readKubeletConfigPostResponse(result, reader) + if err != nil { + return + } + return +} + +// KubeletConfigPostResponse is the response for the 'post' method. +type KubeletConfigPostResponse struct { + status int + header http.Header + err *errors.Error + body *KubeletConfig +} + +// Status returns the response status code. +func (r *KubeletConfigPostResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KubeletConfigPostResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KubeletConfigPostResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *KubeletConfigPostResponse) Body() *KubeletConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *KubeletConfigPostResponse) GetBody() (value *KubeletConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// KubeletConfigUpdateRequest is the request for the 'update' method. +type KubeletConfigUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *KubeletConfig +} + +// Parameter adds a query parameter. +func (r *KubeletConfigUpdateRequest) Parameter(name string, value interface{}) *KubeletConfigUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KubeletConfigUpdateRequest) Header(name string, value interface{}) *KubeletConfigUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KubeletConfigUpdateRequest) Impersonate(user string) *KubeletConfigUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *KubeletConfigUpdateRequest) Body(value *KubeletConfig) *KubeletConfigUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KubeletConfigUpdateRequest) Send() (result *KubeletConfigUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KubeletConfigUpdateRequest) SendContext(ctx context.Context) (result *KubeletConfigUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeKubeletConfigUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KubeletConfigUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readKubeletConfigUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// KubeletConfigUpdateResponse is the response for the 'update' method. +type KubeletConfigUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *KubeletConfig +} + +// Status returns the response status code. +func (r *KubeletConfigUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KubeletConfigUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KubeletConfigUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *KubeletConfigUpdateResponse) Body() *KubeletConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *KubeletConfigUpdateResponse) GetBody() (value *KubeletConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_list_builder.go b/clustersmgmt/v2alpha1/kubelet_config_list_builder.go new file mode 100644 index 00000000..5c9d423a --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// KubeletConfigListBuilder contains the data and logic needed to build +// 'kubelet_config' objects. +type KubeletConfigListBuilder struct { + items []*KubeletConfigBuilder +} + +// NewKubeletConfigList creates a new builder of 'kubelet_config' objects. +func NewKubeletConfigList() *KubeletConfigListBuilder { + return new(KubeletConfigListBuilder) +} + +// Items sets the items of the list. +func (b *KubeletConfigListBuilder) Items(values ...*KubeletConfigBuilder) *KubeletConfigListBuilder { + b.items = make([]*KubeletConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *KubeletConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *KubeletConfigListBuilder) Copy(list *KubeletConfigList) *KubeletConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*KubeletConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewKubeletConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'kubelet_config' objects using the +// configuration stored in the builder. +func (b *KubeletConfigListBuilder) Build() (list *KubeletConfigList, err error) { + items := make([]*KubeletConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(KubeletConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_list_type_json.go b/clustersmgmt/v2alpha1/kubelet_config_list_type_json.go new file mode 100644 index 00000000..4c2caa62 --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalKubeletConfigList writes a list of values of the 'kubelet_config' type to +// the given writer. +func MarshalKubeletConfigList(list []*KubeletConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeKubeletConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeKubeletConfigList writes a list of value of the 'kubelet_config' type to +// the given stream. +func writeKubeletConfigList(list []*KubeletConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeKubeletConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalKubeletConfigList reads a list of values of the 'kubelet_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalKubeletConfigList(source interface{}) (items []*KubeletConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readKubeletConfigList(iterator) + err = iterator.Error + return +} + +// readKubeletConfigList reads list of values of the ”kubelet_config' type from +// the given iterator. +func readKubeletConfigList(iterator *jsoniter.Iterator) []*KubeletConfig { + list := []*KubeletConfig{} + for iterator.ReadArray() { + item := readKubeletConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_resource_json.go b/clustersmgmt/v2alpha1/kubelet_config_resource_json.go new file mode 100644 index 00000000..d9f1bd92 --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_resource_json.go @@ -0,0 +1,53 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeKubeletConfigDeleteRequest(request *KubeletConfigDeleteRequest, writer io.Writer) error { + return nil +} +func readKubeletConfigDeleteResponse(response *KubeletConfigDeleteResponse, reader io.Reader) error { + return nil +} +func writeKubeletConfigGetRequest(request *KubeletConfigGetRequest, writer io.Writer) error { + return nil +} +func readKubeletConfigGetResponse(response *KubeletConfigGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalKubeletConfig(reader) + return err +} +func writeKubeletConfigPostRequest(request *KubeletConfigPostRequest, writer io.Writer) error { + return MarshalKubeletConfig(request.body, writer) +} +func readKubeletConfigPostResponse(response *KubeletConfigPostResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalKubeletConfig(reader) + return err +} +func writeKubeletConfigUpdateRequest(request *KubeletConfigUpdateRequest, writer io.Writer) error { + return MarshalKubeletConfig(request.body, writer) +} +func readKubeletConfigUpdateResponse(response *KubeletConfigUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalKubeletConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_type.go b/clustersmgmt/v2alpha1/kubelet_config_type.go new file mode 100644 index 00000000..5865db8b --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_type.go @@ -0,0 +1,271 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// KubeletConfigKind is the name of the type used to represent objects +// of type 'kubelet_config'. +const KubeletConfigKind = "KubeletConfig" + +// KubeletConfigLinkKind is the name of the type used to represent links +// to objects of type 'kubelet_config'. +const KubeletConfigLinkKind = "KubeletConfigLink" + +// KubeletConfigNilKind is the name of the type used to nil references +// to objects of type 'kubelet_config'. +const KubeletConfigNilKind = "KubeletConfigNil" + +// KubeletConfig represents the values of the 'kubelet_config' type. +// +// OCM representation of KubeletConfig, exposing the fields of Kubernetes +// KubeletConfig that can be managed by users +type KubeletConfig struct { + bitmap_ uint32 + id string + href string + name string + podPidsLimit int +} + +// Kind returns the name of the type of the object. +func (o *KubeletConfig) Kind() string { + if o == nil { + return KubeletConfigNilKind + } + if o.bitmap_&1 != 0 { + return KubeletConfigLinkKind + } + return KubeletConfigKind +} + +// Link returns true iif this is a link. +func (o *KubeletConfig) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *KubeletConfig) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *KubeletConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *KubeletConfig) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *KubeletConfig) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *KubeletConfig) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Allows the user to specify the name to be used to identify this KubeletConfig. +// Optional. A name will be generated if not provided. +func (o *KubeletConfig) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Allows the user to specify the name to be used to identify this KubeletConfig. +// Optional. A name will be generated if not provided. +func (o *KubeletConfig) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// PodPidsLimit returns the value of the 'pod_pids_limit' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Allows the user to specify the podPidsLimit to be applied via KubeletConfig. +// Useful if workloads have greater PIDs limit requirements than the OCP default. +func (o *KubeletConfig) PodPidsLimit() int { + if o != nil && o.bitmap_&16 != 0 { + return o.podPidsLimit + } + return 0 +} + +// GetPodPidsLimit returns the value of the 'pod_pids_limit' attribute and +// a flag indicating if the attribute has a value. +// +// Allows the user to specify the podPidsLimit to be applied via KubeletConfig. +// Useful if workloads have greater PIDs limit requirements than the OCP default. +func (o *KubeletConfig) GetPodPidsLimit() (value int, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.podPidsLimit + } + return +} + +// KubeletConfigListKind is the name of the type used to represent list of objects of +// type 'kubelet_config'. +const KubeletConfigListKind = "KubeletConfigList" + +// KubeletConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'kubelet_config'. +const KubeletConfigListLinkKind = "KubeletConfigListLink" + +// KubeletConfigNilKind is the name of the type used to nil lists of objects of +// type 'kubelet_config'. +const KubeletConfigListNilKind = "KubeletConfigListNil" + +// KubeletConfigList is a list of values of the 'kubelet_config' type. +type KubeletConfigList struct { + href string + link bool + items []*KubeletConfig +} + +// Kind returns the name of the type of the object. +func (l *KubeletConfigList) Kind() string { + if l == nil { + return KubeletConfigListNilKind + } + if l.link { + return KubeletConfigListLinkKind + } + return KubeletConfigListKind +} + +// Link returns true iif this is a link. +func (l *KubeletConfigList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *KubeletConfigList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *KubeletConfigList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *KubeletConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *KubeletConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *KubeletConfigList) Get(i int) *KubeletConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *KubeletConfigList) Slice() []*KubeletConfig { + var slice []*KubeletConfig + if l == nil { + slice = make([]*KubeletConfig, 0) + } else { + slice = make([]*KubeletConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *KubeletConfigList) Each(f func(item *KubeletConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *KubeletConfigList) Range(f func(index int, item *KubeletConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/kubelet_config_type_json.go b/clustersmgmt/v2alpha1/kubelet_config_type_json.go new file mode 100644 index 00000000..9e64c3a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_config_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalKubeletConfig writes a value of the 'kubelet_config' type to the given writer. +func MarshalKubeletConfig(object *KubeletConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeKubeletConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeKubeletConfig writes a value of the 'kubelet_config' type to the given stream. +func writeKubeletConfig(object *KubeletConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(KubeletConfigLinkKind) + } else { + stream.WriteString(KubeletConfigKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("pod_pids_limit") + stream.WriteInt(object.podPidsLimit) + } + stream.WriteObjectEnd() +} + +// UnmarshalKubeletConfig reads a value of the 'kubelet_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalKubeletConfig(source interface{}) (object *KubeletConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readKubeletConfig(iterator) + err = iterator.Error + return +} + +// readKubeletConfig reads a value of the 'kubelet_config' type from the given iterator. +func readKubeletConfig(iterator *jsoniter.Iterator) *KubeletConfig { + object := &KubeletConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == KubeletConfigLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + case "pod_pids_limit": + value := iterator.ReadInt() + object.podPidsLimit = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/kubelet_configs_client.go b/clustersmgmt/v2alpha1/kubelet_configs_client.go new file mode 100644 index 00000000..d193fc9f --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_configs_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// KubeletConfigsClient is the client of the 'kubelet_configs' resource. +// +// Manages the collection of KubeletConfigs for a cluster. +type KubeletConfigsClient struct { + transport http.RoundTripper + path string +} + +// NewKubeletConfigsClient creates a new client for the 'kubelet_configs' +// resource using the given transport to send the requests and receive the +// responses. +func NewKubeletConfigsClient(transport http.RoundTripper, path string) *KubeletConfigsClient { + return &KubeletConfigsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new KubeletConfig to the cluster. +func (c *KubeletConfigsClient) Add() *KubeletConfigsAddRequest { + return &KubeletConfigsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of KubeletConfigs for the cluster. +func (c *KubeletConfigsClient) List() *KubeletConfigsListRequest { + return &KubeletConfigsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// KubeletConfig returns the target 'hcp_kubelet_config' resource for the given identifier. +// +// Reference to the service that manages a specific KubeletConfig. +func (c *KubeletConfigsClient) KubeletConfig(id string) *HcpKubeletConfigClient { + return NewHcpKubeletConfigClient( + c.transport, + path.Join(c.path, id), + ) +} + +// KubeletConfigsAddRequest is the request for the 'add' method. +type KubeletConfigsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *KubeletConfig +} + +// Parameter adds a query parameter. +func (r *KubeletConfigsAddRequest) Parameter(name string, value interface{}) *KubeletConfigsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KubeletConfigsAddRequest) Header(name string, value interface{}) *KubeletConfigsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KubeletConfigsAddRequest) Impersonate(user string) *KubeletConfigsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the KubeletConfig. +func (r *KubeletConfigsAddRequest) Body(value *KubeletConfig) *KubeletConfigsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KubeletConfigsAddRequest) Send() (result *KubeletConfigsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KubeletConfigsAddRequest) SendContext(ctx context.Context) (result *KubeletConfigsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeKubeletConfigsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KubeletConfigsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readKubeletConfigsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// KubeletConfigsAddResponse is the response for the 'add' method. +type KubeletConfigsAddResponse struct { + status int + header http.Header + err *errors.Error + body *KubeletConfig +} + +// Status returns the response status code. +func (r *KubeletConfigsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KubeletConfigsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KubeletConfigsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the KubeletConfig. +func (r *KubeletConfigsAddResponse) Body() *KubeletConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the KubeletConfig. +func (r *KubeletConfigsAddResponse) GetBody() (value *KubeletConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// KubeletConfigsListRequest is the request for the 'list' method. +type KubeletConfigsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *KubeletConfigsListRequest) Parameter(name string, value interface{}) *KubeletConfigsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *KubeletConfigsListRequest) Header(name string, value interface{}) *KubeletConfigsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *KubeletConfigsListRequest) Impersonate(user string) *KubeletConfigsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *KubeletConfigsListRequest) Page(value int) *KubeletConfigsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *KubeletConfigsListRequest) Size(value int) *KubeletConfigsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *KubeletConfigsListRequest) Send() (result *KubeletConfigsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *KubeletConfigsListRequest) SendContext(ctx context.Context) (result *KubeletConfigsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &KubeletConfigsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readKubeletConfigsListResponse(result, reader) + if err != nil { + return + } + return +} + +// KubeletConfigsListResponse is the response for the 'list' method. +type KubeletConfigsListResponse struct { + status int + header http.Header + err *errors.Error + items *KubeletConfigList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *KubeletConfigsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *KubeletConfigsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *KubeletConfigsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of KubeletConfigs. +func (r *KubeletConfigsListResponse) Items() *KubeletConfigList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of KubeletConfigs. +func (r *KubeletConfigsListResponse) GetItems() (value *KubeletConfigList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *KubeletConfigsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *KubeletConfigsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *KubeletConfigsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *KubeletConfigsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *KubeletConfigsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *KubeletConfigsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/kubelet_configs_resource_json.go b/clustersmgmt/v2alpha1/kubelet_configs_resource_json.go new file mode 100644 index 00000000..02a21614 --- /dev/null +++ b/clustersmgmt/v2alpha1/kubelet_configs_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeKubeletConfigsAddRequest(request *KubeletConfigsAddRequest, writer io.Writer) error { + return MarshalKubeletConfig(request.body, writer) +} +func readKubeletConfigsAddResponse(response *KubeletConfigsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalKubeletConfig(reader) + return err +} +func writeKubeletConfigsListRequest(request *KubeletConfigsListRequest, writer io.Writer) error { + return nil +} +func readKubeletConfigsListResponse(response *KubeletConfigsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readKubeletConfigList(iterator) + response.items = &KubeletConfigList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/label_builder.go b/clustersmgmt/v2alpha1/label_builder.go new file mode 100644 index 00000000..23fc2e1a --- /dev/null +++ b/clustersmgmt/v2alpha1/label_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LabelBuilder contains the data and logic needed to build 'label' objects. +// +// Representation of a label in clusterdeployment. +type LabelBuilder struct { + bitmap_ uint32 + id string + href string + key string + value string +} + +// NewLabel creates a new builder of 'label' objects. +func NewLabel() *LabelBuilder { + return &LabelBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *LabelBuilder) Link(value bool) *LabelBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *LabelBuilder) ID(value string) *LabelBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *LabelBuilder) HREF(value string) *LabelBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *LabelBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Key sets the value of the 'key' attribute to the given value. +func (b *LabelBuilder) Key(value string) *LabelBuilder { + b.key = value + b.bitmap_ |= 8 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *LabelBuilder) Value(value string) *LabelBuilder { + b.value = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *LabelBuilder) Copy(object *Label) *LabelBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.key = object.key + b.value = object.value + return b +} + +// Build creates a 'label' object using the configuration stored in the builder. +func (b *LabelBuilder) Build() (object *Label, err error) { + object = new(Label) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.key = b.key + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/label_client.go b/clustersmgmt/v2alpha1/label_client.go new file mode 100644 index 00000000..385100ec --- /dev/null +++ b/clustersmgmt/v2alpha1/label_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LabelClient is the client of the 'label' resource. +// +// Manages a specific label. +type LabelClient struct { + transport http.RoundTripper + path string +} + +// NewLabelClient creates a new client for the 'label' +// resource using the given transport to send the requests and receive the +// responses. +func NewLabelClient(transport http.RoundTripper, path string) *LabelClient { + return &LabelClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the label. +func (c *LabelClient) Delete() *LabelDeleteRequest { + return &LabelDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the label. +func (c *LabelClient) Get() *LabelGetRequest { + return &LabelGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the label. +func (c *LabelClient) Update() *LabelUpdateRequest { + return &LabelUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// LabelPollRequest is the request for the Poll method. +type LabelPollRequest struct { + request *LabelGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *LabelPollRequest) Parameter(name string, value interface{}) *LabelPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *LabelPollRequest) Header(name string, value interface{}) *LabelPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *LabelPollRequest) Interval(value time.Duration) *LabelPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *LabelPollRequest) Status(value int) *LabelPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *LabelPollRequest) Predicate(value func(*LabelGetResponse) bool) *LabelPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*LabelGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *LabelPollRequest) StartContext(ctx context.Context) (response *LabelPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &LabelPollResponse{ + response: result.(*LabelGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *LabelPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// LabelPollResponse is the response for the Poll method. +type LabelPollResponse struct { + response *LabelGetResponse +} + +// Status returns the response status code. +func (r *LabelPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *LabelPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *LabelPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *LabelPollResponse) Body() *Label { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LabelPollResponse) GetBody() (value *Label, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *LabelClient) Poll() *LabelPollRequest { + return &LabelPollRequest{ + request: c.Get(), + } +} + +// LabelDeleteRequest is the request for the 'delete' method. +type LabelDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *LabelDeleteRequest) Parameter(name string, value interface{}) *LabelDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LabelDeleteRequest) Header(name string, value interface{}) *LabelDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LabelDeleteRequest) Impersonate(user string) *LabelDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LabelDeleteRequest) Send() (result *LabelDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LabelDeleteRequest) SendContext(ctx context.Context) (result *LabelDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LabelDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// LabelDeleteResponse is the response for the 'delete' method. +type LabelDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *LabelDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LabelDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LabelDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// LabelGetRequest is the request for the 'get' method. +type LabelGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *LabelGetRequest) Parameter(name string, value interface{}) *LabelGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LabelGetRequest) Header(name string, value interface{}) *LabelGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LabelGetRequest) Impersonate(user string) *LabelGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LabelGetRequest) Send() (result *LabelGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LabelGetRequest) SendContext(ctx context.Context) (result *LabelGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LabelGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLabelGetResponse(result, reader) + if err != nil { + return + } + return +} + +// LabelGetResponse is the response for the 'get' method. +type LabelGetResponse struct { + status int + header http.Header + err *errors.Error + body *Label +} + +// Status returns the response status code. +func (r *LabelGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LabelGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LabelGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *LabelGetResponse) Body() *Label { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LabelGetResponse) GetBody() (value *Label, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// LabelUpdateRequest is the request for the 'update' method. +type LabelUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Label +} + +// Parameter adds a query parameter. +func (r *LabelUpdateRequest) Parameter(name string, value interface{}) *LabelUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LabelUpdateRequest) Header(name string, value interface{}) *LabelUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LabelUpdateRequest) Impersonate(user string) *LabelUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *LabelUpdateRequest) Body(value *Label) *LabelUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LabelUpdateRequest) Send() (result *LabelUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LabelUpdateRequest) SendContext(ctx context.Context) (result *LabelUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeLabelUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LabelUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLabelUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// LabelUpdateResponse is the response for the 'update' method. +type LabelUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Label +} + +// Status returns the response status code. +func (r *LabelUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LabelUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LabelUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *LabelUpdateResponse) Body() *Label { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LabelUpdateResponse) GetBody() (value *Label, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/label_list_builder.go b/clustersmgmt/v2alpha1/label_list_builder.go new file mode 100644 index 00000000..6a1874c3 --- /dev/null +++ b/clustersmgmt/v2alpha1/label_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LabelListBuilder contains the data and logic needed to build +// 'label' objects. +type LabelListBuilder struct { + items []*LabelBuilder +} + +// NewLabelList creates a new builder of 'label' objects. +func NewLabelList() *LabelListBuilder { + return new(LabelListBuilder) +} + +// Items sets the items of the list. +func (b *LabelListBuilder) Items(values ...*LabelBuilder) *LabelListBuilder { + b.items = make([]*LabelBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *LabelListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *LabelListBuilder) Copy(list *LabelList) *LabelListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*LabelBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewLabel().Copy(v) + } + } + return b +} + +// Build creates a list of 'label' objects using the +// configuration stored in the builder. +func (b *LabelListBuilder) Build() (list *LabelList, err error) { + items := make([]*Label, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(LabelList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/label_list_type_json.go b/clustersmgmt/v2alpha1/label_list_type_json.go new file mode 100644 index 00000000..f15ac874 --- /dev/null +++ b/clustersmgmt/v2alpha1/label_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLabelList writes a list of values of the 'label' type to +// the given writer. +func MarshalLabelList(list []*Label, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLabelList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLabelList writes a list of value of the 'label' type to +// the given stream. +func writeLabelList(list []*Label, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeLabel(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalLabelList reads a list of values of the 'label' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLabelList(source interface{}) (items []*Label, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLabelList(iterator) + err = iterator.Error + return +} + +// readLabelList reads list of values of the ”label' type from +// the given iterator. +func readLabelList(iterator *jsoniter.Iterator) []*Label { + list := []*Label{} + for iterator.ReadArray() { + item := readLabel(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/label_resource_json.go b/clustersmgmt/v2alpha1/label_resource_json.go new file mode 100644 index 00000000..edce515e --- /dev/null +++ b/clustersmgmt/v2alpha1/label_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeLabelDeleteRequest(request *LabelDeleteRequest, writer io.Writer) error { + return nil +} +func readLabelDeleteResponse(response *LabelDeleteResponse, reader io.Reader) error { + return nil +} +func writeLabelGetRequest(request *LabelGetRequest, writer io.Writer) error { + return nil +} +func readLabelGetResponse(response *LabelGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLabel(reader) + return err +} +func writeLabelUpdateRequest(request *LabelUpdateRequest, writer io.Writer) error { + return MarshalLabel(request.body, writer) +} +func readLabelUpdateResponse(response *LabelUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLabel(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/label_type.go b/clustersmgmt/v2alpha1/label_type.go new file mode 100644 index 00000000..bae4cb41 --- /dev/null +++ b/clustersmgmt/v2alpha1/label_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LabelKind is the name of the type used to represent objects +// of type 'label'. +const LabelKind = "Label" + +// LabelLinkKind is the name of the type used to represent links +// to objects of type 'label'. +const LabelLinkKind = "LabelLink" + +// LabelNilKind is the name of the type used to nil references +// to objects of type 'label'. +const LabelNilKind = "LabelNil" + +// Label represents the values of the 'label' type. +// +// Representation of a label in clusterdeployment. +type Label struct { + bitmap_ uint32 + id string + href string + key string + value string +} + +// Kind returns the name of the type of the object. +func (o *Label) Kind() string { + if o == nil { + return LabelNilKind + } + if o.bitmap_&1 != 0 { + return LabelLinkKind + } + return LabelKind +} + +// Link returns true iif this is a link. +func (o *Label) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Label) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Label) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Label) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Label) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Label) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Key returns the value of the 'key' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// the key of the label +func (o *Label) Key() string { + if o != nil && o.bitmap_&8 != 0 { + return o.key + } + return "" +} + +// GetKey returns the value of the 'key' attribute and +// a flag indicating if the attribute has a value. +// +// the key of the label +func (o *Label) GetKey() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.key + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// the value to set in the label +func (o *Label) Value() string { + if o != nil && o.bitmap_&16 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// the value to set in the label +func (o *Label) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.value + } + return +} + +// LabelListKind is the name of the type used to represent list of objects of +// type 'label'. +const LabelListKind = "LabelList" + +// LabelListLinkKind is the name of the type used to represent links to list +// of objects of type 'label'. +const LabelListLinkKind = "LabelListLink" + +// LabelNilKind is the name of the type used to nil lists of objects of +// type 'label'. +const LabelListNilKind = "LabelListNil" + +// LabelList is a list of values of the 'label' type. +type LabelList struct { + href string + link bool + items []*Label +} + +// Kind returns the name of the type of the object. +func (l *LabelList) Kind() string { + if l == nil { + return LabelListNilKind + } + if l.link { + return LabelListLinkKind + } + return LabelListKind +} + +// Link returns true iif this is a link. +func (l *LabelList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *LabelList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *LabelList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *LabelList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *LabelList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *LabelList) Get(i int) *Label { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *LabelList) Slice() []*Label { + var slice []*Label + if l == nil { + slice = make([]*Label, 0) + } else { + slice = make([]*Label, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *LabelList) Each(f func(item *Label) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *LabelList) Range(f func(index int, item *Label) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/label_type_json.go b/clustersmgmt/v2alpha1/label_type_json.go new file mode 100644 index 00000000..27c6a77e --- /dev/null +++ b/clustersmgmt/v2alpha1/label_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLabel writes a value of the 'label' type to the given writer. +func MarshalLabel(object *Label, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLabel(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLabel writes a value of the 'label' type to the given stream. +func writeLabel(object *Label, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(LabelLinkKind) + } else { + stream.WriteString(LabelKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key") + stream.WriteString(object.key) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalLabel reads a value of the 'label' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalLabel(source interface{}) (object *Label, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readLabel(iterator) + err = iterator.Error + return +} + +// readLabel reads a value of the 'label' type from the given iterator. +func readLabel(iterator *jsoniter.Iterator) *Label { + object := &Label{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == LabelLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "key": + value := iterator.ReadString() + object.key = value + object.bitmap_ |= 8 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/labels_client.go b/clustersmgmt/v2alpha1/labels_client.go new file mode 100644 index 00000000..75fa110f --- /dev/null +++ b/clustersmgmt/v2alpha1/labels_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LabelsClient is the client of the 'labels' resource. +// +// Manages the collection of labels of a cluster. +type LabelsClient struct { + transport http.RoundTripper + path string +} + +// NewLabelsClient creates a new client for the 'labels' +// resource using the given transport to send the requests and receive the +// responses. +func NewLabelsClient(transport http.RoundTripper, path string) *LabelsClient { + return &LabelsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new label to the cluster. +func (c *LabelsClient) Add() *LabelsAddRequest { + return &LabelsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of labels. +func (c *LabelsClient) List() *LabelsListRequest { + return &LabelsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Label returns the target 'label' resource for the given identifier. +// +// Reference to the service that manages an specific label. +func (c *LabelsClient) Label(id string) *LabelClient { + return NewLabelClient( + c.transport, + path.Join(c.path, id), + ) +} + +// LabelsAddRequest is the request for the 'add' method. +type LabelsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Label +} + +// Parameter adds a query parameter. +func (r *LabelsAddRequest) Parameter(name string, value interface{}) *LabelsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LabelsAddRequest) Header(name string, value interface{}) *LabelsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LabelsAddRequest) Impersonate(user string) *LabelsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the label. +func (r *LabelsAddRequest) Body(value *Label) *LabelsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LabelsAddRequest) Send() (result *LabelsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LabelsAddRequest) SendContext(ctx context.Context) (result *LabelsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeLabelsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LabelsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLabelsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// LabelsAddResponse is the response for the 'add' method. +type LabelsAddResponse struct { + status int + header http.Header + err *errors.Error + body *Label +} + +// Status returns the response status code. +func (r *LabelsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LabelsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LabelsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the label. +func (r *LabelsAddResponse) Body() *Label { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the label. +func (r *LabelsAddResponse) GetBody() (value *Label, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// LabelsListRequest is the request for the 'list' method. +type LabelsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *LabelsListRequest) Parameter(name string, value interface{}) *LabelsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LabelsListRequest) Header(name string, value interface{}) *LabelsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LabelsListRequest) Impersonate(user string) *LabelsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LabelsListRequest) Page(value int) *LabelsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LabelsListRequest) Size(value int) *LabelsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LabelsListRequest) Send() (result *LabelsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LabelsListRequest) SendContext(ctx context.Context) (result *LabelsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LabelsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLabelsListResponse(result, reader) + if err != nil { + return + } + return +} + +// LabelsListResponse is the response for the 'list' method. +type LabelsListResponse struct { + status int + header http.Header + err *errors.Error + items *LabelList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *LabelsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LabelsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LabelsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of labels. +func (r *LabelsListResponse) Items() *LabelList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of labels. +func (r *LabelsListResponse) GetItems() (value *LabelList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LabelsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LabelsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LabelsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *LabelsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *LabelsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *LabelsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/labels_resource_json.go b/clustersmgmt/v2alpha1/labels_resource_json.go new file mode 100644 index 00000000..a73cc6f9 --- /dev/null +++ b/clustersmgmt/v2alpha1/labels_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeLabelsAddRequest(request *LabelsAddRequest, writer io.Writer) error { + return MarshalLabel(request.body, writer) +} +func readLabelsAddResponse(response *LabelsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLabel(reader) + return err +} +func writeLabelsListRequest(request *LabelsListRequest, writer io.Writer) error { + return nil +} +func readLabelsListResponse(response *LabelsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readLabelList(iterator) + response.items = &LabelList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/ldap_attributes_builder.go b/clustersmgmt/v2alpha1/ldap_attributes_builder.go new file mode 100644 index 00000000..f9b94e6a --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_attributes_builder.go @@ -0,0 +1,129 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LDAPAttributesBuilder contains the data and logic needed to build 'LDAP_attributes' objects. +// +// LDAP attributes used to configure the LDAP identity provider. +type LDAPAttributesBuilder struct { + bitmap_ uint32 + id []string + email []string + name []string + preferredUsername []string +} + +// NewLDAPAttributes creates a new builder of 'LDAP_attributes' objects. +func NewLDAPAttributes() *LDAPAttributesBuilder { + return &LDAPAttributesBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *LDAPAttributesBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given values. +func (b *LDAPAttributesBuilder) ID(values ...string) *LDAPAttributesBuilder { + b.id = make([]string, len(values)) + copy(b.id, values) + b.bitmap_ |= 1 + return b +} + +// Email sets the value of the 'email' attribute to the given values. +func (b *LDAPAttributesBuilder) Email(values ...string) *LDAPAttributesBuilder { + b.email = make([]string, len(values)) + copy(b.email, values) + b.bitmap_ |= 2 + return b +} + +// Name sets the value of the 'name' attribute to the given values. +func (b *LDAPAttributesBuilder) Name(values ...string) *LDAPAttributesBuilder { + b.name = make([]string, len(values)) + copy(b.name, values) + b.bitmap_ |= 4 + return b +} + +// PreferredUsername sets the value of the 'preferred_username' attribute to the given values. +func (b *LDAPAttributesBuilder) PreferredUsername(values ...string) *LDAPAttributesBuilder { + b.preferredUsername = make([]string, len(values)) + copy(b.preferredUsername, values) + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *LDAPAttributesBuilder) Copy(object *LDAPAttributes) *LDAPAttributesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.id != nil { + b.id = make([]string, len(object.id)) + copy(b.id, object.id) + } else { + b.id = nil + } + if object.email != nil { + b.email = make([]string, len(object.email)) + copy(b.email, object.email) + } else { + b.email = nil + } + if object.name != nil { + b.name = make([]string, len(object.name)) + copy(b.name, object.name) + } else { + b.name = nil + } + if object.preferredUsername != nil { + b.preferredUsername = make([]string, len(object.preferredUsername)) + copy(b.preferredUsername, object.preferredUsername) + } else { + b.preferredUsername = nil + } + return b +} + +// Build creates a 'LDAP_attributes' object using the configuration stored in the builder. +func (b *LDAPAttributesBuilder) Build() (object *LDAPAttributes, err error) { + object = new(LDAPAttributes) + object.bitmap_ = b.bitmap_ + if b.id != nil { + object.id = make([]string, len(b.id)) + copy(object.id, b.id) + } + if b.email != nil { + object.email = make([]string, len(b.email)) + copy(object.email, b.email) + } + if b.name != nil { + object.name = make([]string, len(b.name)) + copy(object.name, b.name) + } + if b.preferredUsername != nil { + object.preferredUsername = make([]string, len(b.preferredUsername)) + copy(object.preferredUsername, b.preferredUsername) + } + return +} diff --git a/clustersmgmt/v2alpha1/ldap_attributes_list_builder.go b/clustersmgmt/v2alpha1/ldap_attributes_list_builder.go new file mode 100644 index 00000000..1641281f --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_attributes_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LDAPAttributesListBuilder contains the data and logic needed to build +// 'LDAP_attributes' objects. +type LDAPAttributesListBuilder struct { + items []*LDAPAttributesBuilder +} + +// NewLDAPAttributesList creates a new builder of 'LDAP_attributes' objects. +func NewLDAPAttributesList() *LDAPAttributesListBuilder { + return new(LDAPAttributesListBuilder) +} + +// Items sets the items of the list. +func (b *LDAPAttributesListBuilder) Items(values ...*LDAPAttributesBuilder) *LDAPAttributesListBuilder { + b.items = make([]*LDAPAttributesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *LDAPAttributesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *LDAPAttributesListBuilder) Copy(list *LDAPAttributesList) *LDAPAttributesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*LDAPAttributesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewLDAPAttributes().Copy(v) + } + } + return b +} + +// Build creates a list of 'LDAP_attributes' objects using the +// configuration stored in the builder. +func (b *LDAPAttributesListBuilder) Build() (list *LDAPAttributesList, err error) { + items := make([]*LDAPAttributes, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(LDAPAttributesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ldap_attributes_list_type_json.go b/clustersmgmt/v2alpha1/ldap_attributes_list_type_json.go new file mode 100644 index 00000000..5261b9d4 --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_attributes_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLDAPAttributesList writes a list of values of the 'LDAP_attributes' type to +// the given writer. +func MarshalLDAPAttributesList(list []*LDAPAttributes, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLDAPAttributesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLDAPAttributesList writes a list of value of the 'LDAP_attributes' type to +// the given stream. +func writeLDAPAttributesList(list []*LDAPAttributes, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeLDAPAttributes(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalLDAPAttributesList reads a list of values of the 'LDAP_attributes' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLDAPAttributesList(source interface{}) (items []*LDAPAttributes, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLDAPAttributesList(iterator) + err = iterator.Error + return +} + +// readLDAPAttributesList reads list of values of the ”LDAP_attributes' type from +// the given iterator. +func readLDAPAttributesList(iterator *jsoniter.Iterator) []*LDAPAttributes { + list := []*LDAPAttributes{} + for iterator.ReadArray() { + item := readLDAPAttributes(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ldap_attributes_type.go b/clustersmgmt/v2alpha1/ldap_attributes_type.go new file mode 100644 index 00000000..8ac224ae --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_attributes_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LDAPAttributes represents the values of the 'LDAP_attributes' type. +// +// LDAP attributes used to configure the LDAP identity provider. +type LDAPAttributes struct { + bitmap_ uint32 + id []string + email []string + name []string + preferredUsername []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *LDAPAttributes) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of attributes to use as the identity. +func (o *LDAPAttributes) ID() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return nil +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// List of attributes to use as the identity. +func (o *LDAPAttributes) GetID() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// Email returns the value of the 'email' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of attributes to use as the mail address. +func (o *LDAPAttributes) Email() []string { + if o != nil && o.bitmap_&2 != 0 { + return o.email + } + return nil +} + +// GetEmail returns the value of the 'email' attribute and +// a flag indicating if the attribute has a value. +// +// List of attributes to use as the mail address. +func (o *LDAPAttributes) GetEmail() (value []string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.email + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of attributes to use as the display name. +func (o *LDAPAttributes) Name() []string { + if o != nil && o.bitmap_&4 != 0 { + return o.name + } + return nil +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// List of attributes to use as the display name. +func (o *LDAPAttributes) GetName() (value []string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.name + } + return +} + +// PreferredUsername returns the value of the 'preferred_username' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of attributes to use as the preferred user name when provisioning a user. +func (o *LDAPAttributes) PreferredUsername() []string { + if o != nil && o.bitmap_&8 != 0 { + return o.preferredUsername + } + return nil +} + +// GetPreferredUsername returns the value of the 'preferred_username' attribute and +// a flag indicating if the attribute has a value. +// +// List of attributes to use as the preferred user name when provisioning a user. +func (o *LDAPAttributes) GetPreferredUsername() (value []string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.preferredUsername + } + return +} + +// LDAPAttributesListKind is the name of the type used to represent list of objects of +// type 'LDAP_attributes'. +const LDAPAttributesListKind = "LDAPAttributesList" + +// LDAPAttributesListLinkKind is the name of the type used to represent links to list +// of objects of type 'LDAP_attributes'. +const LDAPAttributesListLinkKind = "LDAPAttributesListLink" + +// LDAPAttributesNilKind is the name of the type used to nil lists of objects of +// type 'LDAP_attributes'. +const LDAPAttributesListNilKind = "LDAPAttributesListNil" + +// LDAPAttributesList is a list of values of the 'LDAP_attributes' type. +type LDAPAttributesList struct { + href string + link bool + items []*LDAPAttributes +} + +// Len returns the length of the list. +func (l *LDAPAttributesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *LDAPAttributesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *LDAPAttributesList) Get(i int) *LDAPAttributes { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *LDAPAttributesList) Slice() []*LDAPAttributes { + var slice []*LDAPAttributes + if l == nil { + slice = make([]*LDAPAttributes, 0) + } else { + slice = make([]*LDAPAttributes, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *LDAPAttributesList) Each(f func(item *LDAPAttributes) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *LDAPAttributesList) Range(f func(index int, item *LDAPAttributes) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ldap_attributes_type_json.go b/clustersmgmt/v2alpha1/ldap_attributes_type_json.go new file mode 100644 index 00000000..e31b6357 --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_attributes_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLDAPAttributes writes a value of the 'LDAP_attributes' type to the given writer. +func MarshalLDAPAttributes(object *LDAPAttributes, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLDAPAttributes(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLDAPAttributes writes a value of the 'LDAP_attributes' type to the given stream. +func writeLDAPAttributes(object *LDAPAttributes, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.id != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + writeStringList(object.id, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.email != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("email") + writeStringList(object.email, stream) + count++ + } + present_ = object.bitmap_&4 != 0 && object.name != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + writeStringList(object.name, stream) + count++ + } + present_ = object.bitmap_&8 != 0 && object.preferredUsername != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("preferred_username") + writeStringList(object.preferredUsername, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalLDAPAttributes reads a value of the 'LDAP_attributes' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalLDAPAttributes(source interface{}) (object *LDAPAttributes, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readLDAPAttributes(iterator) + err = iterator.Error + return +} + +// readLDAPAttributes reads a value of the 'LDAP_attributes' type from the given iterator. +func readLDAPAttributes(iterator *jsoniter.Iterator) *LDAPAttributes { + object := &LDAPAttributes{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := readStringList(iterator) + object.id = value + object.bitmap_ |= 1 + case "email": + value := readStringList(iterator) + object.email = value + object.bitmap_ |= 2 + case "name": + value := readStringList(iterator) + object.name = value + object.bitmap_ |= 4 + case "preferred_username": + value := readStringList(iterator) + object.preferredUsername = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/ldap_identity_provider_builder.go b/clustersmgmt/v2alpha1/ldap_identity_provider_builder.go new file mode 100644 index 00000000..ffd5e943 --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_identity_provider_builder.go @@ -0,0 +1,128 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LDAPIdentityProviderBuilder contains the data and logic needed to build 'LDAP_identity_provider' objects. +// +// Details for `ldap` identity providers. +type LDAPIdentityProviderBuilder struct { + bitmap_ uint32 + ca string + url string + attributes *LDAPAttributesBuilder + bindDN string + bindPassword string + insecure bool +} + +// NewLDAPIdentityProvider creates a new builder of 'LDAP_identity_provider' objects. +func NewLDAPIdentityProvider() *LDAPIdentityProviderBuilder { + return &LDAPIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *LDAPIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CA sets the value of the 'CA' attribute to the given value. +func (b *LDAPIdentityProviderBuilder) CA(value string) *LDAPIdentityProviderBuilder { + b.ca = value + b.bitmap_ |= 1 + return b +} + +// URL sets the value of the 'URL' attribute to the given value. +func (b *LDAPIdentityProviderBuilder) URL(value string) *LDAPIdentityProviderBuilder { + b.url = value + b.bitmap_ |= 2 + return b +} + +// Attributes sets the value of the 'attributes' attribute to the given value. +// +// LDAP attributes used to configure the LDAP identity provider. +func (b *LDAPIdentityProviderBuilder) Attributes(value *LDAPAttributesBuilder) *LDAPIdentityProviderBuilder { + b.attributes = value + if value != nil { + b.bitmap_ |= 4 + } else { + b.bitmap_ &^= 4 + } + return b +} + +// BindDN sets the value of the 'bind_DN' attribute to the given value. +func (b *LDAPIdentityProviderBuilder) BindDN(value string) *LDAPIdentityProviderBuilder { + b.bindDN = value + b.bitmap_ |= 8 + return b +} + +// BindPassword sets the value of the 'bind_password' attribute to the given value. +func (b *LDAPIdentityProviderBuilder) BindPassword(value string) *LDAPIdentityProviderBuilder { + b.bindPassword = value + b.bitmap_ |= 16 + return b +} + +// Insecure sets the value of the 'insecure' attribute to the given value. +func (b *LDAPIdentityProviderBuilder) Insecure(value bool) *LDAPIdentityProviderBuilder { + b.insecure = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *LDAPIdentityProviderBuilder) Copy(object *LDAPIdentityProvider) *LDAPIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.ca = object.ca + b.url = object.url + if object.attributes != nil { + b.attributes = NewLDAPAttributes().Copy(object.attributes) + } else { + b.attributes = nil + } + b.bindDN = object.bindDN + b.bindPassword = object.bindPassword + b.insecure = object.insecure + return b +} + +// Build creates a 'LDAP_identity_provider' object using the configuration stored in the builder. +func (b *LDAPIdentityProviderBuilder) Build() (object *LDAPIdentityProvider, err error) { + object = new(LDAPIdentityProvider) + object.bitmap_ = b.bitmap_ + object.ca = b.ca + object.url = b.url + if b.attributes != nil { + object.attributes, err = b.attributes.Build() + if err != nil { + return + } + } + object.bindDN = b.bindDN + object.bindPassword = b.bindPassword + object.insecure = b.insecure + return +} diff --git a/clustersmgmt/v2alpha1/ldap_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/ldap_identity_provider_list_builder.go new file mode 100644 index 00000000..1f4c8fa4 --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LDAPIdentityProviderListBuilder contains the data and logic needed to build +// 'LDAP_identity_provider' objects. +type LDAPIdentityProviderListBuilder struct { + items []*LDAPIdentityProviderBuilder +} + +// NewLDAPIdentityProviderList creates a new builder of 'LDAP_identity_provider' objects. +func NewLDAPIdentityProviderList() *LDAPIdentityProviderListBuilder { + return new(LDAPIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *LDAPIdentityProviderListBuilder) Items(values ...*LDAPIdentityProviderBuilder) *LDAPIdentityProviderListBuilder { + b.items = make([]*LDAPIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *LDAPIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *LDAPIdentityProviderListBuilder) Copy(list *LDAPIdentityProviderList) *LDAPIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*LDAPIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewLDAPIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'LDAP_identity_provider' objects using the +// configuration stored in the builder. +func (b *LDAPIdentityProviderListBuilder) Build() (list *LDAPIdentityProviderList, err error) { + items := make([]*LDAPIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(LDAPIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/ldap_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/ldap_identity_provider_list_type_json.go new file mode 100644 index 00000000..5c164ffd --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLDAPIdentityProviderList writes a list of values of the 'LDAP_identity_provider' type to +// the given writer. +func MarshalLDAPIdentityProviderList(list []*LDAPIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLDAPIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLDAPIdentityProviderList writes a list of value of the 'LDAP_identity_provider' type to +// the given stream. +func writeLDAPIdentityProviderList(list []*LDAPIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeLDAPIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalLDAPIdentityProviderList reads a list of values of the 'LDAP_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLDAPIdentityProviderList(source interface{}) (items []*LDAPIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLDAPIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readLDAPIdentityProviderList reads list of values of the ”LDAP_identity_provider' type from +// the given iterator. +func readLDAPIdentityProviderList(iterator *jsoniter.Iterator) []*LDAPIdentityProvider { + list := []*LDAPIdentityProvider{} + for iterator.ReadArray() { + item := readLDAPIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/ldap_identity_provider_type.go b/clustersmgmt/v2alpha1/ldap_identity_provider_type.go new file mode 100644 index 00000000..68cb353e --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_identity_provider_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LDAPIdentityProvider represents the values of the 'LDAP_identity_provider' type. +// +// Details for `ldap` identity providers. +type LDAPIdentityProvider struct { + bitmap_ uint32 + ca string + url string + attributes *LDAPAttributes + bindDN string + bindPassword string + insecure bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *LDAPIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CA returns the value of the 'CA' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Certificate bundle to use to validate server certificates for the configured URL. +func (o *LDAPIdentityProvider) CA() string { + if o != nil && o.bitmap_&1 != 0 { + return o.ca + } + return "" +} + +// GetCA returns the value of the 'CA' attribute and +// a flag indicating if the attribute has a value. +// +// Certificate bundle to use to validate server certificates for the configured URL. +func (o *LDAPIdentityProvider) GetCA() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.ca + } + return +} + +// URL returns the value of the 'URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// An https://tools.ietf.org/html/rfc2255[RFC 2255] URL which specifies the LDAP host and +// search parameters to use. +func (o *LDAPIdentityProvider) URL() string { + if o != nil && o.bitmap_&2 != 0 { + return o.url + } + return "" +} + +// GetURL returns the value of the 'URL' attribute and +// a flag indicating if the attribute has a value. +// +// An https://tools.ietf.org/html/rfc2255[RFC 2255] URL which specifies the LDAP host and +// search parameters to use. +func (o *LDAPIdentityProvider) GetURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.url + } + return +} + +// Attributes returns the value of the 'attributes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// LDAP attributes used to configure the provider. +func (o *LDAPIdentityProvider) Attributes() *LDAPAttributes { + if o != nil && o.bitmap_&4 != 0 { + return o.attributes + } + return nil +} + +// GetAttributes returns the value of the 'attributes' attribute and +// a flag indicating if the attribute has a value. +// +// LDAP attributes used to configure the provider. +func (o *LDAPIdentityProvider) GetAttributes() (value *LDAPAttributes, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.attributes + } + return +} + +// BindDN returns the value of the 'bind_DN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional distinguished name to use to bind during the search phase. +func (o *LDAPIdentityProvider) BindDN() string { + if o != nil && o.bitmap_&8 != 0 { + return o.bindDN + } + return "" +} + +// GetBindDN returns the value of the 'bind_DN' attribute and +// a flag indicating if the attribute has a value. +// +// Optional distinguished name to use to bind during the search phase. +func (o *LDAPIdentityProvider) GetBindDN() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.bindDN + } + return +} + +// BindPassword returns the value of the 'bind_password' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional password to use to bind during the search phase. +func (o *LDAPIdentityProvider) BindPassword() string { + if o != nil && o.bitmap_&16 != 0 { + return o.bindPassword + } + return "" +} + +// GetBindPassword returns the value of the 'bind_password' attribute and +// a flag indicating if the attribute has a value. +// +// Optional password to use to bind during the search phase. +func (o *LDAPIdentityProvider) GetBindPassword() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.bindPassword + } + return +} + +// Insecure returns the value of the 'insecure' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// When `true` no TLS connection is made to the server. When `false` `ldaps://...` URLs +// connect using TLS and `ldap://...` are upgraded to TLS. +func (o *LDAPIdentityProvider) Insecure() bool { + if o != nil && o.bitmap_&32 != 0 { + return o.insecure + } + return false +} + +// GetInsecure returns the value of the 'insecure' attribute and +// a flag indicating if the attribute has a value. +// +// When `true` no TLS connection is made to the server. When `false` `ldaps://...` URLs +// connect using TLS and `ldap://...` are upgraded to TLS. +func (o *LDAPIdentityProvider) GetInsecure() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.insecure + } + return +} + +// LDAPIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'LDAP_identity_provider'. +const LDAPIdentityProviderListKind = "LDAPIdentityProviderList" + +// LDAPIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'LDAP_identity_provider'. +const LDAPIdentityProviderListLinkKind = "LDAPIdentityProviderListLink" + +// LDAPIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'LDAP_identity_provider'. +const LDAPIdentityProviderListNilKind = "LDAPIdentityProviderListNil" + +// LDAPIdentityProviderList is a list of values of the 'LDAP_identity_provider' type. +type LDAPIdentityProviderList struct { + href string + link bool + items []*LDAPIdentityProvider +} + +// Len returns the length of the list. +func (l *LDAPIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *LDAPIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *LDAPIdentityProviderList) Get(i int) *LDAPIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *LDAPIdentityProviderList) Slice() []*LDAPIdentityProvider { + var slice []*LDAPIdentityProvider + if l == nil { + slice = make([]*LDAPIdentityProvider, 0) + } else { + slice = make([]*LDAPIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *LDAPIdentityProviderList) Each(f func(item *LDAPIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *LDAPIdentityProviderList) Range(f func(index int, item *LDAPIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/ldap_identity_provider_type_json.go b/clustersmgmt/v2alpha1/ldap_identity_provider_type_json.go new file mode 100644 index 00000000..99059bbe --- /dev/null +++ b/clustersmgmt/v2alpha1/ldap_identity_provider_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLDAPIdentityProvider writes a value of the 'LDAP_identity_provider' type to the given writer. +func MarshalLDAPIdentityProvider(object *LDAPIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLDAPIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLDAPIdentityProvider writes a value of the 'LDAP_identity_provider' type to the given stream. +func writeLDAPIdentityProvider(object *LDAPIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ca") + stream.WriteString(object.ca) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("url") + stream.WriteString(object.url) + count++ + } + present_ = object.bitmap_&4 != 0 && object.attributes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("attributes") + writeLDAPAttributes(object.attributes, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("bind_dn") + stream.WriteString(object.bindDN) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("bind_password") + stream.WriteString(object.bindPassword) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("insecure") + stream.WriteBool(object.insecure) + } + stream.WriteObjectEnd() +} + +// UnmarshalLDAPIdentityProvider reads a value of the 'LDAP_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalLDAPIdentityProvider(source interface{}) (object *LDAPIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readLDAPIdentityProvider(iterator) + err = iterator.Error + return +} + +// readLDAPIdentityProvider reads a value of the 'LDAP_identity_provider' type from the given iterator. +func readLDAPIdentityProvider(iterator *jsoniter.Iterator) *LDAPIdentityProvider { + object := &LDAPIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "ca": + value := iterator.ReadString() + object.ca = value + object.bitmap_ |= 1 + case "url": + value := iterator.ReadString() + object.url = value + object.bitmap_ |= 2 + case "attributes": + value := readLDAPAttributes(iterator) + object.attributes = value + object.bitmap_ |= 4 + case "bind_dn": + value := iterator.ReadString() + object.bindDN = value + object.bitmap_ |= 8 + case "bind_password": + value := iterator.ReadString() + object.bindPassword = value + object.bitmap_ |= 16 + case "insecure": + value := iterator.ReadBool() + object.insecure = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_builder.go b/clustersmgmt/v2alpha1/limited_support_reason_builder.go new file mode 100644 index 00000000..91465cea --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_builder.go @@ -0,0 +1,148 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// LimitedSupportReasonBuilder contains the data and logic needed to build 'limited_support_reason' objects. +// +// A reason that a cluster is in limited support. +type LimitedSupportReasonBuilder struct { + bitmap_ uint32 + id string + href string + creationTimestamp time.Time + details string + detectionType DetectionType + summary string + template *LimitedSupportReasonTemplateBuilder +} + +// NewLimitedSupportReason creates a new builder of 'limited_support_reason' objects. +func NewLimitedSupportReason() *LimitedSupportReasonBuilder { + return &LimitedSupportReasonBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *LimitedSupportReasonBuilder) Link(value bool) *LimitedSupportReasonBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *LimitedSupportReasonBuilder) ID(value string) *LimitedSupportReasonBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *LimitedSupportReasonBuilder) HREF(value string) *LimitedSupportReasonBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *LimitedSupportReasonBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *LimitedSupportReasonBuilder) CreationTimestamp(value time.Time) *LimitedSupportReasonBuilder { + b.creationTimestamp = value + b.bitmap_ |= 8 + return b +} + +// Details sets the value of the 'details' attribute to the given value. +func (b *LimitedSupportReasonBuilder) Details(value string) *LimitedSupportReasonBuilder { + b.details = value + b.bitmap_ |= 16 + return b +} + +// DetectionType sets the value of the 'detection_type' attribute to the given value. +func (b *LimitedSupportReasonBuilder) DetectionType(value DetectionType) *LimitedSupportReasonBuilder { + b.detectionType = value + b.bitmap_ |= 32 + return b +} + +// Summary sets the value of the 'summary' attribute to the given value. +func (b *LimitedSupportReasonBuilder) Summary(value string) *LimitedSupportReasonBuilder { + b.summary = value + b.bitmap_ |= 64 + return b +} + +// Template sets the value of the 'template' attribute to the given value. +// +// A template for cluster limited support reason. +func (b *LimitedSupportReasonBuilder) Template(value *LimitedSupportReasonTemplateBuilder) *LimitedSupportReasonBuilder { + b.template = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *LimitedSupportReasonBuilder) Copy(object *LimitedSupportReason) *LimitedSupportReasonBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.creationTimestamp = object.creationTimestamp + b.details = object.details + b.detectionType = object.detectionType + b.summary = object.summary + if object.template != nil { + b.template = NewLimitedSupportReasonTemplate().Copy(object.template) + } else { + b.template = nil + } + return b +} + +// Build creates a 'limited_support_reason' object using the configuration stored in the builder. +func (b *LimitedSupportReasonBuilder) Build() (object *LimitedSupportReason, err error) { + object = new(LimitedSupportReason) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.creationTimestamp = b.creationTimestamp + object.details = b.details + object.detectionType = b.detectionType + object.summary = b.summary + if b.template != nil { + object.template, err = b.template.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_client.go b/clustersmgmt/v2alpha1/limited_support_reason_client.go new file mode 100644 index 00000000..0176e17c --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LimitedSupportReasonClient is the client of the 'limited_support_reason' resource. +// +// Manages a specific reason. +type LimitedSupportReasonClient struct { + transport http.RoundTripper + path string +} + +// NewLimitedSupportReasonClient creates a new client for the 'limited_support_reason' +// resource using the given transport to send the requests and receive the +// responses. +func NewLimitedSupportReasonClient(transport http.RoundTripper, path string) *LimitedSupportReasonClient { + return &LimitedSupportReasonClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the reason. +func (c *LimitedSupportReasonClient) Delete() *LimitedSupportReasonDeleteRequest { + return &LimitedSupportReasonDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the reason. +func (c *LimitedSupportReasonClient) Get() *LimitedSupportReasonGetRequest { + return &LimitedSupportReasonGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// LimitedSupportReasonPollRequest is the request for the Poll method. +type LimitedSupportReasonPollRequest struct { + request *LimitedSupportReasonGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *LimitedSupportReasonPollRequest) Parameter(name string, value interface{}) *LimitedSupportReasonPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *LimitedSupportReasonPollRequest) Header(name string, value interface{}) *LimitedSupportReasonPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *LimitedSupportReasonPollRequest) Interval(value time.Duration) *LimitedSupportReasonPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *LimitedSupportReasonPollRequest) Status(value int) *LimitedSupportReasonPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *LimitedSupportReasonPollRequest) Predicate(value func(*LimitedSupportReasonGetResponse) bool) *LimitedSupportReasonPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*LimitedSupportReasonGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *LimitedSupportReasonPollRequest) StartContext(ctx context.Context) (response *LimitedSupportReasonPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &LimitedSupportReasonPollResponse{ + response: result.(*LimitedSupportReasonGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *LimitedSupportReasonPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// LimitedSupportReasonPollResponse is the response for the Poll method. +type LimitedSupportReasonPollResponse struct { + response *LimitedSupportReasonGetResponse +} + +// Status returns the response status code. +func (r *LimitedSupportReasonPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *LimitedSupportReasonPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *LimitedSupportReasonPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *LimitedSupportReasonPollResponse) Body() *LimitedSupportReason { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LimitedSupportReasonPollResponse) GetBody() (value *LimitedSupportReason, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *LimitedSupportReasonClient) Poll() *LimitedSupportReasonPollRequest { + return &LimitedSupportReasonPollRequest{ + request: c.Get(), + } +} + +// LimitedSupportReasonDeleteRequest is the request for the 'delete' method. +type LimitedSupportReasonDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *LimitedSupportReasonDeleteRequest) Parameter(name string, value interface{}) *LimitedSupportReasonDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LimitedSupportReasonDeleteRequest) Header(name string, value interface{}) *LimitedSupportReasonDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LimitedSupportReasonDeleteRequest) Impersonate(user string) *LimitedSupportReasonDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LimitedSupportReasonDeleteRequest) Send() (result *LimitedSupportReasonDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LimitedSupportReasonDeleteRequest) SendContext(ctx context.Context) (result *LimitedSupportReasonDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LimitedSupportReasonDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// LimitedSupportReasonDeleteResponse is the response for the 'delete' method. +type LimitedSupportReasonDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *LimitedSupportReasonDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LimitedSupportReasonDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LimitedSupportReasonDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// LimitedSupportReasonGetRequest is the request for the 'get' method. +type LimitedSupportReasonGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *LimitedSupportReasonGetRequest) Parameter(name string, value interface{}) *LimitedSupportReasonGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LimitedSupportReasonGetRequest) Header(name string, value interface{}) *LimitedSupportReasonGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LimitedSupportReasonGetRequest) Impersonate(user string) *LimitedSupportReasonGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LimitedSupportReasonGetRequest) Send() (result *LimitedSupportReasonGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LimitedSupportReasonGetRequest) SendContext(ctx context.Context) (result *LimitedSupportReasonGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LimitedSupportReasonGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLimitedSupportReasonGetResponse(result, reader) + if err != nil { + return + } + return +} + +// LimitedSupportReasonGetResponse is the response for the 'get' method. +type LimitedSupportReasonGetResponse struct { + status int + header http.Header + err *errors.Error + body *LimitedSupportReason +} + +// Status returns the response status code. +func (r *LimitedSupportReasonGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LimitedSupportReasonGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LimitedSupportReasonGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *LimitedSupportReasonGetResponse) Body() *LimitedSupportReason { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LimitedSupportReasonGetResponse) GetBody() (value *LimitedSupportReason, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_list_builder.go b/clustersmgmt/v2alpha1/limited_support_reason_list_builder.go new file mode 100644 index 00000000..c68c737d --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LimitedSupportReasonListBuilder contains the data and logic needed to build +// 'limited_support_reason' objects. +type LimitedSupportReasonListBuilder struct { + items []*LimitedSupportReasonBuilder +} + +// NewLimitedSupportReasonList creates a new builder of 'limited_support_reason' objects. +func NewLimitedSupportReasonList() *LimitedSupportReasonListBuilder { + return new(LimitedSupportReasonListBuilder) +} + +// Items sets the items of the list. +func (b *LimitedSupportReasonListBuilder) Items(values ...*LimitedSupportReasonBuilder) *LimitedSupportReasonListBuilder { + b.items = make([]*LimitedSupportReasonBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *LimitedSupportReasonListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *LimitedSupportReasonListBuilder) Copy(list *LimitedSupportReasonList) *LimitedSupportReasonListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*LimitedSupportReasonBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewLimitedSupportReason().Copy(v) + } + } + return b +} + +// Build creates a list of 'limited_support_reason' objects using the +// configuration stored in the builder. +func (b *LimitedSupportReasonListBuilder) Build() (list *LimitedSupportReasonList, err error) { + items := make([]*LimitedSupportReason, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(LimitedSupportReasonList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_list_type_json.go b/clustersmgmt/v2alpha1/limited_support_reason_list_type_json.go new file mode 100644 index 00000000..2ea6a362 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLimitedSupportReasonList writes a list of values of the 'limited_support_reason' type to +// the given writer. +func MarshalLimitedSupportReasonList(list []*LimitedSupportReason, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLimitedSupportReasonList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLimitedSupportReasonList writes a list of value of the 'limited_support_reason' type to +// the given stream. +func writeLimitedSupportReasonList(list []*LimitedSupportReason, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeLimitedSupportReason(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalLimitedSupportReasonList reads a list of values of the 'limited_support_reason' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLimitedSupportReasonList(source interface{}) (items []*LimitedSupportReason, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLimitedSupportReasonList(iterator) + err = iterator.Error + return +} + +// readLimitedSupportReasonList reads list of values of the ”limited_support_reason' type from +// the given iterator. +func readLimitedSupportReasonList(iterator *jsoniter.Iterator) []*LimitedSupportReason { + list := []*LimitedSupportReason{} + for iterator.ReadArray() { + item := readLimitedSupportReason(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_resource_json.go b/clustersmgmt/v2alpha1/limited_support_reason_resource_json.go new file mode 100644 index 00000000..5e615790 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeLimitedSupportReasonDeleteRequest(request *LimitedSupportReasonDeleteRequest, writer io.Writer) error { + return nil +} +func readLimitedSupportReasonDeleteResponse(response *LimitedSupportReasonDeleteResponse, reader io.Reader) error { + return nil +} +func writeLimitedSupportReasonGetRequest(request *LimitedSupportReasonGetRequest, writer io.Writer) error { + return nil +} +func readLimitedSupportReasonGetResponse(response *LimitedSupportReasonGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLimitedSupportReason(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_builder.go b/clustersmgmt/v2alpha1/limited_support_reason_template_builder.go new file mode 100644 index 00000000..e6d962b6 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LimitedSupportReasonTemplateBuilder contains the data and logic needed to build 'limited_support_reason_template' objects. +// +// A template for cluster limited support reason. +type LimitedSupportReasonTemplateBuilder struct { + bitmap_ uint32 + id string + href string + details string + summary string +} + +// NewLimitedSupportReasonTemplate creates a new builder of 'limited_support_reason_template' objects. +func NewLimitedSupportReasonTemplate() *LimitedSupportReasonTemplateBuilder { + return &LimitedSupportReasonTemplateBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *LimitedSupportReasonTemplateBuilder) Link(value bool) *LimitedSupportReasonTemplateBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *LimitedSupportReasonTemplateBuilder) ID(value string) *LimitedSupportReasonTemplateBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *LimitedSupportReasonTemplateBuilder) HREF(value string) *LimitedSupportReasonTemplateBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *LimitedSupportReasonTemplateBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Details sets the value of the 'details' attribute to the given value. +func (b *LimitedSupportReasonTemplateBuilder) Details(value string) *LimitedSupportReasonTemplateBuilder { + b.details = value + b.bitmap_ |= 8 + return b +} + +// Summary sets the value of the 'summary' attribute to the given value. +func (b *LimitedSupportReasonTemplateBuilder) Summary(value string) *LimitedSupportReasonTemplateBuilder { + b.summary = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *LimitedSupportReasonTemplateBuilder) Copy(object *LimitedSupportReasonTemplate) *LimitedSupportReasonTemplateBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.details = object.details + b.summary = object.summary + return b +} + +// Build creates a 'limited_support_reason_template' object using the configuration stored in the builder. +func (b *LimitedSupportReasonTemplateBuilder) Build() (object *LimitedSupportReasonTemplate, err error) { + object = new(LimitedSupportReasonTemplate) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.details = b.details + object.summary = b.summary + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_client.go b/clustersmgmt/v2alpha1/limited_support_reason_template_client.go new file mode 100644 index 00000000..73d17f20 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LimitedSupportReasonTemplateClient is the client of the 'limited_support_reason_template' resource. +// +// Manages a specific limited support reason template. +type LimitedSupportReasonTemplateClient struct { + transport http.RoundTripper + path string +} + +// NewLimitedSupportReasonTemplateClient creates a new client for the 'limited_support_reason_template' +// resource using the given transport to send the requests and receive the +// responses. +func NewLimitedSupportReasonTemplateClient(transport http.RoundTripper, path string) *LimitedSupportReasonTemplateClient { + return &LimitedSupportReasonTemplateClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the template. +func (c *LimitedSupportReasonTemplateClient) Get() *LimitedSupportReasonTemplateGetRequest { + return &LimitedSupportReasonTemplateGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// LimitedSupportReasonTemplatePollRequest is the request for the Poll method. +type LimitedSupportReasonTemplatePollRequest struct { + request *LimitedSupportReasonTemplateGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *LimitedSupportReasonTemplatePollRequest) Parameter(name string, value interface{}) *LimitedSupportReasonTemplatePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *LimitedSupportReasonTemplatePollRequest) Header(name string, value interface{}) *LimitedSupportReasonTemplatePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *LimitedSupportReasonTemplatePollRequest) Interval(value time.Duration) *LimitedSupportReasonTemplatePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *LimitedSupportReasonTemplatePollRequest) Status(value int) *LimitedSupportReasonTemplatePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *LimitedSupportReasonTemplatePollRequest) Predicate(value func(*LimitedSupportReasonTemplateGetResponse) bool) *LimitedSupportReasonTemplatePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*LimitedSupportReasonTemplateGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *LimitedSupportReasonTemplatePollRequest) StartContext(ctx context.Context) (response *LimitedSupportReasonTemplatePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &LimitedSupportReasonTemplatePollResponse{ + response: result.(*LimitedSupportReasonTemplateGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *LimitedSupportReasonTemplatePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// LimitedSupportReasonTemplatePollResponse is the response for the Poll method. +type LimitedSupportReasonTemplatePollResponse struct { + response *LimitedSupportReasonTemplateGetResponse +} + +// Status returns the response status code. +func (r *LimitedSupportReasonTemplatePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *LimitedSupportReasonTemplatePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *LimitedSupportReasonTemplatePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *LimitedSupportReasonTemplatePollResponse) Body() *LimitedSupportReasonTemplate { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LimitedSupportReasonTemplatePollResponse) GetBody() (value *LimitedSupportReasonTemplate, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *LimitedSupportReasonTemplateClient) Poll() *LimitedSupportReasonTemplatePollRequest { + return &LimitedSupportReasonTemplatePollRequest{ + request: c.Get(), + } +} + +// LimitedSupportReasonTemplateGetRequest is the request for the 'get' method. +type LimitedSupportReasonTemplateGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *LimitedSupportReasonTemplateGetRequest) Parameter(name string, value interface{}) *LimitedSupportReasonTemplateGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LimitedSupportReasonTemplateGetRequest) Header(name string, value interface{}) *LimitedSupportReasonTemplateGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LimitedSupportReasonTemplateGetRequest) Impersonate(user string) *LimitedSupportReasonTemplateGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LimitedSupportReasonTemplateGetRequest) Send() (result *LimitedSupportReasonTemplateGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LimitedSupportReasonTemplateGetRequest) SendContext(ctx context.Context) (result *LimitedSupportReasonTemplateGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LimitedSupportReasonTemplateGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLimitedSupportReasonTemplateGetResponse(result, reader) + if err != nil { + return + } + return +} + +// LimitedSupportReasonTemplateGetResponse is the response for the 'get' method. +type LimitedSupportReasonTemplateGetResponse struct { + status int + header http.Header + err *errors.Error + body *LimitedSupportReasonTemplate +} + +// Status returns the response status code. +func (r *LimitedSupportReasonTemplateGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LimitedSupportReasonTemplateGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LimitedSupportReasonTemplateGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *LimitedSupportReasonTemplateGetResponse) Body() *LimitedSupportReasonTemplate { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *LimitedSupportReasonTemplateGetResponse) GetBody() (value *LimitedSupportReasonTemplate, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_list_builder.go b/clustersmgmt/v2alpha1/limited_support_reason_template_list_builder.go new file mode 100644 index 00000000..77ea1535 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LimitedSupportReasonTemplateListBuilder contains the data and logic needed to build +// 'limited_support_reason_template' objects. +type LimitedSupportReasonTemplateListBuilder struct { + items []*LimitedSupportReasonTemplateBuilder +} + +// NewLimitedSupportReasonTemplateList creates a new builder of 'limited_support_reason_template' objects. +func NewLimitedSupportReasonTemplateList() *LimitedSupportReasonTemplateListBuilder { + return new(LimitedSupportReasonTemplateListBuilder) +} + +// Items sets the items of the list. +func (b *LimitedSupportReasonTemplateListBuilder) Items(values ...*LimitedSupportReasonTemplateBuilder) *LimitedSupportReasonTemplateListBuilder { + b.items = make([]*LimitedSupportReasonTemplateBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *LimitedSupportReasonTemplateListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *LimitedSupportReasonTemplateListBuilder) Copy(list *LimitedSupportReasonTemplateList) *LimitedSupportReasonTemplateListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*LimitedSupportReasonTemplateBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewLimitedSupportReasonTemplate().Copy(v) + } + } + return b +} + +// Build creates a list of 'limited_support_reason_template' objects using the +// configuration stored in the builder. +func (b *LimitedSupportReasonTemplateListBuilder) Build() (list *LimitedSupportReasonTemplateList, err error) { + items := make([]*LimitedSupportReasonTemplate, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(LimitedSupportReasonTemplateList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_list_type_json.go b/clustersmgmt/v2alpha1/limited_support_reason_template_list_type_json.go new file mode 100644 index 00000000..08a28be1 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLimitedSupportReasonTemplateList writes a list of values of the 'limited_support_reason_template' type to +// the given writer. +func MarshalLimitedSupportReasonTemplateList(list []*LimitedSupportReasonTemplate, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLimitedSupportReasonTemplateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLimitedSupportReasonTemplateList writes a list of value of the 'limited_support_reason_template' type to +// the given stream. +func writeLimitedSupportReasonTemplateList(list []*LimitedSupportReasonTemplate, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeLimitedSupportReasonTemplate(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalLimitedSupportReasonTemplateList reads a list of values of the 'limited_support_reason_template' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLimitedSupportReasonTemplateList(source interface{}) (items []*LimitedSupportReasonTemplate, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLimitedSupportReasonTemplateList(iterator) + err = iterator.Error + return +} + +// readLimitedSupportReasonTemplateList reads list of values of the ”limited_support_reason_template' type from +// the given iterator. +func readLimitedSupportReasonTemplateList(iterator *jsoniter.Iterator) []*LimitedSupportReasonTemplate { + list := []*LimitedSupportReasonTemplate{} + for iterator.ReadArray() { + item := readLimitedSupportReasonTemplate(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_resource_json.go b/clustersmgmt/v2alpha1/limited_support_reason_template_resource_json.go new file mode 100644 index 00000000..90bba87f --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeLimitedSupportReasonTemplateGetRequest(request *LimitedSupportReasonTemplateGetRequest, writer io.Writer) error { + return nil +} +func readLimitedSupportReasonTemplateGetResponse(response *LimitedSupportReasonTemplateGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLimitedSupportReasonTemplate(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_type.go b/clustersmgmt/v2alpha1/limited_support_reason_template_type.go new file mode 100644 index 00000000..68f54576 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LimitedSupportReasonTemplateKind is the name of the type used to represent objects +// of type 'limited_support_reason_template'. +const LimitedSupportReasonTemplateKind = "LimitedSupportReasonTemplate" + +// LimitedSupportReasonTemplateLinkKind is the name of the type used to represent links +// to objects of type 'limited_support_reason_template'. +const LimitedSupportReasonTemplateLinkKind = "LimitedSupportReasonTemplateLink" + +// LimitedSupportReasonTemplateNilKind is the name of the type used to nil references +// to objects of type 'limited_support_reason_template'. +const LimitedSupportReasonTemplateNilKind = "LimitedSupportReasonTemplateNil" + +// LimitedSupportReasonTemplate represents the values of the 'limited_support_reason_template' type. +// +// A template for cluster limited support reason. +type LimitedSupportReasonTemplate struct { + bitmap_ uint32 + id string + href string + details string + summary string +} + +// Kind returns the name of the type of the object. +func (o *LimitedSupportReasonTemplate) Kind() string { + if o == nil { + return LimitedSupportReasonTemplateNilKind + } + if o.bitmap_&1 != 0 { + return LimitedSupportReasonTemplateLinkKind + } + return LimitedSupportReasonTemplateKind +} + +// Link returns true iif this is a link. +func (o *LimitedSupportReasonTemplate) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *LimitedSupportReasonTemplate) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *LimitedSupportReasonTemplate) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *LimitedSupportReasonTemplate) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *LimitedSupportReasonTemplate) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *LimitedSupportReasonTemplate) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Details returns the value of the 'details' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// A detailed description of the reason. +func (o *LimitedSupportReasonTemplate) Details() string { + if o != nil && o.bitmap_&8 != 0 { + return o.details + } + return "" +} + +// GetDetails returns the value of the 'details' attribute and +// a flag indicating if the attribute has a value. +// +// A detailed description of the reason. +func (o *LimitedSupportReasonTemplate) GetDetails() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.details + } + return +} + +// Summary returns the value of the 'summary' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Summary of the reason. +func (o *LimitedSupportReasonTemplate) Summary() string { + if o != nil && o.bitmap_&16 != 0 { + return o.summary + } + return "" +} + +// GetSummary returns the value of the 'summary' attribute and +// a flag indicating if the attribute has a value. +// +// Summary of the reason. +func (o *LimitedSupportReasonTemplate) GetSummary() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.summary + } + return +} + +// LimitedSupportReasonTemplateListKind is the name of the type used to represent list of objects of +// type 'limited_support_reason_template'. +const LimitedSupportReasonTemplateListKind = "LimitedSupportReasonTemplateList" + +// LimitedSupportReasonTemplateListLinkKind is the name of the type used to represent links to list +// of objects of type 'limited_support_reason_template'. +const LimitedSupportReasonTemplateListLinkKind = "LimitedSupportReasonTemplateListLink" + +// LimitedSupportReasonTemplateNilKind is the name of the type used to nil lists of objects of +// type 'limited_support_reason_template'. +const LimitedSupportReasonTemplateListNilKind = "LimitedSupportReasonTemplateListNil" + +// LimitedSupportReasonTemplateList is a list of values of the 'limited_support_reason_template' type. +type LimitedSupportReasonTemplateList struct { + href string + link bool + items []*LimitedSupportReasonTemplate +} + +// Kind returns the name of the type of the object. +func (l *LimitedSupportReasonTemplateList) Kind() string { + if l == nil { + return LimitedSupportReasonTemplateListNilKind + } + if l.link { + return LimitedSupportReasonTemplateListLinkKind + } + return LimitedSupportReasonTemplateListKind +} + +// Link returns true iif this is a link. +func (l *LimitedSupportReasonTemplateList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *LimitedSupportReasonTemplateList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *LimitedSupportReasonTemplateList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *LimitedSupportReasonTemplateList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *LimitedSupportReasonTemplateList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *LimitedSupportReasonTemplateList) Get(i int) *LimitedSupportReasonTemplate { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *LimitedSupportReasonTemplateList) Slice() []*LimitedSupportReasonTemplate { + var slice []*LimitedSupportReasonTemplate + if l == nil { + slice = make([]*LimitedSupportReasonTemplate, 0) + } else { + slice = make([]*LimitedSupportReasonTemplate, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *LimitedSupportReasonTemplateList) Each(f func(item *LimitedSupportReasonTemplate) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *LimitedSupportReasonTemplateList) Range(f func(index int, item *LimitedSupportReasonTemplate) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_template_type_json.go b/clustersmgmt/v2alpha1/limited_support_reason_template_type_json.go new file mode 100644 index 00000000..42862011 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_template_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLimitedSupportReasonTemplate writes a value of the 'limited_support_reason_template' type to the given writer. +func MarshalLimitedSupportReasonTemplate(object *LimitedSupportReasonTemplate, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLimitedSupportReasonTemplate(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLimitedSupportReasonTemplate writes a value of the 'limited_support_reason_template' type to the given stream. +func writeLimitedSupportReasonTemplate(object *LimitedSupportReasonTemplate, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(LimitedSupportReasonTemplateLinkKind) + } else { + stream.WriteString(LimitedSupportReasonTemplateKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("details") + stream.WriteString(object.details) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("summary") + stream.WriteString(object.summary) + } + stream.WriteObjectEnd() +} + +// UnmarshalLimitedSupportReasonTemplate reads a value of the 'limited_support_reason_template' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalLimitedSupportReasonTemplate(source interface{}) (object *LimitedSupportReasonTemplate, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readLimitedSupportReasonTemplate(iterator) + err = iterator.Error + return +} + +// readLimitedSupportReasonTemplate reads a value of the 'limited_support_reason_template' type from the given iterator. +func readLimitedSupportReasonTemplate(iterator *jsoniter.Iterator) *LimitedSupportReasonTemplate { + object := &LimitedSupportReasonTemplate{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == LimitedSupportReasonTemplateLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "details": + value := iterator.ReadString() + object.details = value + object.bitmap_ |= 8 + case "summary": + value := iterator.ReadString() + object.summary = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_templates_client.go b/clustersmgmt/v2alpha1/limited_support_reason_templates_client.go new file mode 100644 index 00000000..118fa2b2 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_templates_client.go @@ -0,0 +1,297 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LimitedSupportReasonTemplatesClient is the client of the 'limited_support_reason_templates' resource. +// +// Manages the collection of limited support reason templates. +type LimitedSupportReasonTemplatesClient struct { + transport http.RoundTripper + path string +} + +// NewLimitedSupportReasonTemplatesClient creates a new client for the 'limited_support_reason_templates' +// resource using the given transport to send the requests and receive the +// responses. +func NewLimitedSupportReasonTemplatesClient(transport http.RoundTripper, path string) *LimitedSupportReasonTemplatesClient { + return &LimitedSupportReasonTemplatesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of templates. +func (c *LimitedSupportReasonTemplatesClient) List() *LimitedSupportReasonTemplatesListRequest { + return &LimitedSupportReasonTemplatesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// LimitedSupportReasonTemplate returns the target 'limited_support_reason_template' resource for the given identifier. +// +// Reference to the service that manages an specific template. +func (c *LimitedSupportReasonTemplatesClient) LimitedSupportReasonTemplate(id string) *LimitedSupportReasonTemplateClient { + return NewLimitedSupportReasonTemplateClient( + c.transport, + path.Join(c.path, id), + ) +} + +// LimitedSupportReasonTemplatesListRequest is the request for the 'list' method. +type LimitedSupportReasonTemplatesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *LimitedSupportReasonTemplatesListRequest) Parameter(name string, value interface{}) *LimitedSupportReasonTemplatesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LimitedSupportReasonTemplatesListRequest) Header(name string, value interface{}) *LimitedSupportReasonTemplatesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LimitedSupportReasonTemplatesListRequest) Impersonate(user string) *LimitedSupportReasonTemplatesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LimitedSupportReasonTemplatesListRequest) Page(value int) *LimitedSupportReasonTemplatesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LimitedSupportReasonTemplatesListRequest) Size(value int) *LimitedSupportReasonTemplatesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LimitedSupportReasonTemplatesListRequest) Send() (result *LimitedSupportReasonTemplatesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LimitedSupportReasonTemplatesListRequest) SendContext(ctx context.Context) (result *LimitedSupportReasonTemplatesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LimitedSupportReasonTemplatesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLimitedSupportReasonTemplatesListResponse(result, reader) + if err != nil { + return + } + return +} + +// LimitedSupportReasonTemplatesListResponse is the response for the 'list' method. +type LimitedSupportReasonTemplatesListResponse struct { + status int + header http.Header + err *errors.Error + items *LimitedSupportReasonTemplateList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *LimitedSupportReasonTemplatesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LimitedSupportReasonTemplatesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LimitedSupportReasonTemplatesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of template. +func (r *LimitedSupportReasonTemplatesListResponse) Items() *LimitedSupportReasonTemplateList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of template. +func (r *LimitedSupportReasonTemplatesListResponse) GetItems() (value *LimitedSupportReasonTemplateList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LimitedSupportReasonTemplatesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LimitedSupportReasonTemplatesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LimitedSupportReasonTemplatesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *LimitedSupportReasonTemplatesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *LimitedSupportReasonTemplatesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *LimitedSupportReasonTemplatesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_templates_resource_json.go b/clustersmgmt/v2alpha1/limited_support_reason_templates_resource_json.go new file mode 100644 index 00000000..fba21cd7 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_templates_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeLimitedSupportReasonTemplatesListRequest(request *LimitedSupportReasonTemplatesListRequest, writer io.Writer) error { + return nil +} +func readLimitedSupportReasonTemplatesListResponse(response *LimitedSupportReasonTemplatesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readLimitedSupportReasonTemplateList(iterator) + response.items = &LimitedSupportReasonTemplateList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_type.go b/clustersmgmt/v2alpha1/limited_support_reason_type.go new file mode 100644 index 00000000..bfa0df48 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_type.go @@ -0,0 +1,344 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// LimitedSupportReasonKind is the name of the type used to represent objects +// of type 'limited_support_reason'. +const LimitedSupportReasonKind = "LimitedSupportReason" + +// LimitedSupportReasonLinkKind is the name of the type used to represent links +// to objects of type 'limited_support_reason'. +const LimitedSupportReasonLinkKind = "LimitedSupportReasonLink" + +// LimitedSupportReasonNilKind is the name of the type used to nil references +// to objects of type 'limited_support_reason'. +const LimitedSupportReasonNilKind = "LimitedSupportReasonNil" + +// LimitedSupportReason represents the values of the 'limited_support_reason' type. +// +// A reason that a cluster is in limited support. +type LimitedSupportReason struct { + bitmap_ uint32 + id string + href string + creationTimestamp time.Time + details string + detectionType DetectionType + summary string + template *LimitedSupportReasonTemplate +} + +// Kind returns the name of the type of the object. +func (o *LimitedSupportReason) Kind() string { + if o == nil { + return LimitedSupportReasonNilKind + } + if o.bitmap_&1 != 0 { + return LimitedSupportReasonLinkKind + } + return LimitedSupportReasonKind +} + +// Link returns true iif this is a link. +func (o *LimitedSupportReason) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *LimitedSupportReason) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *LimitedSupportReason) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *LimitedSupportReason) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *LimitedSupportReason) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *LimitedSupportReason) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The time the reason was detected. +func (o *LimitedSupportReason) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&8 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// The time the reason was detected. +func (o *LimitedSupportReason) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// Details returns the value of the 'details' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// URL with a link to a detailed description of the reason. +func (o *LimitedSupportReason) Details() string { + if o != nil && o.bitmap_&16 != 0 { + return o.details + } + return "" +} + +// GetDetails returns the value of the 'details' attribute and +// a flag indicating if the attribute has a value. +// +// URL with a link to a detailed description of the reason. +func (o *LimitedSupportReason) GetDetails() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.details + } + return +} + +// DetectionType returns the value of the 'detection_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if the reason was detected automatically or manually. +// When creating a new reason this field should be empty or "manual". +func (o *LimitedSupportReason) DetectionType() DetectionType { + if o != nil && o.bitmap_&32 != 0 { + return o.detectionType + } + return DetectionType("") +} + +// GetDetectionType returns the value of the 'detection_type' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if the reason was detected automatically or manually. +// When creating a new reason this field should be empty or "manual". +func (o *LimitedSupportReason) GetDetectionType() (value DetectionType, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.detectionType + } + return +} + +// Summary returns the value of the 'summary' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Summary of the reason. +func (o *LimitedSupportReason) Summary() string { + if o != nil && o.bitmap_&64 != 0 { + return o.summary + } + return "" +} + +// GetSummary returns the value of the 'summary' attribute and +// a flag indicating if the attribute has a value. +// +// Summary of the reason. +func (o *LimitedSupportReason) GetSummary() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.summary + } + return +} + +// Template returns the value of the 'template' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional link to a template with summary and details. +func (o *LimitedSupportReason) Template() *LimitedSupportReasonTemplate { + if o != nil && o.bitmap_&128 != 0 { + return o.template + } + return nil +} + +// GetTemplate returns the value of the 'template' attribute and +// a flag indicating if the attribute has a value. +// +// Optional link to a template with summary and details. +func (o *LimitedSupportReason) GetTemplate() (value *LimitedSupportReasonTemplate, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.template + } + return +} + +// LimitedSupportReasonListKind is the name of the type used to represent list of objects of +// type 'limited_support_reason'. +const LimitedSupportReasonListKind = "LimitedSupportReasonList" + +// LimitedSupportReasonListLinkKind is the name of the type used to represent links to list +// of objects of type 'limited_support_reason'. +const LimitedSupportReasonListLinkKind = "LimitedSupportReasonListLink" + +// LimitedSupportReasonNilKind is the name of the type used to nil lists of objects of +// type 'limited_support_reason'. +const LimitedSupportReasonListNilKind = "LimitedSupportReasonListNil" + +// LimitedSupportReasonList is a list of values of the 'limited_support_reason' type. +type LimitedSupportReasonList struct { + href string + link bool + items []*LimitedSupportReason +} + +// Kind returns the name of the type of the object. +func (l *LimitedSupportReasonList) Kind() string { + if l == nil { + return LimitedSupportReasonListNilKind + } + if l.link { + return LimitedSupportReasonListLinkKind + } + return LimitedSupportReasonListKind +} + +// Link returns true iif this is a link. +func (l *LimitedSupportReasonList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *LimitedSupportReasonList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *LimitedSupportReasonList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *LimitedSupportReasonList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *LimitedSupportReasonList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *LimitedSupportReasonList) Get(i int) *LimitedSupportReason { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *LimitedSupportReasonList) Slice() []*LimitedSupportReason { + var slice []*LimitedSupportReason + if l == nil { + slice = make([]*LimitedSupportReason, 0) + } else { + slice = make([]*LimitedSupportReason, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *LimitedSupportReasonList) Each(f func(item *LimitedSupportReason) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *LimitedSupportReasonList) Range(f func(index int, item *LimitedSupportReason) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/limited_support_reason_type_json.go b/clustersmgmt/v2alpha1/limited_support_reason_type_json.go new file mode 100644 index 00000000..28ead1ab --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reason_type_json.go @@ -0,0 +1,178 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLimitedSupportReason writes a value of the 'limited_support_reason' type to the given writer. +func MarshalLimitedSupportReason(object *LimitedSupportReason, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLimitedSupportReason(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLimitedSupportReason writes a value of the 'limited_support_reason' type to the given stream. +func writeLimitedSupportReason(object *LimitedSupportReason, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(LimitedSupportReasonLinkKind) + } else { + stream.WriteString(LimitedSupportReasonKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("details") + stream.WriteString(object.details) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("detection_type") + stream.WriteString(string(object.detectionType)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("summary") + stream.WriteString(object.summary) + count++ + } + present_ = object.bitmap_&128 != 0 && object.template != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("template") + writeLimitedSupportReasonTemplate(object.template, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalLimitedSupportReason reads a value of the 'limited_support_reason' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalLimitedSupportReason(source interface{}) (object *LimitedSupportReason, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readLimitedSupportReason(iterator) + err = iterator.Error + return +} + +// readLimitedSupportReason reads a value of the 'limited_support_reason' type from the given iterator. +func readLimitedSupportReason(iterator *jsoniter.Iterator) *LimitedSupportReason { + object := &LimitedSupportReason{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == LimitedSupportReasonLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 8 + case "details": + value := iterator.ReadString() + object.details = value + object.bitmap_ |= 16 + case "detection_type": + text := iterator.ReadString() + value := DetectionType(text) + object.detectionType = value + object.bitmap_ |= 32 + case "summary": + value := iterator.ReadString() + object.summary = value + object.bitmap_ |= 64 + case "template": + value := readLimitedSupportReasonTemplate(iterator) + object.template = value + object.bitmap_ |= 128 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/limited_support_reasons_client.go b/clustersmgmt/v2alpha1/limited_support_reasons_client.go new file mode 100644 index 00000000..78e285a0 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reasons_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LimitedSupportReasonsClient is the client of the 'limited_support_reasons' resource. +// +// Manages the collection of limited support reason on a cluster. +type LimitedSupportReasonsClient struct { + transport http.RoundTripper + path string +} + +// NewLimitedSupportReasonsClient creates a new client for the 'limited_support_reasons' +// resource using the given transport to send the requests and receive the +// responses. +func NewLimitedSupportReasonsClient(transport http.RoundTripper, path string) *LimitedSupportReasonsClient { + return &LimitedSupportReasonsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new reason to the cluster. +func (c *LimitedSupportReasonsClient) Add() *LimitedSupportReasonsAddRequest { + return &LimitedSupportReasonsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of reasons. +func (c *LimitedSupportReasonsClient) List() *LimitedSupportReasonsListRequest { + return &LimitedSupportReasonsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// LimitedSupportReason returns the target 'limited_support_reason' resource for the given identifier. +// +// Reference to the service that manages an specific reason. +func (c *LimitedSupportReasonsClient) LimitedSupportReason(id string) *LimitedSupportReasonClient { + return NewLimitedSupportReasonClient( + c.transport, + path.Join(c.path, id), + ) +} + +// LimitedSupportReasonsAddRequest is the request for the 'add' method. +type LimitedSupportReasonsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *LimitedSupportReason +} + +// Parameter adds a query parameter. +func (r *LimitedSupportReasonsAddRequest) Parameter(name string, value interface{}) *LimitedSupportReasonsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LimitedSupportReasonsAddRequest) Header(name string, value interface{}) *LimitedSupportReasonsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LimitedSupportReasonsAddRequest) Impersonate(user string) *LimitedSupportReasonsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the reason. +func (r *LimitedSupportReasonsAddRequest) Body(value *LimitedSupportReason) *LimitedSupportReasonsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LimitedSupportReasonsAddRequest) Send() (result *LimitedSupportReasonsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LimitedSupportReasonsAddRequest) SendContext(ctx context.Context) (result *LimitedSupportReasonsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeLimitedSupportReasonsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LimitedSupportReasonsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLimitedSupportReasonsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// LimitedSupportReasonsAddResponse is the response for the 'add' method. +type LimitedSupportReasonsAddResponse struct { + status int + header http.Header + err *errors.Error + body *LimitedSupportReason +} + +// Status returns the response status code. +func (r *LimitedSupportReasonsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LimitedSupportReasonsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LimitedSupportReasonsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the reason. +func (r *LimitedSupportReasonsAddResponse) Body() *LimitedSupportReason { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the reason. +func (r *LimitedSupportReasonsAddResponse) GetBody() (value *LimitedSupportReason, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// LimitedSupportReasonsListRequest is the request for the 'list' method. +type LimitedSupportReasonsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *LimitedSupportReasonsListRequest) Parameter(name string, value interface{}) *LimitedSupportReasonsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LimitedSupportReasonsListRequest) Header(name string, value interface{}) *LimitedSupportReasonsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LimitedSupportReasonsListRequest) Impersonate(user string) *LimitedSupportReasonsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LimitedSupportReasonsListRequest) Page(value int) *LimitedSupportReasonsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LimitedSupportReasonsListRequest) Size(value int) *LimitedSupportReasonsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LimitedSupportReasonsListRequest) Send() (result *LimitedSupportReasonsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LimitedSupportReasonsListRequest) SendContext(ctx context.Context) (result *LimitedSupportReasonsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LimitedSupportReasonsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLimitedSupportReasonsListResponse(result, reader) + if err != nil { + return + } + return +} + +// LimitedSupportReasonsListResponse is the response for the 'list' method. +type LimitedSupportReasonsListResponse struct { + status int + header http.Header + err *errors.Error + items *LimitedSupportReasonList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *LimitedSupportReasonsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LimitedSupportReasonsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LimitedSupportReasonsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of template. +func (r *LimitedSupportReasonsListResponse) Items() *LimitedSupportReasonList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of template. +func (r *LimitedSupportReasonsListResponse) GetItems() (value *LimitedSupportReasonList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LimitedSupportReasonsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LimitedSupportReasonsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LimitedSupportReasonsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *LimitedSupportReasonsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *LimitedSupportReasonsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *LimitedSupportReasonsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/limited_support_reasons_resource_json.go b/clustersmgmt/v2alpha1/limited_support_reasons_resource_json.go new file mode 100644 index 00000000..ce3d6562 --- /dev/null +++ b/clustersmgmt/v2alpha1/limited_support_reasons_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeLimitedSupportReasonsAddRequest(request *LimitedSupportReasonsAddRequest, writer io.Writer) error { + return MarshalLimitedSupportReason(request.body, writer) +} +func readLimitedSupportReasonsAddResponse(response *LimitedSupportReasonsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLimitedSupportReason(reader) + return err +} +func writeLimitedSupportReasonsListRequest(request *LimitedSupportReasonsListRequest, writer io.Writer) error { + return nil +} +func readLimitedSupportReasonsListResponse(response *LimitedSupportReasonsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readLimitedSupportReasonList(iterator) + response.items = &LimitedSupportReasonList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/listening_method_list_type_json.go b/clustersmgmt/v2alpha1/listening_method_list_type_json.go new file mode 100644 index 00000000..a709d0ba --- /dev/null +++ b/clustersmgmt/v2alpha1/listening_method_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalListeningMethodList writes a list of values of the 'listening_method' type to +// the given writer. +func MarshalListeningMethodList(list []ListeningMethod, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeListeningMethodList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeListeningMethodList writes a list of value of the 'listening_method' type to +// the given stream. +func writeListeningMethodList(list []ListeningMethod, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalListeningMethodList reads a list of values of the 'listening_method' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalListeningMethodList(source interface{}) (items []ListeningMethod, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readListeningMethodList(iterator) + err = iterator.Error + return +} + +// readListeningMethodList reads list of values of the ”listening_method' type from +// the given iterator. +func readListeningMethodList(iterator *jsoniter.Iterator) []ListeningMethod { + list := []ListeningMethod{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ListeningMethod(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/listening_method_type.go b/clustersmgmt/v2alpha1/listening_method_type.go new file mode 100644 index 00000000..cf569356 --- /dev/null +++ b/clustersmgmt/v2alpha1/listening_method_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ListeningMethod represents the values of the 'listening_method' enumerated type. +type ListeningMethod string + +const ( + // Uses both external and internal traffic. + ListeningMethodExternal ListeningMethod = "external" + // Uses only internal traffic. + ListeningMethodInternal ListeningMethod = "internal" +) diff --git a/clustersmgmt/v2alpha1/load_balancer_flavor_list_type_json.go b/clustersmgmt/v2alpha1/load_balancer_flavor_list_type_json.go new file mode 100644 index 00000000..8ccca496 --- /dev/null +++ b/clustersmgmt/v2alpha1/load_balancer_flavor_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLoadBalancerFlavorList writes a list of values of the 'load_balancer_flavor' type to +// the given writer. +func MarshalLoadBalancerFlavorList(list []LoadBalancerFlavor, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLoadBalancerFlavorList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLoadBalancerFlavorList writes a list of value of the 'load_balancer_flavor' type to +// the given stream. +func writeLoadBalancerFlavorList(list []LoadBalancerFlavor, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalLoadBalancerFlavorList reads a list of values of the 'load_balancer_flavor' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLoadBalancerFlavorList(source interface{}) (items []LoadBalancerFlavor, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLoadBalancerFlavorList(iterator) + err = iterator.Error + return +} + +// readLoadBalancerFlavorList reads list of values of the ”load_balancer_flavor' type from +// the given iterator. +func readLoadBalancerFlavorList(iterator *jsoniter.Iterator) []LoadBalancerFlavor { + list := []LoadBalancerFlavor{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := LoadBalancerFlavor(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/load_balancer_flavor_type.go b/clustersmgmt/v2alpha1/load_balancer_flavor_type.go new file mode 100644 index 00000000..e758afcc --- /dev/null +++ b/clustersmgmt/v2alpha1/load_balancer_flavor_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LoadBalancerFlavor represents the values of the 'load_balancer_flavor' enumerated type. +type LoadBalancerFlavor string + +const ( + // Classic Load Balancer. + LoadBalancerFlavorClassic LoadBalancerFlavor = "classic" + // Network Load Balancer. + LoadBalancerFlavorNlb LoadBalancerFlavor = "nlb" +) diff --git a/clustersmgmt/v2alpha1/load_balancer_quota_values_client.go b/clustersmgmt/v2alpha1/load_balancer_quota_values_client.go new file mode 100644 index 00000000..3b63fd13 --- /dev/null +++ b/clustersmgmt/v2alpha1/load_balancer_quota_values_client.go @@ -0,0 +1,286 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LoadBalancerQuotaValuesClient is the client of the 'load_balancer_quota_values' resource. +// +// Manages load balancer quota values. +type LoadBalancerQuotaValuesClient struct { + transport http.RoundTripper + path string +} + +// NewLoadBalancerQuotaValuesClient creates a new client for the 'load_balancer_quota_values' +// resource using the given transport to send the requests and receive the +// responses. +func NewLoadBalancerQuotaValuesClient(transport http.RoundTripper, path string) *LoadBalancerQuotaValuesClient { + return &LoadBalancerQuotaValuesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of Load Balancer Quota Values. +func (c *LoadBalancerQuotaValuesClient) List() *LoadBalancerQuotaValuesListRequest { + return &LoadBalancerQuotaValuesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// LoadBalancerQuotaValuesListRequest is the request for the 'list' method. +type LoadBalancerQuotaValuesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *LoadBalancerQuotaValuesListRequest) Parameter(name string, value interface{}) *LoadBalancerQuotaValuesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LoadBalancerQuotaValuesListRequest) Header(name string, value interface{}) *LoadBalancerQuotaValuesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LoadBalancerQuotaValuesListRequest) Impersonate(user string) *LoadBalancerQuotaValuesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LoadBalancerQuotaValuesListRequest) Page(value int) *LoadBalancerQuotaValuesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LoadBalancerQuotaValuesListRequest) Size(value int) *LoadBalancerQuotaValuesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LoadBalancerQuotaValuesListRequest) Send() (result *LoadBalancerQuotaValuesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LoadBalancerQuotaValuesListRequest) SendContext(ctx context.Context) (result *LoadBalancerQuotaValuesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LoadBalancerQuotaValuesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLoadBalancerQuotaValuesListResponse(result, reader) + if err != nil { + return + } + return +} + +// LoadBalancerQuotaValuesListResponse is the response for the 'list' method. +type LoadBalancerQuotaValuesListResponse struct { + status int + header http.Header + err *errors.Error + items []int + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *LoadBalancerQuotaValuesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LoadBalancerQuotaValuesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LoadBalancerQuotaValuesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of values. +func (r *LoadBalancerQuotaValuesListResponse) Items() []int { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of values. +func (r *LoadBalancerQuotaValuesListResponse) GetItems() (value []int, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LoadBalancerQuotaValuesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LoadBalancerQuotaValuesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LoadBalancerQuotaValuesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *LoadBalancerQuotaValuesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *LoadBalancerQuotaValuesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *LoadBalancerQuotaValuesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/load_balancer_quota_values_resource_json.go b/clustersmgmt/v2alpha1/load_balancer_quota_values_resource_json.go new file mode 100644 index 00000000..9396d483 --- /dev/null +++ b/clustersmgmt/v2alpha1/load_balancer_quota_values_resource_json.go @@ -0,0 +1,59 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeLoadBalancerQuotaValuesListRequest(request *LoadBalancerQuotaValuesListRequest, writer io.Writer) error { + return nil +} +func readLoadBalancerQuotaValuesListResponse(response *LoadBalancerQuotaValuesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readIntegerList(iterator) + response.items = items + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/log_builder.go b/clustersmgmt/v2alpha1/log_builder.go new file mode 100644 index 00000000..6b712ff2 --- /dev/null +++ b/clustersmgmt/v2alpha1/log_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LogBuilder contains the data and logic needed to build 'log' objects. +// +// Log of the cluster. +type LogBuilder struct { + bitmap_ uint32 + id string + href string + content string +} + +// NewLog creates a new builder of 'log' objects. +func NewLog() *LogBuilder { + return &LogBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *LogBuilder) Link(value bool) *LogBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *LogBuilder) ID(value string) *LogBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *LogBuilder) HREF(value string) *LogBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *LogBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Content sets the value of the 'content' attribute to the given value. +func (b *LogBuilder) Content(value string) *LogBuilder { + b.content = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *LogBuilder) Copy(object *Log) *LogBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.content = object.content + return b +} + +// Build creates a 'log' object using the configuration stored in the builder. +func (b *LogBuilder) Build() (object *Log, err error) { + object = new(Log) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.content = b.content + return +} diff --git a/clustersmgmt/v2alpha1/log_client.go b/clustersmgmt/v2alpha1/log_client.go new file mode 100644 index 00000000..9a2f11fe --- /dev/null +++ b/clustersmgmt/v2alpha1/log_client.go @@ -0,0 +1,365 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LogClient is the client of the 'log' resource. +// +// Manages a specific log. +type LogClient struct { + transport http.RoundTripper + path string +} + +// NewLogClient creates a new client for the 'log' +// resource using the given transport to send the requests and receive the +// responses. +func NewLogClient(transport http.RoundTripper, path string) *LogClient { + return &LogClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the log. +func (c *LogClient) Get() *LogGetRequest { + return &LogGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// LogPollRequest is the request for the Poll method. +type LogPollRequest struct { + request *LogGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *LogPollRequest) Parameter(name string, value interface{}) *LogPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *LogPollRequest) Header(name string, value interface{}) *LogPollRequest { + r.request.Header(name, value) + return r +} + +// Offset sets the value of the 'offset' parameter for all the requests that +// will be used to retrieve the object. +// +// Line offset to start logs from. if 0 retreive entire log. +// If offset > #lines return an empty log. +func (r *LogPollRequest) Offset(value int) *LogPollRequest { + r.request.Offset(value) + return r +} + +// Tail sets the value of the 'tail' parameter for all the requests that +// will be used to retrieve the object. +// +// Returns the number of tail lines from the end of the log. +// If there are no line breaks or the number of lines < tail +// return the entire log. +// Either 'tail' or 'offset' can be set. Not both. +func (r *LogPollRequest) Tail(value int) *LogPollRequest { + r.request.Tail(value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *LogPollRequest) Interval(value time.Duration) *LogPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *LogPollRequest) Status(value int) *LogPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *LogPollRequest) Predicate(value func(*LogGetResponse) bool) *LogPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*LogGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *LogPollRequest) StartContext(ctx context.Context) (response *LogPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &LogPollResponse{ + response: result.(*LogGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *LogPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// LogPollResponse is the response for the Poll method. +type LogPollResponse struct { + response *LogGetResponse +} + +// Status returns the response status code. +func (r *LogPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *LogPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *LogPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +// +// Retreived log. +func (r *LogPollResponse) Body() *Log { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Retreived log. +func (r *LogPollResponse) GetBody() (value *Log, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *LogClient) Poll() *LogPollRequest { + return &LogPollRequest{ + request: c.Get(), + } +} + +// LogGetRequest is the request for the 'get' method. +type LogGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + offset *int + tail *int +} + +// Parameter adds a query parameter. +func (r *LogGetRequest) Parameter(name string, value interface{}) *LogGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LogGetRequest) Header(name string, value interface{}) *LogGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LogGetRequest) Impersonate(user string) *LogGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Offset sets the value of the 'offset' parameter. +// +// Line offset to start logs from. if 0 retreive entire log. +// If offset > #lines return an empty log. +func (r *LogGetRequest) Offset(value int) *LogGetRequest { + r.offset = &value + return r +} + +// Tail sets the value of the 'tail' parameter. +// +// Returns the number of tail lines from the end of the log. +// If there are no line breaks or the number of lines < tail +// return the entire log. +// Either 'tail' or 'offset' can be set. Not both. +func (r *LogGetRequest) Tail(value int) *LogGetRequest { + r.tail = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LogGetRequest) Send() (result *LogGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LogGetRequest) SendContext(ctx context.Context) (result *LogGetResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.offset != nil { + helpers.AddValue(&query, "offset", *r.offset) + } + if r.tail != nil { + helpers.AddValue(&query, "tail", *r.tail) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LogGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLogGetResponse(result, reader) + if err != nil { + return + } + return +} + +// LogGetResponse is the response for the 'get' method. +type LogGetResponse struct { + status int + header http.Header + err *errors.Error + body *Log +} + +// Status returns the response status code. +func (r *LogGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LogGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LogGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Retreived log. +func (r *LogGetResponse) Body() *Log { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Retreived log. +func (r *LogGetResponse) GetBody() (value *Log, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/log_list_builder.go b/clustersmgmt/v2alpha1/log_list_builder.go new file mode 100644 index 00000000..66f94d2c --- /dev/null +++ b/clustersmgmt/v2alpha1/log_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LogListBuilder contains the data and logic needed to build +// 'log' objects. +type LogListBuilder struct { + items []*LogBuilder +} + +// NewLogList creates a new builder of 'log' objects. +func NewLogList() *LogListBuilder { + return new(LogListBuilder) +} + +// Items sets the items of the list. +func (b *LogListBuilder) Items(values ...*LogBuilder) *LogListBuilder { + b.items = make([]*LogBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *LogListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *LogListBuilder) Copy(list *LogList) *LogListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*LogBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewLog().Copy(v) + } + } + return b +} + +// Build creates a list of 'log' objects using the +// configuration stored in the builder. +func (b *LogListBuilder) Build() (list *LogList, err error) { + items := make([]*Log, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(LogList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/log_list_type_json.go b/clustersmgmt/v2alpha1/log_list_type_json.go new file mode 100644 index 00000000..51bda0f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/log_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLogList writes a list of values of the 'log' type to +// the given writer. +func MarshalLogList(list []*Log, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLogList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLogList writes a list of value of the 'log' type to +// the given stream. +func writeLogList(list []*Log, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeLog(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalLogList reads a list of values of the 'log' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLogList(source interface{}) (items []*Log, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLogList(iterator) + err = iterator.Error + return +} + +// readLogList reads list of values of the ”log' type from +// the given iterator. +func readLogList(iterator *jsoniter.Iterator) []*Log { + list := []*Log{} + for iterator.ReadArray() { + item := readLog(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/log_resource_json.go b/clustersmgmt/v2alpha1/log_resource_json.go new file mode 100644 index 00000000..8852459e --- /dev/null +++ b/clustersmgmt/v2alpha1/log_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeLogGetRequest(request *LogGetRequest, writer io.Writer) error { + return nil +} +func readLogGetResponse(response *LogGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalLog(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/log_type.go b/clustersmgmt/v2alpha1/log_type.go new file mode 100644 index 00000000..79d0d05d --- /dev/null +++ b/clustersmgmt/v2alpha1/log_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// LogKind is the name of the type used to represent objects +// of type 'log'. +const LogKind = "Log" + +// LogLinkKind is the name of the type used to represent links +// to objects of type 'log'. +const LogLinkKind = "LogLink" + +// LogNilKind is the name of the type used to nil references +// to objects of type 'log'. +const LogNilKind = "LogNil" + +// Log represents the values of the 'log' type. +// +// Log of the cluster. +type Log struct { + bitmap_ uint32 + id string + href string + content string +} + +// Kind returns the name of the type of the object. +func (o *Log) Kind() string { + if o == nil { + return LogNilKind + } + if o.bitmap_&1 != 0 { + return LogLinkKind + } + return LogKind +} + +// Link returns true iif this is a link. +func (o *Log) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Log) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Log) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Log) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Log) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Log) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Content returns the value of the 'content' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Content of the log. +func (o *Log) Content() string { + if o != nil && o.bitmap_&8 != 0 { + return o.content + } + return "" +} + +// GetContent returns the value of the 'content' attribute and +// a flag indicating if the attribute has a value. +// +// Content of the log. +func (o *Log) GetContent() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.content + } + return +} + +// LogListKind is the name of the type used to represent list of objects of +// type 'log'. +const LogListKind = "LogList" + +// LogListLinkKind is the name of the type used to represent links to list +// of objects of type 'log'. +const LogListLinkKind = "LogListLink" + +// LogNilKind is the name of the type used to nil lists of objects of +// type 'log'. +const LogListNilKind = "LogListNil" + +// LogList is a list of values of the 'log' type. +type LogList struct { + href string + link bool + items []*Log +} + +// Kind returns the name of the type of the object. +func (l *LogList) Kind() string { + if l == nil { + return LogListNilKind + } + if l.link { + return LogListLinkKind + } + return LogListKind +} + +// Link returns true iif this is a link. +func (l *LogList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *LogList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *LogList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *LogList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *LogList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *LogList) Get(i int) *Log { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *LogList) Slice() []*Log { + var slice []*Log + if l == nil { + slice = make([]*Log, 0) + } else { + slice = make([]*Log, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *LogList) Each(f func(item *Log) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *LogList) Range(f func(index int, item *Log) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/log_type_json.go b/clustersmgmt/v2alpha1/log_type_json.go new file mode 100644 index 00000000..7ede17db --- /dev/null +++ b/clustersmgmt/v2alpha1/log_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLog writes a value of the 'log' type to the given writer. +func MarshalLog(object *Log, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLog(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLog writes a value of the 'log' type to the given stream. +func writeLog(object *Log, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(LogLinkKind) + } else { + stream.WriteString(LogKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("content") + stream.WriteString(object.content) + } + stream.WriteObjectEnd() +} + +// UnmarshalLog reads a value of the 'log' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalLog(source interface{}) (object *Log, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readLog(iterator) + err = iterator.Error + return +} + +// readLog reads a value of the 'log' type from the given iterator. +func readLog(iterator *jsoniter.Iterator) *Log { + object := &Log{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == LogLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "content": + value := iterator.ReadString() + object.content = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/logs_client.go b/clustersmgmt/v2alpha1/logs_client.go new file mode 100644 index 00000000..b929c1c3 --- /dev/null +++ b/clustersmgmt/v2alpha1/logs_client.go @@ -0,0 +1,303 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// LogsClient is the client of the 'logs' resource. +// +// Manages a collection of log links. +type LogsClient struct { + transport http.RoundTripper + path string +} + +// NewLogsClient creates a new client for the 'logs' +// resource using the given transport to send the requests and receive the +// responses. +func NewLogsClient(transport http.RoundTripper, path string) *LogsClient { + return &LogsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of log links. +func (c *LogsClient) List() *LogsListRequest { + return &LogsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Install returns the target 'log' resource. +func (c *LogsClient) Install() *LogClient { + return NewLogClient( + c.transport, + path.Join(c.path, "install"), + ) +} + +// Uninstall returns the target 'log' resource. +func (c *LogsClient) Uninstall() *LogClient { + return NewLogClient( + c.transport, + path.Join(c.path, "uninstall"), + ) +} + +// LogsListRequest is the request for the 'list' method. +type LogsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *LogsListRequest) Parameter(name string, value interface{}) *LogsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *LogsListRequest) Header(name string, value interface{}) *LogsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *LogsListRequest) Impersonate(user string) *LogsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LogsListRequest) Page(value int) *LogsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LogsListRequest) Size(value int) *LogsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *LogsListRequest) Send() (result *LogsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *LogsListRequest) SendContext(ctx context.Context) (result *LogsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &LogsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readLogsListResponse(result, reader) + if err != nil { + return + } + return +} + +// LogsListResponse is the response for the 'list' method. +type LogsListResponse struct { + status int + header http.Header + err *errors.Error + items *LogList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *LogsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *LogsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *LogsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of log links. +func (r *LogsListResponse) Items() *LogList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of log links. +func (r *LogsListResponse) GetItems() (value *LogList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LogsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *LogsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *LogsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *LogsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *LogsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *LogsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/logs_resource_json.go b/clustersmgmt/v2alpha1/logs_resource_json.go new file mode 100644 index 00000000..8ad62ae2 --- /dev/null +++ b/clustersmgmt/v2alpha1/logs_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeLogsListRequest(request *LogsListRequest, writer io.Writer) error { + return nil +} +func readLogsListResponse(response *LogsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readLogList(iterator) + response.items = &LogList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/long_list_type_json.go b/clustersmgmt/v2alpha1/long_list_type_json.go new file mode 100644 index 00000000..b7c86786 --- /dev/null +++ b/clustersmgmt/v2alpha1/long_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalLongList writes a list of values of the 'long' type to +// the given writer. +func MarshalLongList(list []int64, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeLongList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeLongList writes a list of value of the 'long' type to +// the given stream. +func writeLongList(list []int64, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteInt64(value) + } + stream.WriteArrayEnd() +} + +// UnmarshalLongList reads a list of values of the 'long' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalLongList(source interface{}) (items []int64, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readLongList(iterator) + err = iterator.Error + return +} + +// readLongList reads list of values of the ”long' type from +// the given iterator. +func readLongList(iterator *jsoniter.Iterator) []int64 { + list := []int64{} + for iterator.ReadArray() { + item := iterator.ReadInt64() + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_pool_autoscaling_builder.go b/clustersmgmt/v2alpha1/machine_pool_autoscaling_builder.go new file mode 100644 index 00000000..18d7fa25 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_autoscaling_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolAutoscalingBuilder contains the data and logic needed to build 'machine_pool_autoscaling' objects. +// +// Representation of a autoscaling in a machine pool. +type MachinePoolAutoscalingBuilder struct { + bitmap_ uint32 + id string + href string + maxReplicas int + minReplicas int +} + +// NewMachinePoolAutoscaling creates a new builder of 'machine_pool_autoscaling' objects. +func NewMachinePoolAutoscaling() *MachinePoolAutoscalingBuilder { + return &MachinePoolAutoscalingBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *MachinePoolAutoscalingBuilder) Link(value bool) *MachinePoolAutoscalingBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *MachinePoolAutoscalingBuilder) ID(value string) *MachinePoolAutoscalingBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *MachinePoolAutoscalingBuilder) HREF(value string) *MachinePoolAutoscalingBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *MachinePoolAutoscalingBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// MaxReplicas sets the value of the 'max_replicas' attribute to the given value. +func (b *MachinePoolAutoscalingBuilder) MaxReplicas(value int) *MachinePoolAutoscalingBuilder { + b.maxReplicas = value + b.bitmap_ |= 8 + return b +} + +// MinReplicas sets the value of the 'min_replicas' attribute to the given value. +func (b *MachinePoolAutoscalingBuilder) MinReplicas(value int) *MachinePoolAutoscalingBuilder { + b.minReplicas = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *MachinePoolAutoscalingBuilder) Copy(object *MachinePoolAutoscaling) *MachinePoolAutoscalingBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.maxReplicas = object.maxReplicas + b.minReplicas = object.minReplicas + return b +} + +// Build creates a 'machine_pool_autoscaling' object using the configuration stored in the builder. +func (b *MachinePoolAutoscalingBuilder) Build() (object *MachinePoolAutoscaling, err error) { + object = new(MachinePoolAutoscaling) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.maxReplicas = b.maxReplicas + object.minReplicas = b.minReplicas + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_autoscaling_list_builder.go b/clustersmgmt/v2alpha1/machine_pool_autoscaling_list_builder.go new file mode 100644 index 00000000..a6b87bfd --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_autoscaling_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolAutoscalingListBuilder contains the data and logic needed to build +// 'machine_pool_autoscaling' objects. +type MachinePoolAutoscalingListBuilder struct { + items []*MachinePoolAutoscalingBuilder +} + +// NewMachinePoolAutoscalingList creates a new builder of 'machine_pool_autoscaling' objects. +func NewMachinePoolAutoscalingList() *MachinePoolAutoscalingListBuilder { + return new(MachinePoolAutoscalingListBuilder) +} + +// Items sets the items of the list. +func (b *MachinePoolAutoscalingListBuilder) Items(values ...*MachinePoolAutoscalingBuilder) *MachinePoolAutoscalingListBuilder { + b.items = make([]*MachinePoolAutoscalingBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *MachinePoolAutoscalingListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *MachinePoolAutoscalingListBuilder) Copy(list *MachinePoolAutoscalingList) *MachinePoolAutoscalingListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*MachinePoolAutoscalingBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewMachinePoolAutoscaling().Copy(v) + } + } + return b +} + +// Build creates a list of 'machine_pool_autoscaling' objects using the +// configuration stored in the builder. +func (b *MachinePoolAutoscalingListBuilder) Build() (list *MachinePoolAutoscalingList, err error) { + items := make([]*MachinePoolAutoscaling, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(MachinePoolAutoscalingList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_autoscaling_list_type_json.go b/clustersmgmt/v2alpha1/machine_pool_autoscaling_list_type_json.go new file mode 100644 index 00000000..6041a43a --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_autoscaling_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachinePoolAutoscalingList writes a list of values of the 'machine_pool_autoscaling' type to +// the given writer. +func MarshalMachinePoolAutoscalingList(list []*MachinePoolAutoscaling, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachinePoolAutoscalingList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachinePoolAutoscalingList writes a list of value of the 'machine_pool_autoscaling' type to +// the given stream. +func writeMachinePoolAutoscalingList(list []*MachinePoolAutoscaling, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeMachinePoolAutoscaling(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalMachinePoolAutoscalingList reads a list of values of the 'machine_pool_autoscaling' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalMachinePoolAutoscalingList(source interface{}) (items []*MachinePoolAutoscaling, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readMachinePoolAutoscalingList(iterator) + err = iterator.Error + return +} + +// readMachinePoolAutoscalingList reads list of values of the ”machine_pool_autoscaling' type from +// the given iterator. +func readMachinePoolAutoscalingList(iterator *jsoniter.Iterator) []*MachinePoolAutoscaling { + list := []*MachinePoolAutoscaling{} + for iterator.ReadArray() { + item := readMachinePoolAutoscaling(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_pool_autoscaling_type.go b/clustersmgmt/v2alpha1/machine_pool_autoscaling_type.go new file mode 100644 index 00000000..d9c2b626 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_autoscaling_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolAutoscalingKind is the name of the type used to represent objects +// of type 'machine_pool_autoscaling'. +const MachinePoolAutoscalingKind = "MachinePoolAutoscaling" + +// MachinePoolAutoscalingLinkKind is the name of the type used to represent links +// to objects of type 'machine_pool_autoscaling'. +const MachinePoolAutoscalingLinkKind = "MachinePoolAutoscalingLink" + +// MachinePoolAutoscalingNilKind is the name of the type used to nil references +// to objects of type 'machine_pool_autoscaling'. +const MachinePoolAutoscalingNilKind = "MachinePoolAutoscalingNil" + +// MachinePoolAutoscaling represents the values of the 'machine_pool_autoscaling' type. +// +// Representation of a autoscaling in a machine pool. +type MachinePoolAutoscaling struct { + bitmap_ uint32 + id string + href string + maxReplicas int + minReplicas int +} + +// Kind returns the name of the type of the object. +func (o *MachinePoolAutoscaling) Kind() string { + if o == nil { + return MachinePoolAutoscalingNilKind + } + if o.bitmap_&1 != 0 { + return MachinePoolAutoscalingLinkKind + } + return MachinePoolAutoscalingKind +} + +// Link returns true iif this is a link. +func (o *MachinePoolAutoscaling) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *MachinePoolAutoscaling) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *MachinePoolAutoscaling) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *MachinePoolAutoscaling) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *MachinePoolAutoscaling) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *MachinePoolAutoscaling) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// MaxReplicas returns the value of the 'max_replicas' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The maximum number of replicas for the machine pool. +func (o *MachinePoolAutoscaling) MaxReplicas() int { + if o != nil && o.bitmap_&8 != 0 { + return o.maxReplicas + } + return 0 +} + +// GetMaxReplicas returns the value of the 'max_replicas' attribute and +// a flag indicating if the attribute has a value. +// +// The maximum number of replicas for the machine pool. +func (o *MachinePoolAutoscaling) GetMaxReplicas() (value int, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.maxReplicas + } + return +} + +// MinReplicas returns the value of the 'min_replicas' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The minimum number of replicas for the machine pool. +func (o *MachinePoolAutoscaling) MinReplicas() int { + if o != nil && o.bitmap_&16 != 0 { + return o.minReplicas + } + return 0 +} + +// GetMinReplicas returns the value of the 'min_replicas' attribute and +// a flag indicating if the attribute has a value. +// +// The minimum number of replicas for the machine pool. +func (o *MachinePoolAutoscaling) GetMinReplicas() (value int, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.minReplicas + } + return +} + +// MachinePoolAutoscalingListKind is the name of the type used to represent list of objects of +// type 'machine_pool_autoscaling'. +const MachinePoolAutoscalingListKind = "MachinePoolAutoscalingList" + +// MachinePoolAutoscalingListLinkKind is the name of the type used to represent links to list +// of objects of type 'machine_pool_autoscaling'. +const MachinePoolAutoscalingListLinkKind = "MachinePoolAutoscalingListLink" + +// MachinePoolAutoscalingNilKind is the name of the type used to nil lists of objects of +// type 'machine_pool_autoscaling'. +const MachinePoolAutoscalingListNilKind = "MachinePoolAutoscalingListNil" + +// MachinePoolAutoscalingList is a list of values of the 'machine_pool_autoscaling' type. +type MachinePoolAutoscalingList struct { + href string + link bool + items []*MachinePoolAutoscaling +} + +// Kind returns the name of the type of the object. +func (l *MachinePoolAutoscalingList) Kind() string { + if l == nil { + return MachinePoolAutoscalingListNilKind + } + if l.link { + return MachinePoolAutoscalingListLinkKind + } + return MachinePoolAutoscalingListKind +} + +// Link returns true iif this is a link. +func (l *MachinePoolAutoscalingList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *MachinePoolAutoscalingList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *MachinePoolAutoscalingList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *MachinePoolAutoscalingList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *MachinePoolAutoscalingList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *MachinePoolAutoscalingList) Get(i int) *MachinePoolAutoscaling { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *MachinePoolAutoscalingList) Slice() []*MachinePoolAutoscaling { + var slice []*MachinePoolAutoscaling + if l == nil { + slice = make([]*MachinePoolAutoscaling, 0) + } else { + slice = make([]*MachinePoolAutoscaling, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *MachinePoolAutoscalingList) Each(f func(item *MachinePoolAutoscaling) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *MachinePoolAutoscalingList) Range(f func(index int, item *MachinePoolAutoscaling) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/machine_pool_autoscaling_type_json.go b/clustersmgmt/v2alpha1/machine_pool_autoscaling_type_json.go new file mode 100644 index 00000000..fcf5c0f4 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_autoscaling_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachinePoolAutoscaling writes a value of the 'machine_pool_autoscaling' type to the given writer. +func MarshalMachinePoolAutoscaling(object *MachinePoolAutoscaling, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachinePoolAutoscaling(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachinePoolAutoscaling writes a value of the 'machine_pool_autoscaling' type to the given stream. +func writeMachinePoolAutoscaling(object *MachinePoolAutoscaling, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(MachinePoolAutoscalingLinkKind) + } else { + stream.WriteString(MachinePoolAutoscalingKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_replicas") + stream.WriteInt(object.maxReplicas) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("min_replicas") + stream.WriteInt(object.minReplicas) + } + stream.WriteObjectEnd() +} + +// UnmarshalMachinePoolAutoscaling reads a value of the 'machine_pool_autoscaling' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalMachinePoolAutoscaling(source interface{}) (object *MachinePoolAutoscaling, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readMachinePoolAutoscaling(iterator) + err = iterator.Error + return +} + +// readMachinePoolAutoscaling reads a value of the 'machine_pool_autoscaling' type from the given iterator. +func readMachinePoolAutoscaling(iterator *jsoniter.Iterator) *MachinePoolAutoscaling { + object := &MachinePoolAutoscaling{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == MachinePoolAutoscalingLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "max_replicas": + value := iterator.ReadInt() + object.maxReplicas = value + object.bitmap_ |= 8 + case "min_replicas": + value := iterator.ReadInt() + object.minReplicas = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/machine_pool_builder.go b/clustersmgmt/v2alpha1/machine_pool_builder.go new file mode 100644 index 00000000..d64ac199 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_builder.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolBuilder contains the data and logic needed to build 'machine_pool' objects. +// +// Representation of a machine pool in a cluster. +type MachinePoolBuilder struct { + bitmap_ uint32 + id string + href string + aws *AWSMachinePoolBuilder + autoscaling *MachinePoolAutoscalingBuilder + availabilityZones []string + instanceType string + labels map[string]string + replicas int + rootVolume *RootVolumeBuilder + securityGroupFilters []*MachinePoolSecurityGroupFilterBuilder + subnets []string + taints []*TaintBuilder +} + +// NewMachinePool creates a new builder of 'machine_pool' objects. +func NewMachinePool() *MachinePoolBuilder { + return &MachinePoolBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *MachinePoolBuilder) Link(value bool) *MachinePoolBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *MachinePoolBuilder) ID(value string) *MachinePoolBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *MachinePoolBuilder) HREF(value string) *MachinePoolBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *MachinePoolBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AWS sets the value of the 'AWS' attribute to the given value. +// +// Representation of aws machine pool specific parameters. +func (b *MachinePoolBuilder) AWS(value *AWSMachinePoolBuilder) *MachinePoolBuilder { + b.aws = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Autoscaling sets the value of the 'autoscaling' attribute to the given value. +// +// Representation of a autoscaling in a machine pool. +func (b *MachinePoolBuilder) Autoscaling(value *MachinePoolAutoscalingBuilder) *MachinePoolBuilder { + b.autoscaling = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// AvailabilityZones sets the value of the 'availability_zones' attribute to the given values. +func (b *MachinePoolBuilder) AvailabilityZones(values ...string) *MachinePoolBuilder { + b.availabilityZones = make([]string, len(values)) + copy(b.availabilityZones, values) + b.bitmap_ |= 32 + return b +} + +// InstanceType sets the value of the 'instance_type' attribute to the given value. +func (b *MachinePoolBuilder) InstanceType(value string) *MachinePoolBuilder { + b.instanceType = value + b.bitmap_ |= 64 + return b +} + +// Labels sets the value of the 'labels' attribute to the given value. +func (b *MachinePoolBuilder) Labels(value map[string]string) *MachinePoolBuilder { + b.labels = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// Replicas sets the value of the 'replicas' attribute to the given value. +func (b *MachinePoolBuilder) Replicas(value int) *MachinePoolBuilder { + b.replicas = value + b.bitmap_ |= 256 + return b +} + +// RootVolume sets the value of the 'root_volume' attribute to the given value. +// +// Root volume capabilities. +func (b *MachinePoolBuilder) RootVolume(value *RootVolumeBuilder) *MachinePoolBuilder { + b.rootVolume = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// SecurityGroupFilters sets the value of the 'security_group_filters' attribute to the given values. +func (b *MachinePoolBuilder) SecurityGroupFilters(values ...*MachinePoolSecurityGroupFilterBuilder) *MachinePoolBuilder { + b.securityGroupFilters = make([]*MachinePoolSecurityGroupFilterBuilder, len(values)) + copy(b.securityGroupFilters, values) + b.bitmap_ |= 1024 + return b +} + +// Subnets sets the value of the 'subnets' attribute to the given values. +func (b *MachinePoolBuilder) Subnets(values ...string) *MachinePoolBuilder { + b.subnets = make([]string, len(values)) + copy(b.subnets, values) + b.bitmap_ |= 2048 + return b +} + +// Taints sets the value of the 'taints' attribute to the given values. +func (b *MachinePoolBuilder) Taints(values ...*TaintBuilder) *MachinePoolBuilder { + b.taints = make([]*TaintBuilder, len(values)) + copy(b.taints, values) + b.bitmap_ |= 4096 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *MachinePoolBuilder) Copy(object *MachinePool) *MachinePoolBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.aws != nil { + b.aws = NewAWSMachinePool().Copy(object.aws) + } else { + b.aws = nil + } + if object.autoscaling != nil { + b.autoscaling = NewMachinePoolAutoscaling().Copy(object.autoscaling) + } else { + b.autoscaling = nil + } + if object.availabilityZones != nil { + b.availabilityZones = make([]string, len(object.availabilityZones)) + copy(b.availabilityZones, object.availabilityZones) + } else { + b.availabilityZones = nil + } + b.instanceType = object.instanceType + if len(object.labels) > 0 { + b.labels = map[string]string{} + for k, v := range object.labels { + b.labels[k] = v + } + } else { + b.labels = nil + } + b.replicas = object.replicas + if object.rootVolume != nil { + b.rootVolume = NewRootVolume().Copy(object.rootVolume) + } else { + b.rootVolume = nil + } + if object.securityGroupFilters != nil { + b.securityGroupFilters = make([]*MachinePoolSecurityGroupFilterBuilder, len(object.securityGroupFilters)) + for i, v := range object.securityGroupFilters { + b.securityGroupFilters[i] = NewMachinePoolSecurityGroupFilter().Copy(v) + } + } else { + b.securityGroupFilters = nil + } + if object.subnets != nil { + b.subnets = make([]string, len(object.subnets)) + copy(b.subnets, object.subnets) + } else { + b.subnets = nil + } + if object.taints != nil { + b.taints = make([]*TaintBuilder, len(object.taints)) + for i, v := range object.taints { + b.taints[i] = NewTaint().Copy(v) + } + } else { + b.taints = nil + } + return b +} + +// Build creates a 'machine_pool' object using the configuration stored in the builder. +func (b *MachinePoolBuilder) Build() (object *MachinePool, err error) { + object = new(MachinePool) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.aws != nil { + object.aws, err = b.aws.Build() + if err != nil { + return + } + } + if b.autoscaling != nil { + object.autoscaling, err = b.autoscaling.Build() + if err != nil { + return + } + } + if b.availabilityZones != nil { + object.availabilityZones = make([]string, len(b.availabilityZones)) + copy(object.availabilityZones, b.availabilityZones) + } + object.instanceType = b.instanceType + if b.labels != nil { + object.labels = make(map[string]string) + for k, v := range b.labels { + object.labels[k] = v + } + } + object.replicas = b.replicas + if b.rootVolume != nil { + object.rootVolume, err = b.rootVolume.Build() + if err != nil { + return + } + } + if b.securityGroupFilters != nil { + object.securityGroupFilters = make([]*MachinePoolSecurityGroupFilter, len(b.securityGroupFilters)) + for i, v := range b.securityGroupFilters { + object.securityGroupFilters[i], err = v.Build() + if err != nil { + return + } + } + } + if b.subnets != nil { + object.subnets = make([]string, len(b.subnets)) + copy(object.subnets, b.subnets) + } + if b.taints != nil { + object.taints = make([]*Taint, len(b.taints)) + for i, v := range b.taints { + object.taints[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_client.go b/clustersmgmt/v2alpha1/machine_pool_client.go new file mode 100644 index 00000000..9b051bbe --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MachinePoolClient is the client of the 'machine_pool' resource. +// +// Manages a specific machine pool. +type MachinePoolClient struct { + transport http.RoundTripper + path string +} + +// NewMachinePoolClient creates a new client for the 'machine_pool' +// resource using the given transport to send the requests and receive the +// responses. +func NewMachinePoolClient(transport http.RoundTripper, path string) *MachinePoolClient { + return &MachinePoolClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the machine pool. +func (c *MachinePoolClient) Delete() *MachinePoolDeleteRequest { + return &MachinePoolDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the machine pool. +func (c *MachinePoolClient) Get() *MachinePoolGetRequest { + return &MachinePoolGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the machine pool. +func (c *MachinePoolClient) Update() *MachinePoolUpdateRequest { + return &MachinePoolUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// MachinePoolPollRequest is the request for the Poll method. +type MachinePoolPollRequest struct { + request *MachinePoolGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *MachinePoolPollRequest) Parameter(name string, value interface{}) *MachinePoolPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *MachinePoolPollRequest) Header(name string, value interface{}) *MachinePoolPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *MachinePoolPollRequest) Interval(value time.Duration) *MachinePoolPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *MachinePoolPollRequest) Status(value int) *MachinePoolPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *MachinePoolPollRequest) Predicate(value func(*MachinePoolGetResponse) bool) *MachinePoolPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*MachinePoolGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *MachinePoolPollRequest) StartContext(ctx context.Context) (response *MachinePoolPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &MachinePoolPollResponse{ + response: result.(*MachinePoolGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *MachinePoolPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// MachinePoolPollResponse is the response for the Poll method. +type MachinePoolPollResponse struct { + response *MachinePoolGetResponse +} + +// Status returns the response status code. +func (r *MachinePoolPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *MachinePoolPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *MachinePoolPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *MachinePoolPollResponse) Body() *MachinePool { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *MachinePoolPollResponse) GetBody() (value *MachinePool, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *MachinePoolClient) Poll() *MachinePoolPollRequest { + return &MachinePoolPollRequest{ + request: c.Get(), + } +} + +// MachinePoolDeleteRequest is the request for the 'delete' method. +type MachinePoolDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *MachinePoolDeleteRequest) Parameter(name string, value interface{}) *MachinePoolDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachinePoolDeleteRequest) Header(name string, value interface{}) *MachinePoolDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachinePoolDeleteRequest) Impersonate(user string) *MachinePoolDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachinePoolDeleteRequest) Send() (result *MachinePoolDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachinePoolDeleteRequest) SendContext(ctx context.Context) (result *MachinePoolDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachinePoolDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// MachinePoolDeleteResponse is the response for the 'delete' method. +type MachinePoolDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *MachinePoolDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachinePoolDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachinePoolDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// MachinePoolGetRequest is the request for the 'get' method. +type MachinePoolGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *MachinePoolGetRequest) Parameter(name string, value interface{}) *MachinePoolGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachinePoolGetRequest) Header(name string, value interface{}) *MachinePoolGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachinePoolGetRequest) Impersonate(user string) *MachinePoolGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachinePoolGetRequest) Send() (result *MachinePoolGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachinePoolGetRequest) SendContext(ctx context.Context) (result *MachinePoolGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachinePoolGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readMachinePoolGetResponse(result, reader) + if err != nil { + return + } + return +} + +// MachinePoolGetResponse is the response for the 'get' method. +type MachinePoolGetResponse struct { + status int + header http.Header + err *errors.Error + body *MachinePool +} + +// Status returns the response status code. +func (r *MachinePoolGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachinePoolGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachinePoolGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *MachinePoolGetResponse) Body() *MachinePool { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *MachinePoolGetResponse) GetBody() (value *MachinePool, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// MachinePoolUpdateRequest is the request for the 'update' method. +type MachinePoolUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *MachinePool +} + +// Parameter adds a query parameter. +func (r *MachinePoolUpdateRequest) Parameter(name string, value interface{}) *MachinePoolUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachinePoolUpdateRequest) Header(name string, value interface{}) *MachinePoolUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachinePoolUpdateRequest) Impersonate(user string) *MachinePoolUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *MachinePoolUpdateRequest) Body(value *MachinePool) *MachinePoolUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachinePoolUpdateRequest) Send() (result *MachinePoolUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachinePoolUpdateRequest) SendContext(ctx context.Context) (result *MachinePoolUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeMachinePoolUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachinePoolUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readMachinePoolUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// MachinePoolUpdateResponse is the response for the 'update' method. +type MachinePoolUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *MachinePool +} + +// Status returns the response status code. +func (r *MachinePoolUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachinePoolUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachinePoolUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *MachinePoolUpdateResponse) Body() *MachinePool { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *MachinePoolUpdateResponse) GetBody() (value *MachinePool, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_list_builder.go b/clustersmgmt/v2alpha1/machine_pool_list_builder.go new file mode 100644 index 00000000..0bd3b0f1 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolListBuilder contains the data and logic needed to build +// 'machine_pool' objects. +type MachinePoolListBuilder struct { + items []*MachinePoolBuilder +} + +// NewMachinePoolList creates a new builder of 'machine_pool' objects. +func NewMachinePoolList() *MachinePoolListBuilder { + return new(MachinePoolListBuilder) +} + +// Items sets the items of the list. +func (b *MachinePoolListBuilder) Items(values ...*MachinePoolBuilder) *MachinePoolListBuilder { + b.items = make([]*MachinePoolBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *MachinePoolListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *MachinePoolListBuilder) Copy(list *MachinePoolList) *MachinePoolListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*MachinePoolBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewMachinePool().Copy(v) + } + } + return b +} + +// Build creates a list of 'machine_pool' objects using the +// configuration stored in the builder. +func (b *MachinePoolListBuilder) Build() (list *MachinePoolList, err error) { + items := make([]*MachinePool, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(MachinePoolList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_list_type_json.go b/clustersmgmt/v2alpha1/machine_pool_list_type_json.go new file mode 100644 index 00000000..564e9f10 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachinePoolList writes a list of values of the 'machine_pool' type to +// the given writer. +func MarshalMachinePoolList(list []*MachinePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachinePoolList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachinePoolList writes a list of value of the 'machine_pool' type to +// the given stream. +func writeMachinePoolList(list []*MachinePool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeMachinePool(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalMachinePoolList reads a list of values of the 'machine_pool' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalMachinePoolList(source interface{}) (items []*MachinePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readMachinePoolList(iterator) + err = iterator.Error + return +} + +// readMachinePoolList reads list of values of the ”machine_pool' type from +// the given iterator. +func readMachinePoolList(iterator *jsoniter.Iterator) []*MachinePool { + list := []*MachinePool{} + for iterator.ReadArray() { + item := readMachinePool(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_pool_resource_json.go b/clustersmgmt/v2alpha1/machine_pool_resource_json.go new file mode 100644 index 00000000..3066a1d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeMachinePoolDeleteRequest(request *MachinePoolDeleteRequest, writer io.Writer) error { + return nil +} +func readMachinePoolDeleteResponse(response *MachinePoolDeleteResponse, reader io.Reader) error { + return nil +} +func writeMachinePoolGetRequest(request *MachinePoolGetRequest, writer io.Writer) error { + return nil +} +func readMachinePoolGetResponse(response *MachinePoolGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalMachinePool(reader) + return err +} +func writeMachinePoolUpdateRequest(request *MachinePoolUpdateRequest, writer io.Writer) error { + return MarshalMachinePool(request.body, writer) +} +func readMachinePoolUpdateResponse(response *MachinePoolUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalMachinePool(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/machine_pool_security_group_filter_builder.go b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_builder.go new file mode 100644 index 00000000..bc36a1a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolSecurityGroupFilterBuilder contains the data and logic needed to build 'machine_pool_security_group_filter' objects. +// +// Security Group Filter object, containing name of the filter tag and value of the filter tag +type MachinePoolSecurityGroupFilterBuilder struct { + bitmap_ uint32 + name string + value string +} + +// NewMachinePoolSecurityGroupFilter creates a new builder of 'machine_pool_security_group_filter' objects. +func NewMachinePoolSecurityGroupFilter() *MachinePoolSecurityGroupFilterBuilder { + return &MachinePoolSecurityGroupFilterBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *MachinePoolSecurityGroupFilterBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *MachinePoolSecurityGroupFilterBuilder) Name(value string) *MachinePoolSecurityGroupFilterBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *MachinePoolSecurityGroupFilterBuilder) Value(value string) *MachinePoolSecurityGroupFilterBuilder { + b.value = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *MachinePoolSecurityGroupFilterBuilder) Copy(object *MachinePoolSecurityGroupFilter) *MachinePoolSecurityGroupFilterBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + b.value = object.value + return b +} + +// Build creates a 'machine_pool_security_group_filter' object using the configuration stored in the builder. +func (b *MachinePoolSecurityGroupFilterBuilder) Build() (object *MachinePoolSecurityGroupFilter, err error) { + object = new(MachinePoolSecurityGroupFilter) + object.bitmap_ = b.bitmap_ + object.name = b.name + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_security_group_filter_list_builder.go b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_list_builder.go new file mode 100644 index 00000000..f7f03fc8 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolSecurityGroupFilterListBuilder contains the data and logic needed to build +// 'machine_pool_security_group_filter' objects. +type MachinePoolSecurityGroupFilterListBuilder struct { + items []*MachinePoolSecurityGroupFilterBuilder +} + +// NewMachinePoolSecurityGroupFilterList creates a new builder of 'machine_pool_security_group_filter' objects. +func NewMachinePoolSecurityGroupFilterList() *MachinePoolSecurityGroupFilterListBuilder { + return new(MachinePoolSecurityGroupFilterListBuilder) +} + +// Items sets the items of the list. +func (b *MachinePoolSecurityGroupFilterListBuilder) Items(values ...*MachinePoolSecurityGroupFilterBuilder) *MachinePoolSecurityGroupFilterListBuilder { + b.items = make([]*MachinePoolSecurityGroupFilterBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *MachinePoolSecurityGroupFilterListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *MachinePoolSecurityGroupFilterListBuilder) Copy(list *MachinePoolSecurityGroupFilterList) *MachinePoolSecurityGroupFilterListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*MachinePoolSecurityGroupFilterBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewMachinePoolSecurityGroupFilter().Copy(v) + } + } + return b +} + +// Build creates a list of 'machine_pool_security_group_filter' objects using the +// configuration stored in the builder. +func (b *MachinePoolSecurityGroupFilterListBuilder) Build() (list *MachinePoolSecurityGroupFilterList, err error) { + items := make([]*MachinePoolSecurityGroupFilter, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(MachinePoolSecurityGroupFilterList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/machine_pool_security_group_filter_list_type_json.go b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_list_type_json.go new file mode 100644 index 00000000..aa78458c --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachinePoolSecurityGroupFilterList writes a list of values of the 'machine_pool_security_group_filter' type to +// the given writer. +func MarshalMachinePoolSecurityGroupFilterList(list []*MachinePoolSecurityGroupFilter, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachinePoolSecurityGroupFilterList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachinePoolSecurityGroupFilterList writes a list of value of the 'machine_pool_security_group_filter' type to +// the given stream. +func writeMachinePoolSecurityGroupFilterList(list []*MachinePoolSecurityGroupFilter, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeMachinePoolSecurityGroupFilter(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalMachinePoolSecurityGroupFilterList reads a list of values of the 'machine_pool_security_group_filter' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalMachinePoolSecurityGroupFilterList(source interface{}) (items []*MachinePoolSecurityGroupFilter, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readMachinePoolSecurityGroupFilterList(iterator) + err = iterator.Error + return +} + +// readMachinePoolSecurityGroupFilterList reads list of values of the ”machine_pool_security_group_filter' type from +// the given iterator. +func readMachinePoolSecurityGroupFilterList(iterator *jsoniter.Iterator) []*MachinePoolSecurityGroupFilter { + list := []*MachinePoolSecurityGroupFilter{} + for iterator.ReadArray() { + item := readMachinePoolSecurityGroupFilter(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_pool_security_group_filter_type.go b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_type.go new file mode 100644 index 00000000..5f957aae --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_type.go @@ -0,0 +1,158 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolSecurityGroupFilter represents the values of the 'machine_pool_security_group_filter' type. +// +// Security Group Filter object, containing name of the filter tag and value of the filter tag +type MachinePoolSecurityGroupFilter struct { + bitmap_ uint32 + name string + value string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *MachinePoolSecurityGroupFilter) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *MachinePoolSecurityGroupFilter) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +func (o *MachinePoolSecurityGroupFilter) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *MachinePoolSecurityGroupFilter) Value() string { + if o != nil && o.bitmap_&2 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +func (o *MachinePoolSecurityGroupFilter) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.value + } + return +} + +// MachinePoolSecurityGroupFilterListKind is the name of the type used to represent list of objects of +// type 'machine_pool_security_group_filter'. +const MachinePoolSecurityGroupFilterListKind = "MachinePoolSecurityGroupFilterList" + +// MachinePoolSecurityGroupFilterListLinkKind is the name of the type used to represent links to list +// of objects of type 'machine_pool_security_group_filter'. +const MachinePoolSecurityGroupFilterListLinkKind = "MachinePoolSecurityGroupFilterListLink" + +// MachinePoolSecurityGroupFilterNilKind is the name of the type used to nil lists of objects of +// type 'machine_pool_security_group_filter'. +const MachinePoolSecurityGroupFilterListNilKind = "MachinePoolSecurityGroupFilterListNil" + +// MachinePoolSecurityGroupFilterList is a list of values of the 'machine_pool_security_group_filter' type. +type MachinePoolSecurityGroupFilterList struct { + href string + link bool + items []*MachinePoolSecurityGroupFilter +} + +// Len returns the length of the list. +func (l *MachinePoolSecurityGroupFilterList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *MachinePoolSecurityGroupFilterList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *MachinePoolSecurityGroupFilterList) Get(i int) *MachinePoolSecurityGroupFilter { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *MachinePoolSecurityGroupFilterList) Slice() []*MachinePoolSecurityGroupFilter { + var slice []*MachinePoolSecurityGroupFilter + if l == nil { + slice = make([]*MachinePoolSecurityGroupFilter, 0) + } else { + slice = make([]*MachinePoolSecurityGroupFilter, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *MachinePoolSecurityGroupFilterList) Each(f func(item *MachinePoolSecurityGroupFilter) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *MachinePoolSecurityGroupFilterList) Range(f func(index int, item *MachinePoolSecurityGroupFilter) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/machine_pool_security_group_filter_type_json.go b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_type_json.go new file mode 100644 index 00000000..b434de65 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_security_group_filter_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachinePoolSecurityGroupFilter writes a value of the 'machine_pool_security_group_filter' type to the given writer. +func MarshalMachinePoolSecurityGroupFilter(object *MachinePoolSecurityGroupFilter, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachinePoolSecurityGroupFilter(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachinePoolSecurityGroupFilter writes a value of the 'machine_pool_security_group_filter' type to the given stream. +func writeMachinePoolSecurityGroupFilter(object *MachinePoolSecurityGroupFilter, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalMachinePoolSecurityGroupFilter reads a value of the 'machine_pool_security_group_filter' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalMachinePoolSecurityGroupFilter(source interface{}) (object *MachinePoolSecurityGroupFilter, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readMachinePoolSecurityGroupFilter(iterator) + err = iterator.Error + return +} + +// readMachinePoolSecurityGroupFilter reads a value of the 'machine_pool_security_group_filter' type from the given iterator. +func readMachinePoolSecurityGroupFilter(iterator *jsoniter.Iterator) *MachinePoolSecurityGroupFilter { + object := &MachinePoolSecurityGroupFilter{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/machine_pool_type.go b/clustersmgmt/v2alpha1/machine_pool_type.go new file mode 100644 index 00000000..446c5d33 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_type.go @@ -0,0 +1,462 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachinePoolKind is the name of the type used to represent objects +// of type 'machine_pool'. +const MachinePoolKind = "MachinePool" + +// MachinePoolLinkKind is the name of the type used to represent links +// to objects of type 'machine_pool'. +const MachinePoolLinkKind = "MachinePoolLink" + +// MachinePoolNilKind is the name of the type used to nil references +// to objects of type 'machine_pool'. +const MachinePoolNilKind = "MachinePoolNil" + +// MachinePool represents the values of the 'machine_pool' type. +// +// Representation of a machine pool in a cluster. +type MachinePool struct { + bitmap_ uint32 + id string + href string + aws *AWSMachinePool + autoscaling *MachinePoolAutoscaling + availabilityZones []string + instanceType string + labels map[string]string + replicas int + rootVolume *RootVolume + securityGroupFilters []*MachinePoolSecurityGroupFilter + subnets []string + taints []*Taint +} + +// Kind returns the name of the type of the object. +func (o *MachinePool) Kind() string { + if o == nil { + return MachinePoolNilKind + } + if o.bitmap_&1 != 0 { + return MachinePoolLinkKind + } + return MachinePoolKind +} + +// Link returns true iif this is a link. +func (o *MachinePool) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *MachinePool) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *MachinePool) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *MachinePool) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *MachinePool) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *MachinePool) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AWS returns the value of the 'AWS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS specific parameters (Optional). +func (o *MachinePool) AWS() *AWSMachinePool { + if o != nil && o.bitmap_&8 != 0 { + return o.aws + } + return nil +} + +// GetAWS returns the value of the 'AWS' attribute and +// a flag indicating if the attribute has a value. +// +// AWS specific parameters (Optional). +func (o *MachinePool) GetAWS() (value *AWSMachinePool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.aws + } + return +} + +// Autoscaling returns the value of the 'autoscaling' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for auto-scaling the machine pool. +// Replicas and autoscaling cannot be used together. +func (o *MachinePool) Autoscaling() *MachinePoolAutoscaling { + if o != nil && o.bitmap_&16 != 0 { + return o.autoscaling + } + return nil +} + +// GetAutoscaling returns the value of the 'autoscaling' attribute and +// a flag indicating if the attribute has a value. +// +// Details for auto-scaling the machine pool. +// Replicas and autoscaling cannot be used together. +func (o *MachinePool) GetAutoscaling() (value *MachinePoolAutoscaling, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.autoscaling + } + return +} + +// AvailabilityZones returns the value of the 'availability_zones' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The availability zones upon which the nodes are created. +func (o *MachinePool) AvailabilityZones() []string { + if o != nil && o.bitmap_&32 != 0 { + return o.availabilityZones + } + return nil +} + +// GetAvailabilityZones returns the value of the 'availability_zones' attribute and +// a flag indicating if the attribute has a value. +// +// The availability zones upon which the nodes are created. +func (o *MachinePool) GetAvailabilityZones() (value []string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.availabilityZones + } + return +} + +// InstanceType returns the value of the 'instance_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The instance type of Nodes to create. +func (o *MachinePool) InstanceType() string { + if o != nil && o.bitmap_&64 != 0 { + return o.instanceType + } + return "" +} + +// GetInstanceType returns the value of the 'instance_type' attribute and +// a flag indicating if the attribute has a value. +// +// The instance type of Nodes to create. +func (o *MachinePool) GetInstanceType() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.instanceType + } + return +} + +// Labels returns the value of the 'labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The labels set on the Nodes created. +func (o *MachinePool) Labels() map[string]string { + if o != nil && o.bitmap_&128 != 0 { + return o.labels + } + return nil +} + +// GetLabels returns the value of the 'labels' attribute and +// a flag indicating if the attribute has a value. +// +// The labels set on the Nodes created. +func (o *MachinePool) GetLabels() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.labels + } + return +} + +// Replicas returns the value of the 'replicas' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The number of Machines (and Nodes) to create. +// Replicas and autoscaling cannot be used together. +func (o *MachinePool) Replicas() int { + if o != nil && o.bitmap_&256 != 0 { + return o.replicas + } + return 0 +} + +// GetReplicas returns the value of the 'replicas' attribute and +// a flag indicating if the attribute has a value. +// +// The number of Machines (and Nodes) to create. +// Replicas and autoscaling cannot be used together. +func (o *MachinePool) GetReplicas() (value int, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.replicas + } + return +} + +// RootVolume returns the value of the 'root_volume' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The machine root volume capabilities. +func (o *MachinePool) RootVolume() *RootVolume { + if o != nil && o.bitmap_&512 != 0 { + return o.rootVolume + } + return nil +} + +// GetRootVolume returns the value of the 'root_volume' attribute and +// a flag indicating if the attribute has a value. +// +// The machine root volume capabilities. +func (o *MachinePool) GetRootVolume() (value *RootVolume, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.rootVolume + } + return +} + +// SecurityGroupFilters returns the value of the 'security_group_filters' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of security groups to be applied to MachinePool (Optional) +func (o *MachinePool) SecurityGroupFilters() []*MachinePoolSecurityGroupFilter { + if o != nil && o.bitmap_&1024 != 0 { + return o.securityGroupFilters + } + return nil +} + +// GetSecurityGroupFilters returns the value of the 'security_group_filters' attribute and +// a flag indicating if the attribute has a value. +// +// List of security groups to be applied to MachinePool (Optional) +func (o *MachinePool) GetSecurityGroupFilters() (value []*MachinePoolSecurityGroupFilter, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.securityGroupFilters + } + return +} + +// Subnets returns the value of the 'subnets' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The subnets upon which the nodes are created. +func (o *MachinePool) Subnets() []string { + if o != nil && o.bitmap_&2048 != 0 { + return o.subnets + } + return nil +} + +// GetSubnets returns the value of the 'subnets' attribute and +// a flag indicating if the attribute has a value. +// +// The subnets upon which the nodes are created. +func (o *MachinePool) GetSubnets() (value []string, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.subnets + } + return +} + +// Taints returns the value of the 'taints' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The taints set on the Nodes created. +func (o *MachinePool) Taints() []*Taint { + if o != nil && o.bitmap_&4096 != 0 { + return o.taints + } + return nil +} + +// GetTaints returns the value of the 'taints' attribute and +// a flag indicating if the attribute has a value. +// +// The taints set on the Nodes created. +func (o *MachinePool) GetTaints() (value []*Taint, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.taints + } + return +} + +// MachinePoolListKind is the name of the type used to represent list of objects of +// type 'machine_pool'. +const MachinePoolListKind = "MachinePoolList" + +// MachinePoolListLinkKind is the name of the type used to represent links to list +// of objects of type 'machine_pool'. +const MachinePoolListLinkKind = "MachinePoolListLink" + +// MachinePoolNilKind is the name of the type used to nil lists of objects of +// type 'machine_pool'. +const MachinePoolListNilKind = "MachinePoolListNil" + +// MachinePoolList is a list of values of the 'machine_pool' type. +type MachinePoolList struct { + href string + link bool + items []*MachinePool +} + +// Kind returns the name of the type of the object. +func (l *MachinePoolList) Kind() string { + if l == nil { + return MachinePoolListNilKind + } + if l.link { + return MachinePoolListLinkKind + } + return MachinePoolListKind +} + +// Link returns true iif this is a link. +func (l *MachinePoolList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *MachinePoolList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *MachinePoolList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *MachinePoolList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *MachinePoolList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *MachinePoolList) Get(i int) *MachinePool { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *MachinePoolList) Slice() []*MachinePool { + var slice []*MachinePool + if l == nil { + slice = make([]*MachinePool, 0) + } else { + slice = make([]*MachinePool, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *MachinePoolList) Each(f func(item *MachinePool) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *MachinePoolList) Range(f func(index int, item *MachinePool) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/machine_pool_type_json.go b/clustersmgmt/v2alpha1/machine_pool_type_json.go new file mode 100644 index 00000000..aad2eb3b --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pool_type_json.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachinePool writes a value of the 'machine_pool' type to the given writer. +func MarshalMachinePool(object *MachinePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachinePool(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachinePool writes a value of the 'machine_pool' type to the given stream. +func writeMachinePool(object *MachinePool, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(MachinePoolLinkKind) + } else { + stream.WriteString(MachinePoolKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.aws != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws") + writeAWSMachinePool(object.aws, stream) + count++ + } + present_ = object.bitmap_&16 != 0 && object.autoscaling != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("autoscaling") + writeMachinePoolAutoscaling(object.autoscaling, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.availabilityZones != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zones") + writeStringList(object.availabilityZones, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("instance_type") + stream.WriteString(object.instanceType) + count++ + } + present_ = object.bitmap_&128 != 0 && object.labels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("labels") + if object.labels != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.labels)) + i := 0 + for key := range object.labels { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.labels[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("replicas") + stream.WriteInt(object.replicas) + count++ + } + present_ = object.bitmap_&512 != 0 && object.rootVolume != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("root_volume") + writeRootVolume(object.rootVolume, stream) + count++ + } + present_ = object.bitmap_&1024 != 0 && object.securityGroupFilters != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("security_group_filters") + writeMachinePoolSecurityGroupFilterList(object.securityGroupFilters, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.subnets != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnets") + writeStringList(object.subnets, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 && object.taints != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("taints") + writeTaintList(object.taints, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalMachinePool reads a value of the 'machine_pool' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalMachinePool(source interface{}) (object *MachinePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readMachinePool(iterator) + err = iterator.Error + return +} + +// readMachinePool reads a value of the 'machine_pool' type from the given iterator. +func readMachinePool(iterator *jsoniter.Iterator) *MachinePool { + object := &MachinePool{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == MachinePoolLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "aws": + value := readAWSMachinePool(iterator) + object.aws = value + object.bitmap_ |= 8 + case "autoscaling": + value := readMachinePoolAutoscaling(iterator) + object.autoscaling = value + object.bitmap_ |= 16 + case "availability_zones": + value := readStringList(iterator) + object.availabilityZones = value + object.bitmap_ |= 32 + case "instance_type": + value := iterator.ReadString() + object.instanceType = value + object.bitmap_ |= 64 + case "labels": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.labels = value + object.bitmap_ |= 128 + case "replicas": + value := iterator.ReadInt() + object.replicas = value + object.bitmap_ |= 256 + case "root_volume": + value := readRootVolume(iterator) + object.rootVolume = value + object.bitmap_ |= 512 + case "security_group_filters": + value := readMachinePoolSecurityGroupFilterList(iterator) + object.securityGroupFilters = value + object.bitmap_ |= 1024 + case "subnets": + value := readStringList(iterator) + object.subnets = value + object.bitmap_ |= 2048 + case "taints": + value := readTaintList(iterator) + object.taints = value + object.bitmap_ |= 4096 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/machine_pools_client.go b/clustersmgmt/v2alpha1/machine_pools_client.go new file mode 100644 index 00000000..4ac28419 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pools_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MachinePoolsClient is the client of the 'machine_pools' resource. +// +// Manages the collection of machine pools of a cluster. +type MachinePoolsClient struct { + transport http.RoundTripper + path string +} + +// NewMachinePoolsClient creates a new client for the 'machine_pools' +// resource using the given transport to send the requests and receive the +// responses. +func NewMachinePoolsClient(transport http.RoundTripper, path string) *MachinePoolsClient { + return &MachinePoolsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new machine pool to the cluster. +func (c *MachinePoolsClient) Add() *MachinePoolsAddRequest { + return &MachinePoolsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of machine pools. +func (c *MachinePoolsClient) List() *MachinePoolsListRequest { + return &MachinePoolsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// MachinePool returns the target 'machine_pool' resource for the given identifier. +// +// Reference to the service that manages a specific machine pool. +func (c *MachinePoolsClient) MachinePool(id string) *MachinePoolClient { + return NewMachinePoolClient( + c.transport, + path.Join(c.path, id), + ) +} + +// MachinePoolsAddRequest is the request for the 'add' method. +type MachinePoolsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *MachinePool +} + +// Parameter adds a query parameter. +func (r *MachinePoolsAddRequest) Parameter(name string, value interface{}) *MachinePoolsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachinePoolsAddRequest) Header(name string, value interface{}) *MachinePoolsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachinePoolsAddRequest) Impersonate(user string) *MachinePoolsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the machine pool +func (r *MachinePoolsAddRequest) Body(value *MachinePool) *MachinePoolsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachinePoolsAddRequest) Send() (result *MachinePoolsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachinePoolsAddRequest) SendContext(ctx context.Context) (result *MachinePoolsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeMachinePoolsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachinePoolsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readMachinePoolsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// MachinePoolsAddResponse is the response for the 'add' method. +type MachinePoolsAddResponse struct { + status int + header http.Header + err *errors.Error + body *MachinePool +} + +// Status returns the response status code. +func (r *MachinePoolsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachinePoolsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachinePoolsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the machine pool +func (r *MachinePoolsAddResponse) Body() *MachinePool { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the machine pool +func (r *MachinePoolsAddResponse) GetBody() (value *MachinePool, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// MachinePoolsListRequest is the request for the 'list' method. +type MachinePoolsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *MachinePoolsListRequest) Parameter(name string, value interface{}) *MachinePoolsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachinePoolsListRequest) Header(name string, value interface{}) *MachinePoolsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachinePoolsListRequest) Impersonate(user string) *MachinePoolsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *MachinePoolsListRequest) Page(value int) *MachinePoolsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *MachinePoolsListRequest) Size(value int) *MachinePoolsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachinePoolsListRequest) Send() (result *MachinePoolsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachinePoolsListRequest) SendContext(ctx context.Context) (result *MachinePoolsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachinePoolsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readMachinePoolsListResponse(result, reader) + if err != nil { + return + } + return +} + +// MachinePoolsListResponse is the response for the 'list' method. +type MachinePoolsListResponse struct { + status int + header http.Header + err *errors.Error + items *MachinePoolList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *MachinePoolsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachinePoolsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachinePoolsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of machine pools. +func (r *MachinePoolsListResponse) Items() *MachinePoolList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of machine pools. +func (r *MachinePoolsListResponse) GetItems() (value *MachinePoolList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *MachinePoolsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *MachinePoolsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *MachinePoolsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *MachinePoolsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *MachinePoolsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *MachinePoolsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/machine_pools_resource_json.go b/clustersmgmt/v2alpha1/machine_pools_resource_json.go new file mode 100644 index 00000000..4c7d3078 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_pools_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeMachinePoolsAddRequest(request *MachinePoolsAddRequest, writer io.Writer) error { + return MarshalMachinePool(request.body, writer) +} +func readMachinePoolsAddResponse(response *MachinePoolsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalMachinePool(reader) + return err +} +func writeMachinePoolsListRequest(request *MachinePoolsListRequest, writer io.Writer) error { + return nil +} +func readMachinePoolsListResponse(response *MachinePoolsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readMachinePoolList(iterator) + response.items = &MachinePoolList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/machine_type_builder.go b/clustersmgmt/v2alpha1/machine_type_builder.go new file mode 100644 index 00000000..b3ea52ad --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_builder.go @@ -0,0 +1,254 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachineTypeBuilder contains the data and logic needed to build 'machine_type' objects. +// +// Machine type. +type MachineTypeBuilder struct { + bitmap_ uint32 + id string + href string + cpu *ValueBuilder + architecture ProcessorType + category MachineTypeCategory + cloudProvider *CloudProviderBuilder + genericName string + memory *ValueBuilder + name string + size MachineTypeSize + ccsOnly bool +} + +// NewMachineType creates a new builder of 'machine_type' objects. +func NewMachineType() *MachineTypeBuilder { + return &MachineTypeBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *MachineTypeBuilder) Link(value bool) *MachineTypeBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *MachineTypeBuilder) ID(value string) *MachineTypeBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *MachineTypeBuilder) HREF(value string) *MachineTypeBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *MachineTypeBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// CCSOnly sets the value of the 'CCS_only' attribute to the given value. +func (b *MachineTypeBuilder) CCSOnly(value bool) *MachineTypeBuilder { + b.ccsOnly = value + b.bitmap_ |= 8 + return b +} + +// CPU sets the value of the 'CPU' attribute to the given value. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +func (b *MachineTypeBuilder) CPU(value *ValueBuilder) *MachineTypeBuilder { + b.cpu = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Architecture sets the value of the 'architecture' attribute to the given value. +// +// Processor type category. +func (b *MachineTypeBuilder) Architecture(value ProcessorType) *MachineTypeBuilder { + b.architecture = value + b.bitmap_ |= 32 + return b +} + +// Category sets the value of the 'category' attribute to the given value. +// +// Machine type category. +func (b *MachineTypeBuilder) Category(value MachineTypeCategory) *MachineTypeBuilder { + b.category = value + b.bitmap_ |= 64 + return b +} + +// CloudProvider sets the value of the 'cloud_provider' attribute to the given value. +// +// Cloud provider. +func (b *MachineTypeBuilder) CloudProvider(value *CloudProviderBuilder) *MachineTypeBuilder { + b.cloudProvider = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// GenericName sets the value of the 'generic_name' attribute to the given value. +func (b *MachineTypeBuilder) GenericName(value string) *MachineTypeBuilder { + b.genericName = value + b.bitmap_ |= 256 + return b +} + +// Memory sets the value of the 'memory' attribute to the given value. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +func (b *MachineTypeBuilder) Memory(value *ValueBuilder) *MachineTypeBuilder { + b.memory = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *MachineTypeBuilder) Name(value string) *MachineTypeBuilder { + b.name = value + b.bitmap_ |= 1024 + return b +} + +// Size sets the value of the 'size' attribute to the given value. +// +// Machine type size. +func (b *MachineTypeBuilder) Size(value MachineTypeSize) *MachineTypeBuilder { + b.size = value + b.bitmap_ |= 2048 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *MachineTypeBuilder) Copy(object *MachineType) *MachineTypeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.ccsOnly = object.ccsOnly + if object.cpu != nil { + b.cpu = NewValue().Copy(object.cpu) + } else { + b.cpu = nil + } + b.architecture = object.architecture + b.category = object.category + if object.cloudProvider != nil { + b.cloudProvider = NewCloudProvider().Copy(object.cloudProvider) + } else { + b.cloudProvider = nil + } + b.genericName = object.genericName + if object.memory != nil { + b.memory = NewValue().Copy(object.memory) + } else { + b.memory = nil + } + b.name = object.name + b.size = object.size + return b +} + +// Build creates a 'machine_type' object using the configuration stored in the builder. +func (b *MachineTypeBuilder) Build() (object *MachineType, err error) { + object = new(MachineType) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.ccsOnly = b.ccsOnly + if b.cpu != nil { + object.cpu, err = b.cpu.Build() + if err != nil { + return + } + } + object.architecture = b.architecture + object.category = b.category + if b.cloudProvider != nil { + object.cloudProvider, err = b.cloudProvider.Build() + if err != nil { + return + } + } + object.genericName = b.genericName + if b.memory != nil { + object.memory, err = b.memory.Build() + if err != nil { + return + } + } + object.name = b.name + object.size = b.size + return +} diff --git a/clustersmgmt/v2alpha1/machine_type_category_list_type_json.go b/clustersmgmt/v2alpha1/machine_type_category_list_type_json.go new file mode 100644 index 00000000..0462552e --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_category_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachineTypeCategoryList writes a list of values of the 'machine_type_category' type to +// the given writer. +func MarshalMachineTypeCategoryList(list []MachineTypeCategory, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachineTypeCategoryList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachineTypeCategoryList writes a list of value of the 'machine_type_category' type to +// the given stream. +func writeMachineTypeCategoryList(list []MachineTypeCategory, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalMachineTypeCategoryList reads a list of values of the 'machine_type_category' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalMachineTypeCategoryList(source interface{}) (items []MachineTypeCategory, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readMachineTypeCategoryList(iterator) + err = iterator.Error + return +} + +// readMachineTypeCategoryList reads list of values of the ”machine_type_category' type from +// the given iterator. +func readMachineTypeCategoryList(iterator *jsoniter.Iterator) []MachineTypeCategory { + list := []MachineTypeCategory{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := MachineTypeCategory(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_type_category_type.go b/clustersmgmt/v2alpha1/machine_type_category_type.go new file mode 100644 index 00000000..9d72c214 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_category_type.go @@ -0,0 +1,34 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachineTypeCategory represents the values of the 'machine_type_category' enumerated type. +type MachineTypeCategory string + +const ( + // Accelerated Computing machine type. + MachineTypeCategoryAcceleratedComputing MachineTypeCategory = "accelerated_computing" + // Compute Optimized machine type. + MachineTypeCategoryComputeOptimized MachineTypeCategory = "compute_optimized" + // General Purpose machine type. + MachineTypeCategoryGeneralPurpose MachineTypeCategory = "general_purpose" + // Memory Optimized machine type. + MachineTypeCategoryMemoryOptimized MachineTypeCategory = "memory_optimized" +) diff --git a/clustersmgmt/v2alpha1/machine_type_client.go b/clustersmgmt/v2alpha1/machine_type_client.go new file mode 100644 index 00000000..83298dea --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MachineTypeClient is the client of the 'machine_type' resource. +// +// Manages a specific machine type. +type MachineTypeClient struct { + transport http.RoundTripper + path string +} + +// NewMachineTypeClient creates a new client for the 'machine_type' +// resource using the given transport to send the requests and receive the +// responses. +func NewMachineTypeClient(transport http.RoundTripper, path string) *MachineTypeClient { + return &MachineTypeClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the machine type. +func (c *MachineTypeClient) Get() *MachineTypeGetRequest { + return &MachineTypeGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// MachineTypePollRequest is the request for the Poll method. +type MachineTypePollRequest struct { + request *MachineTypeGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *MachineTypePollRequest) Parameter(name string, value interface{}) *MachineTypePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *MachineTypePollRequest) Header(name string, value interface{}) *MachineTypePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *MachineTypePollRequest) Interval(value time.Duration) *MachineTypePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *MachineTypePollRequest) Status(value int) *MachineTypePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *MachineTypePollRequest) Predicate(value func(*MachineTypeGetResponse) bool) *MachineTypePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*MachineTypeGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *MachineTypePollRequest) StartContext(ctx context.Context) (response *MachineTypePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &MachineTypePollResponse{ + response: result.(*MachineTypeGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *MachineTypePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// MachineTypePollResponse is the response for the Poll method. +type MachineTypePollResponse struct { + response *MachineTypeGetResponse +} + +// Status returns the response status code. +func (r *MachineTypePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *MachineTypePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *MachineTypePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *MachineTypePollResponse) Body() *MachineType { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *MachineTypePollResponse) GetBody() (value *MachineType, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *MachineTypeClient) Poll() *MachineTypePollRequest { + return &MachineTypePollRequest{ + request: c.Get(), + } +} + +// MachineTypeGetRequest is the request for the 'get' method. +type MachineTypeGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *MachineTypeGetRequest) Parameter(name string, value interface{}) *MachineTypeGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachineTypeGetRequest) Header(name string, value interface{}) *MachineTypeGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachineTypeGetRequest) Impersonate(user string) *MachineTypeGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachineTypeGetRequest) Send() (result *MachineTypeGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachineTypeGetRequest) SendContext(ctx context.Context) (result *MachineTypeGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachineTypeGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readMachineTypeGetResponse(result, reader) + if err != nil { + return + } + return +} + +// MachineTypeGetResponse is the response for the 'get' method. +type MachineTypeGetResponse struct { + status int + header http.Header + err *errors.Error + body *MachineType +} + +// Status returns the response status code. +func (r *MachineTypeGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachineTypeGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachineTypeGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *MachineTypeGetResponse) Body() *MachineType { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *MachineTypeGetResponse) GetBody() (value *MachineType, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/machine_type_list_builder.go b/clustersmgmt/v2alpha1/machine_type_list_builder.go new file mode 100644 index 00000000..4ed11e60 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachineTypeListBuilder contains the data and logic needed to build +// 'machine_type' objects. +type MachineTypeListBuilder struct { + items []*MachineTypeBuilder +} + +// NewMachineTypeList creates a new builder of 'machine_type' objects. +func NewMachineTypeList() *MachineTypeListBuilder { + return new(MachineTypeListBuilder) +} + +// Items sets the items of the list. +func (b *MachineTypeListBuilder) Items(values ...*MachineTypeBuilder) *MachineTypeListBuilder { + b.items = make([]*MachineTypeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *MachineTypeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *MachineTypeListBuilder) Copy(list *MachineTypeList) *MachineTypeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*MachineTypeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewMachineType().Copy(v) + } + } + return b +} + +// Build creates a list of 'machine_type' objects using the +// configuration stored in the builder. +func (b *MachineTypeListBuilder) Build() (list *MachineTypeList, err error) { + items := make([]*MachineType, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(MachineTypeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/machine_type_list_type_json.go b/clustersmgmt/v2alpha1/machine_type_list_type_json.go new file mode 100644 index 00000000..0ff424e0 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachineTypeList writes a list of values of the 'machine_type' type to +// the given writer. +func MarshalMachineTypeList(list []*MachineType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachineTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachineTypeList writes a list of value of the 'machine_type' type to +// the given stream. +func writeMachineTypeList(list []*MachineType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeMachineType(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalMachineTypeList reads a list of values of the 'machine_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalMachineTypeList(source interface{}) (items []*MachineType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readMachineTypeList(iterator) + err = iterator.Error + return +} + +// readMachineTypeList reads list of values of the ”machine_type' type from +// the given iterator. +func readMachineTypeList(iterator *jsoniter.Iterator) []*MachineType { + list := []*MachineType{} + for iterator.ReadArray() { + item := readMachineType(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_type_resource_json.go b/clustersmgmt/v2alpha1/machine_type_resource_json.go new file mode 100644 index 00000000..a416899d --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeMachineTypeGetRequest(request *MachineTypeGetRequest, writer io.Writer) error { + return nil +} +func readMachineTypeGetResponse(response *MachineTypeGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalMachineType(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/machine_type_size_list_type_json.go b/clustersmgmt/v2alpha1/machine_type_size_list_type_json.go new file mode 100644 index 00000000..a947a4e9 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_size_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachineTypeSizeList writes a list of values of the 'machine_type_size' type to +// the given writer. +func MarshalMachineTypeSizeList(list []MachineTypeSize, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachineTypeSizeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachineTypeSizeList writes a list of value of the 'machine_type_size' type to +// the given stream. +func writeMachineTypeSizeList(list []MachineTypeSize, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalMachineTypeSizeList reads a list of values of the 'machine_type_size' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalMachineTypeSizeList(source interface{}) (items []MachineTypeSize, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readMachineTypeSizeList(iterator) + err = iterator.Error + return +} + +// readMachineTypeSizeList reads list of values of the ”machine_type_size' type from +// the given iterator. +func readMachineTypeSizeList(iterator *jsoniter.Iterator) []MachineTypeSize { + list := []MachineTypeSize{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := MachineTypeSize(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/machine_type_size_type.go b/clustersmgmt/v2alpha1/machine_type_size_type.go new file mode 100644 index 00000000..56c0444a --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_size_type.go @@ -0,0 +1,32 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachineTypeSize represents the values of the 'machine_type_size' enumerated type. +type MachineTypeSize string + +const ( + // Large machine type (e.g. c5.4xlarge, custom-16-65536) + MachineTypeSizeLarge MachineTypeSize = "large" + // Medium machine type (e.g. r5.2xlarge, custom-8-32768) + MachineTypeSizeMedium MachineTypeSize = "medium" + // Small machine type (e.g. m5.xlarge, custom-4-16384) + MachineTypeSizeSmall MachineTypeSize = "small" +) diff --git a/clustersmgmt/v2alpha1/machine_type_type.go b/clustersmgmt/v2alpha1/machine_type_type.go new file mode 100644 index 00000000..d1714de0 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_type.go @@ -0,0 +1,440 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// MachineTypeKind is the name of the type used to represent objects +// of type 'machine_type'. +const MachineTypeKind = "MachineType" + +// MachineTypeLinkKind is the name of the type used to represent links +// to objects of type 'machine_type'. +const MachineTypeLinkKind = "MachineTypeLink" + +// MachineTypeNilKind is the name of the type used to nil references +// to objects of type 'machine_type'. +const MachineTypeNilKind = "MachineTypeNil" + +// MachineType represents the values of the 'machine_type' type. +// +// Machine type. +type MachineType struct { + bitmap_ uint32 + id string + href string + cpu *Value + architecture ProcessorType + category MachineTypeCategory + cloudProvider *CloudProvider + genericName string + memory *Value + name string + size MachineTypeSize + ccsOnly bool +} + +// Kind returns the name of the type of the object. +func (o *MachineType) Kind() string { + if o == nil { + return MachineTypeNilKind + } + if o.bitmap_&1 != 0 { + return MachineTypeLinkKind + } + return MachineTypeKind +} + +// Link returns true iif this is a link. +func (o *MachineType) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *MachineType) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *MachineType) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *MachineType) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *MachineType) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *MachineType) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// CCSOnly returns the value of the 'CCS_only' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// 'true' if the instance type is supported only for CCS clusters, 'false' otherwise. +func (o *MachineType) CCSOnly() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.ccsOnly + } + return false +} + +// GetCCSOnly returns the value of the 'CCS_only' attribute and +// a flag indicating if the attribute has a value. +// +// 'true' if the instance type is supported only for CCS clusters, 'false' otherwise. +func (o *MachineType) GetCCSOnly() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.ccsOnly + } + return +} + +// CPU returns the value of the 'CPU' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The amount of cpu's of the machine type. +func (o *MachineType) CPU() *Value { + if o != nil && o.bitmap_&16 != 0 { + return o.cpu + } + return nil +} + +// GetCPU returns the value of the 'CPU' attribute and +// a flag indicating if the attribute has a value. +// +// The amount of cpu's of the machine type. +func (o *MachineType) GetCPU() (value *Value, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.cpu + } + return +} + +// Architecture returns the value of the 'architecture' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The architecture of the machine type. +func (o *MachineType) Architecture() ProcessorType { + if o != nil && o.bitmap_&32 != 0 { + return o.architecture + } + return ProcessorType("") +} + +// GetArchitecture returns the value of the 'architecture' attribute and +// a flag indicating if the attribute has a value. +// +// The architecture of the machine type. +func (o *MachineType) GetArchitecture() (value ProcessorType, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.architecture + } + return +} + +// Category returns the value of the 'category' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The category which the machine type is suitable for. +func (o *MachineType) Category() MachineTypeCategory { + if o != nil && o.bitmap_&64 != 0 { + return o.category + } + return MachineTypeCategory("") +} + +// GetCategory returns the value of the 'category' attribute and +// a flag indicating if the attribute has a value. +// +// The category which the machine type is suitable for. +func (o *MachineType) GetCategory() (value MachineTypeCategory, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.category + } + return +} + +// CloudProvider returns the value of the 'cloud_provider' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Link to the cloud provider that the machine type belongs to. +func (o *MachineType) CloudProvider() *CloudProvider { + if o != nil && o.bitmap_&128 != 0 { + return o.cloudProvider + } + return nil +} + +// GetCloudProvider returns the value of the 'cloud_provider' attribute and +// a flag indicating if the attribute has a value. +// +// Link to the cloud provider that the machine type belongs to. +func (o *MachineType) GetCloudProvider() (value *CloudProvider, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.cloudProvider + } + return +} + +// GenericName returns the value of the 'generic_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Generic name for quota purposes, for example `highmem-4`. +// Cloud provider agnostic - many values are shared between "similar" +// machine types on different providers. +// Corresponds to `resource_name` values in "compute.node" quota cost data. +func (o *MachineType) GenericName() string { + if o != nil && o.bitmap_&256 != 0 { + return o.genericName + } + return "" +} + +// GetGenericName returns the value of the 'generic_name' attribute and +// a flag indicating if the attribute has a value. +// +// Generic name for quota purposes, for example `highmem-4`. +// Cloud provider agnostic - many values are shared between "similar" +// machine types on different providers. +// Corresponds to `resource_name` values in "compute.node" quota cost data. +func (o *MachineType) GetGenericName() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.genericName + } + return +} + +// Memory returns the value of the 'memory' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The amount of memory of the machine type. +func (o *MachineType) Memory() *Value { + if o != nil && o.bitmap_&512 != 0 { + return o.memory + } + return nil +} + +// GetMemory returns the value of the 'memory' attribute and +// a flag indicating if the attribute has a value. +// +// The amount of memory of the machine type. +func (o *MachineType) GetMemory() (value *Value, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.memory + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Human friendly identifier of the machine type, for example `r5.xlarge - Memory Optimized`. +func (o *MachineType) Name() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Human friendly identifier of the machine type, for example `r5.xlarge - Memory Optimized`. +func (o *MachineType) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.name + } + return +} + +// Size returns the value of the 'size' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The size of the machine type. +func (o *MachineType) Size() MachineTypeSize { + if o != nil && o.bitmap_&2048 != 0 { + return o.size + } + return MachineTypeSize("") +} + +// GetSize returns the value of the 'size' attribute and +// a flag indicating if the attribute has a value. +// +// The size of the machine type. +func (o *MachineType) GetSize() (value MachineTypeSize, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.size + } + return +} + +// MachineTypeListKind is the name of the type used to represent list of objects of +// type 'machine_type'. +const MachineTypeListKind = "MachineTypeList" + +// MachineTypeListLinkKind is the name of the type used to represent links to list +// of objects of type 'machine_type'. +const MachineTypeListLinkKind = "MachineTypeListLink" + +// MachineTypeNilKind is the name of the type used to nil lists of objects of +// type 'machine_type'. +const MachineTypeListNilKind = "MachineTypeListNil" + +// MachineTypeList is a list of values of the 'machine_type' type. +type MachineTypeList struct { + href string + link bool + items []*MachineType +} + +// Kind returns the name of the type of the object. +func (l *MachineTypeList) Kind() string { + if l == nil { + return MachineTypeListNilKind + } + if l.link { + return MachineTypeListLinkKind + } + return MachineTypeListKind +} + +// Link returns true iif this is a link. +func (l *MachineTypeList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *MachineTypeList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *MachineTypeList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *MachineTypeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *MachineTypeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *MachineTypeList) Get(i int) *MachineType { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *MachineTypeList) Slice() []*MachineType { + var slice []*MachineType + if l == nil { + slice = make([]*MachineType, 0) + } else { + slice = make([]*MachineType, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *MachineTypeList) Each(f func(item *MachineType) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *MachineTypeList) Range(f func(index int, item *MachineType) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/machine_type_type_json.go b/clustersmgmt/v2alpha1/machine_type_type_json.go new file mode 100644 index 00000000..0b5afbf0 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_type_type_json.go @@ -0,0 +1,227 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMachineType writes a value of the 'machine_type' type to the given writer. +func MarshalMachineType(object *MachineType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMachineType(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeMachineType writes a value of the 'machine_type' type to the given stream. +func writeMachineType(object *MachineType, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(MachineTypeLinkKind) + } else { + stream.WriteString(MachineTypeKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ccs_only") + stream.WriteBool(object.ccsOnly) + count++ + } + present_ = object.bitmap_&16 != 0 && object.cpu != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cpu") + writeValue(object.cpu, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("architecture") + stream.WriteString(string(object.architecture)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("category") + stream.WriteString(string(object.category)) + count++ + } + present_ = object.bitmap_&128 != 0 && object.cloudProvider != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cloud_provider") + writeCloudProvider(object.cloudProvider, stream) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("generic_name") + stream.WriteString(object.genericName) + count++ + } + present_ = object.bitmap_&512 != 0 && object.memory != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("memory") + writeValue(object.memory, stream) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("size") + stream.WriteString(string(object.size)) + } + stream.WriteObjectEnd() +} + +// UnmarshalMachineType reads a value of the 'machine_type' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalMachineType(source interface{}) (object *MachineType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readMachineType(iterator) + err = iterator.Error + return +} + +// readMachineType reads a value of the 'machine_type' type from the given iterator. +func readMachineType(iterator *jsoniter.Iterator) *MachineType { + object := &MachineType{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == MachineTypeLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "ccs_only": + value := iterator.ReadBool() + object.ccsOnly = value + object.bitmap_ |= 8 + case "cpu": + value := readValue(iterator) + object.cpu = value + object.bitmap_ |= 16 + case "architecture": + text := iterator.ReadString() + value := ProcessorType(text) + object.architecture = value + object.bitmap_ |= 32 + case "category": + text := iterator.ReadString() + value := MachineTypeCategory(text) + object.category = value + object.bitmap_ |= 64 + case "cloud_provider": + value := readCloudProvider(iterator) + object.cloudProvider = value + object.bitmap_ |= 128 + case "generic_name": + value := iterator.ReadString() + object.genericName = value + object.bitmap_ |= 256 + case "memory": + value := readValue(iterator) + object.memory = value + object.bitmap_ |= 512 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1024 + case "size": + text := iterator.ReadString() + value := MachineTypeSize(text) + object.size = value + object.bitmap_ |= 2048 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/machine_types_client.go b/clustersmgmt/v2alpha1/machine_types_client.go new file mode 100644 index 00000000..8f9c3f25 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_types_client.go @@ -0,0 +1,347 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MachineTypesClient is the client of the 'machine_types' resource. +// +// Manages machine types. +type MachineTypesClient struct { + transport http.RoundTripper + path string +} + +// NewMachineTypesClient creates a new client for the 'machine_types' +// resource using the given transport to send the requests and receive the +// responses. +func NewMachineTypesClient(transport http.RoundTripper, path string) *MachineTypesClient { + return &MachineTypesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of machine types. +func (c *MachineTypesClient) List() *MachineTypesListRequest { + return &MachineTypesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// MachineType returns the target 'machine_type' resource for the given identifier. +// +// Returns a reference to the service that manages an specific MachineType. +func (c *MachineTypesClient) MachineType(id string) *MachineTypeClient { + return NewMachineTypeClient( + c.transport, + path.Join(c.path, id), + ) +} + +// MachineTypesListRequest is the request for the 'list' method. +type MachineTypesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *MachineTypesListRequest) Parameter(name string, value interface{}) *MachineTypesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MachineTypesListRequest) Header(name string, value interface{}) *MachineTypesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *MachineTypesListRequest) Impersonate(user string) *MachineTypesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the machine type +// instead of the names of the columns of a table. For example, in order to sort the +// machine types descending by name identifier the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *MachineTypesListRequest) Order(value string) *MachineTypesListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *MachineTypesListRequest) Page(value int) *MachineTypesListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the machine type +// instead of the names of the columns of a table. For example, in order to retrieve +// all the machine types with a name starting with `A` the value should be: +// +// ```sql +// name like 'A%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the machine +// types that the user has permission to see will be returned. +func (r *MachineTypesListRequest) Search(value string) *MachineTypesListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *MachineTypesListRequest) Size(value int) *MachineTypesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MachineTypesListRequest) Send() (result *MachineTypesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *MachineTypesListRequest) SendContext(ctx context.Context) (result *MachineTypesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MachineTypesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readMachineTypesListResponse(result, reader) + if err != nil { + return + } + return +} + +// MachineTypesListResponse is the response for the 'list' method. +type MachineTypesListResponse struct { + status int + header http.Header + err *errors.Error + items *MachineTypeList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *MachineTypesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MachineTypesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MachineTypesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of cloud providers. +func (r *MachineTypesListResponse) Items() *MachineTypeList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of cloud providers. +func (r *MachineTypesListResponse) GetItems() (value *MachineTypeList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *MachineTypesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *MachineTypesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *MachineTypesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *MachineTypesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *MachineTypesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *MachineTypesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/machine_types_resource_json.go b/clustersmgmt/v2alpha1/machine_types_resource_json.go new file mode 100644 index 00000000..a2aa71d4 --- /dev/null +++ b/clustersmgmt/v2alpha1/machine_types_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeMachineTypesListRequest(request *MachineTypesListRequest, writer io.Writer) error { + return nil +} +func readMachineTypesListResponse(response *MachineTypesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readMachineTypeList(iterator) + response.items = &MachineTypeList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/managed_service_builder.go b/clustersmgmt/v2alpha1/managed_service_builder.go new file mode 100644 index 00000000..4b56fe29 --- /dev/null +++ b/clustersmgmt/v2alpha1/managed_service_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ManagedServiceBuilder contains the data and logic needed to build 'managed_service' objects. +// +// Contains the necessary attributes to support role-based authentication on AWS. +type ManagedServiceBuilder struct { + bitmap_ uint32 + enabled bool +} + +// NewManagedService creates a new builder of 'managed_service' objects. +func NewManagedService() *ManagedServiceBuilder { + return &ManagedServiceBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ManagedServiceBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *ManagedServiceBuilder) Enabled(value bool) *ManagedServiceBuilder { + b.enabled = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ManagedServiceBuilder) Copy(object *ManagedService) *ManagedServiceBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.enabled = object.enabled + return b +} + +// Build creates a 'managed_service' object using the configuration stored in the builder. +func (b *ManagedServiceBuilder) Build() (object *ManagedService, err error) { + object = new(ManagedService) + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + return +} diff --git a/clustersmgmt/v2alpha1/managed_service_list_builder.go b/clustersmgmt/v2alpha1/managed_service_list_builder.go new file mode 100644 index 00000000..48c6c695 --- /dev/null +++ b/clustersmgmt/v2alpha1/managed_service_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ManagedServiceListBuilder contains the data and logic needed to build +// 'managed_service' objects. +type ManagedServiceListBuilder struct { + items []*ManagedServiceBuilder +} + +// NewManagedServiceList creates a new builder of 'managed_service' objects. +func NewManagedServiceList() *ManagedServiceListBuilder { + return new(ManagedServiceListBuilder) +} + +// Items sets the items of the list. +func (b *ManagedServiceListBuilder) Items(values ...*ManagedServiceBuilder) *ManagedServiceListBuilder { + b.items = make([]*ManagedServiceBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ManagedServiceListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ManagedServiceListBuilder) Copy(list *ManagedServiceList) *ManagedServiceListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ManagedServiceBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewManagedService().Copy(v) + } + } + return b +} + +// Build creates a list of 'managed_service' objects using the +// configuration stored in the builder. +func (b *ManagedServiceListBuilder) Build() (list *ManagedServiceList, err error) { + items := make([]*ManagedService, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ManagedServiceList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/managed_service_list_type_json.go b/clustersmgmt/v2alpha1/managed_service_list_type_json.go new file mode 100644 index 00000000..0fbaf917 --- /dev/null +++ b/clustersmgmt/v2alpha1/managed_service_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalManagedServiceList writes a list of values of the 'managed_service' type to +// the given writer. +func MarshalManagedServiceList(list []*ManagedService, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeManagedServiceList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeManagedServiceList writes a list of value of the 'managed_service' type to +// the given stream. +func writeManagedServiceList(list []*ManagedService, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeManagedService(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalManagedServiceList reads a list of values of the 'managed_service' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalManagedServiceList(source interface{}) (items []*ManagedService, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readManagedServiceList(iterator) + err = iterator.Error + return +} + +// readManagedServiceList reads list of values of the ”managed_service' type from +// the given iterator. +func readManagedServiceList(iterator *jsoniter.Iterator) []*ManagedService { + list := []*ManagedService{} + for iterator.ReadArray() { + item := readManagedService(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/managed_service_type.go b/clustersmgmt/v2alpha1/managed_service_type.go new file mode 100644 index 00000000..996dc323 --- /dev/null +++ b/clustersmgmt/v2alpha1/managed_service_type.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ManagedService represents the values of the 'managed_service' type. +// +// Contains the necessary attributes to support role-based authentication on AWS. +type ManagedService struct { + bitmap_ uint32 + enabled bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ManagedService) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates whether the cluster belongs to a managed service +// This should only be set by the "Managed Service" service. +// clusters with this set can only be modified by the "Managed Service" service. +func (o *ManagedService) Enabled() bool { + if o != nil && o.bitmap_&1 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates whether the cluster belongs to a managed service +// This should only be set by the "Managed Service" service. +// clusters with this set can only be modified by the "Managed Service" service. +func (o *ManagedService) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.enabled + } + return +} + +// ManagedServiceListKind is the name of the type used to represent list of objects of +// type 'managed_service'. +const ManagedServiceListKind = "ManagedServiceList" + +// ManagedServiceListLinkKind is the name of the type used to represent links to list +// of objects of type 'managed_service'. +const ManagedServiceListLinkKind = "ManagedServiceListLink" + +// ManagedServiceNilKind is the name of the type used to nil lists of objects of +// type 'managed_service'. +const ManagedServiceListNilKind = "ManagedServiceListNil" + +// ManagedServiceList is a list of values of the 'managed_service' type. +type ManagedServiceList struct { + href string + link bool + items []*ManagedService +} + +// Len returns the length of the list. +func (l *ManagedServiceList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ManagedServiceList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ManagedServiceList) Get(i int) *ManagedService { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ManagedServiceList) Slice() []*ManagedService { + var slice []*ManagedService + if l == nil { + slice = make([]*ManagedService, 0) + } else { + slice = make([]*ManagedService, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ManagedServiceList) Each(f func(item *ManagedService) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ManagedServiceList) Range(f func(index int, item *ManagedService) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/managed_service_type_json.go b/clustersmgmt/v2alpha1/managed_service_type_json.go new file mode 100644 index 00000000..28511706 --- /dev/null +++ b/clustersmgmt/v2alpha1/managed_service_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalManagedService writes a value of the 'managed_service' type to the given writer. +func MarshalManagedService(object *ManagedService, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeManagedService(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeManagedService writes a value of the 'managed_service' type to the given stream. +func writeManagedService(object *ManagedService, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + } + stream.WriteObjectEnd() +} + +// UnmarshalManagedService reads a value of the 'managed_service' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalManagedService(source interface{}) (object *ManagedService, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readManagedService(iterator) + err = iterator.Error + return +} + +// readManagedService reads a value of the 'managed_service' type from the given iterator. +func readManagedService(iterator *jsoniter.Iterator) *ManagedService { + object := &ManagedService{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/manifest_builder.go b/clustersmgmt/v2alpha1/manifest_builder.go new file mode 100644 index 00000000..4a0c5ec3 --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_builder.go @@ -0,0 +1,98 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ManifestBuilder contains the data and logic needed to build 'manifest' objects. +// +// Representation of a manifestwork. +type ManifestBuilder struct { + bitmap_ uint32 + id string + href string + workloads []interface{} +} + +// NewManifest creates a new builder of 'manifest' objects. +func NewManifest() *ManifestBuilder { + return &ManifestBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ManifestBuilder) Link(value bool) *ManifestBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ManifestBuilder) ID(value string) *ManifestBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ManifestBuilder) HREF(value string) *ManifestBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ManifestBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Workloads sets the value of the 'workloads' attribute to the given values. +func (b *ManifestBuilder) Workloads(values ...interface{}) *ManifestBuilder { + b.workloads = make([]interface{}, len(values)) + copy(b.workloads, values) + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ManifestBuilder) Copy(object *Manifest) *ManifestBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.workloads != nil { + b.workloads = make([]interface{}, len(object.workloads)) + copy(b.workloads, object.workloads) + } else { + b.workloads = nil + } + return b +} + +// Build creates a 'manifest' object using the configuration stored in the builder. +func (b *ManifestBuilder) Build() (object *Manifest, err error) { + object = new(Manifest) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.workloads != nil { + object.workloads = make([]interface{}, len(b.workloads)) + copy(object.workloads, b.workloads) + } + return +} diff --git a/clustersmgmt/v2alpha1/manifest_client.go b/clustersmgmt/v2alpha1/manifest_client.go new file mode 100644 index 00000000..9b3bff4e --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ManifestClient is the client of the 'manifest' resource. +// +// Manages a specific Manifest. +type ManifestClient struct { + transport http.RoundTripper + path string +} + +// NewManifestClient creates a new client for the 'manifest' +// resource using the given transport to send the requests and receive the +// responses. +func NewManifestClient(transport http.RoundTripper, path string) *ManifestClient { + return &ManifestClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the manifest. +func (c *ManifestClient) Delete() *ManifestDeleteRequest { + return &ManifestDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the manifest. +func (c *ManifestClient) Get() *ManifestGetRequest { + return &ManifestGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the manifest. +func (c *ManifestClient) Update() *ManifestUpdateRequest { + return &ManifestUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// ManifestPollRequest is the request for the Poll method. +type ManifestPollRequest struct { + request *ManifestGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ManifestPollRequest) Parameter(name string, value interface{}) *ManifestPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ManifestPollRequest) Header(name string, value interface{}) *ManifestPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ManifestPollRequest) Interval(value time.Duration) *ManifestPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ManifestPollRequest) Status(value int) *ManifestPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ManifestPollRequest) Predicate(value func(*ManifestGetResponse) bool) *ManifestPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ManifestGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ManifestPollRequest) StartContext(ctx context.Context) (response *ManifestPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ManifestPollResponse{ + response: result.(*ManifestGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ManifestPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ManifestPollResponse is the response for the Poll method. +type ManifestPollResponse struct { + response *ManifestGetResponse +} + +// Status returns the response status code. +func (r *ManifestPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ManifestPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ManifestPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ManifestPollResponse) Body() *Manifest { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ManifestPollResponse) GetBody() (value *Manifest, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ManifestClient) Poll() *ManifestPollRequest { + return &ManifestPollRequest{ + request: c.Get(), + } +} + +// ManifestDeleteRequest is the request for the 'delete' method. +type ManifestDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ManifestDeleteRequest) Parameter(name string, value interface{}) *ManifestDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ManifestDeleteRequest) Header(name string, value interface{}) *ManifestDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ManifestDeleteRequest) Impersonate(user string) *ManifestDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ManifestDeleteRequest) Send() (result *ManifestDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ManifestDeleteRequest) SendContext(ctx context.Context) (result *ManifestDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ManifestDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ManifestDeleteResponse is the response for the 'delete' method. +type ManifestDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ManifestDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ManifestDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ManifestDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ManifestGetRequest is the request for the 'get' method. +type ManifestGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ManifestGetRequest) Parameter(name string, value interface{}) *ManifestGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ManifestGetRequest) Header(name string, value interface{}) *ManifestGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ManifestGetRequest) Impersonate(user string) *ManifestGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ManifestGetRequest) Send() (result *ManifestGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ManifestGetRequest) SendContext(ctx context.Context) (result *ManifestGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ManifestGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readManifestGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ManifestGetResponse is the response for the 'get' method. +type ManifestGetResponse struct { + status int + header http.Header + err *errors.Error + body *Manifest +} + +// Status returns the response status code. +func (r *ManifestGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ManifestGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ManifestGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ManifestGetResponse) Body() *Manifest { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ManifestGetResponse) GetBody() (value *Manifest, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ManifestUpdateRequest is the request for the 'update' method. +type ManifestUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Manifest +} + +// Parameter adds a query parameter. +func (r *ManifestUpdateRequest) Parameter(name string, value interface{}) *ManifestUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ManifestUpdateRequest) Header(name string, value interface{}) *ManifestUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ManifestUpdateRequest) Impersonate(user string) *ManifestUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *ManifestUpdateRequest) Body(value *Manifest) *ManifestUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ManifestUpdateRequest) Send() (result *ManifestUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ManifestUpdateRequest) SendContext(ctx context.Context) (result *ManifestUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeManifestUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ManifestUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readManifestUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// ManifestUpdateResponse is the response for the 'update' method. +type ManifestUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Manifest +} + +// Status returns the response status code. +func (r *ManifestUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ManifestUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ManifestUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ManifestUpdateResponse) Body() *Manifest { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ManifestUpdateResponse) GetBody() (value *Manifest, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/manifest_list_builder.go b/clustersmgmt/v2alpha1/manifest_list_builder.go new file mode 100644 index 00000000..3683ef83 --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ManifestListBuilder contains the data and logic needed to build +// 'manifest' objects. +type ManifestListBuilder struct { + items []*ManifestBuilder +} + +// NewManifestList creates a new builder of 'manifest' objects. +func NewManifestList() *ManifestListBuilder { + return new(ManifestListBuilder) +} + +// Items sets the items of the list. +func (b *ManifestListBuilder) Items(values ...*ManifestBuilder) *ManifestListBuilder { + b.items = make([]*ManifestBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ManifestListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ManifestListBuilder) Copy(list *ManifestList) *ManifestListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ManifestBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewManifest().Copy(v) + } + } + return b +} + +// Build creates a list of 'manifest' objects using the +// configuration stored in the builder. +func (b *ManifestListBuilder) Build() (list *ManifestList, err error) { + items := make([]*Manifest, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ManifestList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/manifest_list_type_json.go b/clustersmgmt/v2alpha1/manifest_list_type_json.go new file mode 100644 index 00000000..2f9b96b9 --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalManifestList writes a list of values of the 'manifest' type to +// the given writer. +func MarshalManifestList(list []*Manifest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeManifestList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeManifestList writes a list of value of the 'manifest' type to +// the given stream. +func writeManifestList(list []*Manifest, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeManifest(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalManifestList reads a list of values of the 'manifest' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalManifestList(source interface{}) (items []*Manifest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readManifestList(iterator) + err = iterator.Error + return +} + +// readManifestList reads list of values of the ”manifest' type from +// the given iterator. +func readManifestList(iterator *jsoniter.Iterator) []*Manifest { + list := []*Manifest{} + for iterator.ReadArray() { + item := readManifest(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/manifest_resource_json.go b/clustersmgmt/v2alpha1/manifest_resource_json.go new file mode 100644 index 00000000..b4bdeb24 --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeManifestDeleteRequest(request *ManifestDeleteRequest, writer io.Writer) error { + return nil +} +func readManifestDeleteResponse(response *ManifestDeleteResponse, reader io.Reader) error { + return nil +} +func writeManifestGetRequest(request *ManifestGetRequest, writer io.Writer) error { + return nil +} +func readManifestGetResponse(response *ManifestGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalManifest(reader) + return err +} +func writeManifestUpdateRequest(request *ManifestUpdateRequest, writer io.Writer) error { + return MarshalManifest(request.body, writer) +} +func readManifestUpdateResponse(response *ManifestUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalManifest(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/manifest_type.go b/clustersmgmt/v2alpha1/manifest_type.go new file mode 100644 index 00000000..6e34fea9 --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ManifestKind is the name of the type used to represent objects +// of type 'manifest'. +const ManifestKind = "Manifest" + +// ManifestLinkKind is the name of the type used to represent links +// to objects of type 'manifest'. +const ManifestLinkKind = "ManifestLink" + +// ManifestNilKind is the name of the type used to nil references +// to objects of type 'manifest'. +const ManifestNilKind = "ManifestNil" + +// Manifest represents the values of the 'manifest' type. +// +// Representation of a manifestwork. +type Manifest struct { + bitmap_ uint32 + id string + href string + workloads []interface{} +} + +// Kind returns the name of the type of the object. +func (o *Manifest) Kind() string { + if o == nil { + return ManifestNilKind + } + if o.bitmap_&1 != 0 { + return ManifestLinkKind + } + return ManifestKind +} + +// Link returns true iif this is a link. +func (o *Manifest) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Manifest) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Manifest) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Manifest) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Manifest) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Manifest) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Workloads returns the value of the 'workloads' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of k8s objects to deploy on a hosted cluster. +func (o *Manifest) Workloads() []interface{} { + if o != nil && o.bitmap_&8 != 0 { + return o.workloads + } + return nil +} + +// GetWorkloads returns the value of the 'workloads' attribute and +// a flag indicating if the attribute has a value. +// +// List of k8s objects to deploy on a hosted cluster. +func (o *Manifest) GetWorkloads() (value []interface{}, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.workloads + } + return +} + +// ManifestListKind is the name of the type used to represent list of objects of +// type 'manifest'. +const ManifestListKind = "ManifestList" + +// ManifestListLinkKind is the name of the type used to represent links to list +// of objects of type 'manifest'. +const ManifestListLinkKind = "ManifestListLink" + +// ManifestNilKind is the name of the type used to nil lists of objects of +// type 'manifest'. +const ManifestListNilKind = "ManifestListNil" + +// ManifestList is a list of values of the 'manifest' type. +type ManifestList struct { + href string + link bool + items []*Manifest +} + +// Kind returns the name of the type of the object. +func (l *ManifestList) Kind() string { + if l == nil { + return ManifestListNilKind + } + if l.link { + return ManifestListLinkKind + } + return ManifestListKind +} + +// Link returns true iif this is a link. +func (l *ManifestList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ManifestList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ManifestList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ManifestList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ManifestList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ManifestList) Get(i int) *Manifest { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ManifestList) Slice() []*Manifest { + var slice []*Manifest + if l == nil { + slice = make([]*Manifest, 0) + } else { + slice = make([]*Manifest, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ManifestList) Each(f func(item *Manifest) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ManifestList) Range(f func(index int, item *Manifest) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/manifest_type_json.go b/clustersmgmt/v2alpha1/manifest_type_json.go new file mode 100644 index 00000000..423c2cef --- /dev/null +++ b/clustersmgmt/v2alpha1/manifest_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalManifest writes a value of the 'manifest' type to the given writer. +func MarshalManifest(object *Manifest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeManifest(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeManifest writes a value of the 'manifest' type to the given stream. +func writeManifest(object *Manifest, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ManifestLinkKind) + } else { + stream.WriteString(ManifestKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.workloads != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("workloads") + writeInterfaceList(object.workloads, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalManifest reads a value of the 'manifest' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalManifest(source interface{}) (object *Manifest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readManifest(iterator) + err = iterator.Error + return +} + +// readManifest reads a value of the 'manifest' type from the given iterator. +func readManifest(iterator *jsoniter.Iterator) *Manifest { + object := &Manifest{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ManifestLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "workloads": + value := readInterfaceList(iterator) + object.workloads = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/manifests_client.go b/clustersmgmt/v2alpha1/manifests_client.go new file mode 100644 index 00000000..a36fc38e --- /dev/null +++ b/clustersmgmt/v2alpha1/manifests_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ManifestsClient is the client of the 'manifests' resource. +// +// Manages the collection of Manifests of a cluster. +type ManifestsClient struct { + transport http.RoundTripper + path string +} + +// NewManifestsClient creates a new client for the 'manifests' +// resource using the given transport to send the requests and receive the +// responses. +func NewManifestsClient(transport http.RoundTripper, path string) *ManifestsClient { + return &ManifestsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new manifest to a cluster. +func (c *ManifestsClient) Add() *ManifestsAddRequest { + return &ManifestsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of manifests. +func (c *ManifestsClient) List() *ManifestsListRequest { + return &ManifestsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Manifest returns the target 'manifest' resource for the given identifier. +// +// Reference to the service that manages a specific manifest. +func (c *ManifestsClient) Manifest(id string) *ManifestClient { + return NewManifestClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ManifestsAddRequest is the request for the 'add' method. +type ManifestsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Manifest +} + +// Parameter adds a query parameter. +func (r *ManifestsAddRequest) Parameter(name string, value interface{}) *ManifestsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ManifestsAddRequest) Header(name string, value interface{}) *ManifestsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ManifestsAddRequest) Impersonate(user string) *ManifestsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the manifest. +func (r *ManifestsAddRequest) Body(value *Manifest) *ManifestsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ManifestsAddRequest) Send() (result *ManifestsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ManifestsAddRequest) SendContext(ctx context.Context) (result *ManifestsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeManifestsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ManifestsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readManifestsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// ManifestsAddResponse is the response for the 'add' method. +type ManifestsAddResponse struct { + status int + header http.Header + err *errors.Error + body *Manifest +} + +// Status returns the response status code. +func (r *ManifestsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ManifestsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ManifestsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the manifest. +func (r *ManifestsAddResponse) Body() *Manifest { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the manifest. +func (r *ManifestsAddResponse) GetBody() (value *Manifest, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ManifestsListRequest is the request for the 'list' method. +type ManifestsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *ManifestsListRequest) Parameter(name string, value interface{}) *ManifestsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ManifestsListRequest) Header(name string, value interface{}) *ManifestsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ManifestsListRequest) Impersonate(user string) *ManifestsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ManifestsListRequest) Page(value int) *ManifestsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *ManifestsListRequest) Size(value int) *ManifestsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ManifestsListRequest) Send() (result *ManifestsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ManifestsListRequest) SendContext(ctx context.Context) (result *ManifestsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ManifestsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readManifestsListResponse(result, reader) + if err != nil { + return + } + return +} + +// ManifestsListResponse is the response for the 'list' method. +type ManifestsListResponse struct { + status int + header http.Header + err *errors.Error + items *ManifestList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ManifestsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ManifestsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ManifestsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of Manifests. +func (r *ManifestsListResponse) Items() *ManifestList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of Manifests. +func (r *ManifestsListResponse) GetItems() (value *ManifestList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ManifestsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ManifestsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *ManifestsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *ManifestsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *ManifestsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *ManifestsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/manifests_resource_json.go b/clustersmgmt/v2alpha1/manifests_resource_json.go new file mode 100644 index 00000000..acf776e5 --- /dev/null +++ b/clustersmgmt/v2alpha1/manifests_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeManifestsAddRequest(request *ManifestsAddRequest, writer io.Writer) error { + return MarshalManifest(request.body, writer) +} +func readManifestsAddResponse(response *ManifestsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalManifest(reader) + return err +} +func writeManifestsListRequest(request *ManifestsListRequest, writer io.Writer) error { + return nil +} +func readManifestsListResponse(response *ManifestsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readManifestList(iterator) + response.items = &ManifestList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/metadata_client.go b/clustersmgmt/v2alpha1/metadata_client.go new file mode 100644 index 00000000..9f069df2 --- /dev/null +++ b/clustersmgmt/v2alpha1/metadata_client.go @@ -0,0 +1,141 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MetadataRequest is the request to retrieve the metadata. +type MetadataRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// MetadataResponse is the response for the metadata request. +type MetadataResponse struct { + status int + header http.Header + err *errors.Error + body *Metadata +} + +// Parameter adds a query parameter. +func (r *MetadataRequest) Parameter(name string, value interface{}) *MetadataRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *MetadataRequest) Header(name string, value interface{}) *MetadataRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Send sends the metadata request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *MetadataRequest) Send() (result *MetadataResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends the metadata request, waits for the response, and returns it. +func (r *MetadataRequest) SendContext(ctx context.Context) (result *MetadataResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: http.MethodGet, + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &MetadataResponse{ + status: response.StatusCode, + header: response.Header, + } + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + result.body, err = UnmarshalMetadata(reader) + if err != nil { + return + } + return +} + +// Status returns the response status code. +func (r *MetadataResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *MetadataResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *MetadataResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the response body. +func (r *MetadataResponse) Body() *Metadata { + return r.body +} diff --git a/clustersmgmt/v2alpha1/metadata_reader.go b/clustersmgmt/v2alpha1/metadata_reader.go new file mode 100644 index 00000000..4a8c55b6 --- /dev/null +++ b/clustersmgmt/v2alpha1/metadata_reader.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalMetadata writes a value of the metadata type to the given target, which +// can be a writer or a JSON encoder. +func MarshalMetadata(object *Metadata, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeMetadata(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} +func writeMetadata(object *Metadata, stream *jsoniter.Stream) { + stream.WriteObjectStart() + if object.bitmap_&1 != 0 { + stream.WriteObjectField("server_version") + stream.WriteString(object.serverVersion) + } + stream.WriteObjectEnd() +} + +// UnmarshalMetadata reads a value of the metadata type from the given source, which +// which can be a reader, a slice of byte or a string. +func UnmarshalMetadata(source interface{}) (object *Metadata, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readMetadata(iterator) + err = iterator.Error + return +} +func readMetadata(iterator *jsoniter.Iterator) *Metadata { + object := &Metadata{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "server_version": + object.serverVersion = iterator.ReadString() + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/metadata_type.go b/clustersmgmt/v2alpha1/metadata_type.go new file mode 100644 index 00000000..1ce0510b --- /dev/null +++ b/clustersmgmt/v2alpha1/metadata_type.go @@ -0,0 +1,44 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Metadata contains the version metadata. +type Metadata struct { + bitmap_ uint32 + serverVersion string +} + +// ServerVersion returns the version of the server. +func (m *Metadata) ServerVersion() string { + if m != nil && m.bitmap_&1 != 0 { + return m.serverVersion + } + return "" +} + +// GetServerVersion returns the value of the server version and a flag indicating if +// the attribute has a value. +func (m *Metadata) GetServerVersion() (value string, ok bool) { + ok = m != nil && m.bitmap_&1 != 0 + if ok { + value = m.serverVersion + } + return +} diff --git a/clustersmgmt/v2alpha1/metric_queries_client.go b/clustersmgmt/v2alpha1/metric_queries_client.go new file mode 100644 index 00000000..eda10800 --- /dev/null +++ b/clustersmgmt/v2alpha1/metric_queries_client.go @@ -0,0 +1,95 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "net/http" + "path" +) + +// MetricQueriesClient is the client of the 'metric_queries' resource. +// +// Manages telemetry queries for a cluster. +type MetricQueriesClient struct { + transport http.RoundTripper + path string +} + +// NewMetricQueriesClient creates a new client for the 'metric_queries' +// resource using the given transport to send the requests and receive the +// responses. +func NewMetricQueriesClient(transport http.RoundTripper, path string) *MetricQueriesClient { + return &MetricQueriesClient{ + transport: transport, + path: path, + } +} + +// CPUTotalByNodeRolesOS returns the target 'CPU_total_by_node_roles_OS_metric_query' resource. +// +// Reference to the resource that retrieves the total cpu +// capacity in the cluster by node role and operating system. +func (c *MetricQueriesClient) CPUTotalByNodeRolesOS() *CPUTotalByNodeRolesOSMetricQueryClient { + return NewCPUTotalByNodeRolesOSMetricQueryClient( + c.transport, + path.Join(c.path, "cpu_total_by_node_roles_os"), + ) +} + +// Alerts returns the target 'alerts_metric_query' resource. +// +// Reference to the resource that retrieves the firing alerts in the cluster. +func (c *MetricQueriesClient) Alerts() *AlertsMetricQueryClient { + return NewAlertsMetricQueryClient( + c.transport, + path.Join(c.path, "alerts"), + ) +} + +// ClusterOperators returns the target 'cluster_operators_metric_query' resource. +// +// Reference to the resource that retrieves the cluster operator status metrics. +func (c *MetricQueriesClient) ClusterOperators() *ClusterOperatorsMetricQueryClient { + return NewClusterOperatorsMetricQueryClient( + c.transport, + path.Join(c.path, "cluster_operators"), + ) +} + +// Nodes returns the target 'nodes_metric_query' resource. +// +// Reference to the resource that retrieves the nodes in the cluster. +func (c *MetricQueriesClient) Nodes() *NodesMetricQueryClient { + return NewNodesMetricQueryClient( + c.transport, + path.Join(c.path, "nodes"), + ) +} + +// SocketTotalByNodeRolesOS returns the target 'socket_total_by_node_roles_OS_metric_query' resource. +// +// Reference to the resource that retrieves the total socket +// capacity in the cluster by node role and operating system. +func (c *MetricQueriesClient) SocketTotalByNodeRolesOS() *SocketTotalByNodeRolesOSMetricQueryClient { + return NewSocketTotalByNodeRolesOSMetricQueryClient( + c.transport, + path.Join(c.path, "socket_total_by_node_roles_os"), + ) +} diff --git a/clustersmgmt/v2alpha1/metric_queries_resource_json.go b/clustersmgmt/v2alpha1/metric_queries_resource_json.go new file mode 100644 index 00000000..45f0dd4e --- /dev/null +++ b/clustersmgmt/v2alpha1/metric_queries_resource_json.go @@ -0,0 +1,20 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 diff --git a/clustersmgmt/v2alpha1/namespace_ownership_policy_list_type_json.go b/clustersmgmt/v2alpha1/namespace_ownership_policy_list_type_json.go new file mode 100644 index 00000000..c1d20e19 --- /dev/null +++ b/clustersmgmt/v2alpha1/namespace_ownership_policy_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNamespaceOwnershipPolicyList writes a list of values of the 'namespace_ownership_policy' type to +// the given writer. +func MarshalNamespaceOwnershipPolicyList(list []NamespaceOwnershipPolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNamespaceOwnershipPolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNamespaceOwnershipPolicyList writes a list of value of the 'namespace_ownership_policy' type to +// the given stream. +func writeNamespaceOwnershipPolicyList(list []NamespaceOwnershipPolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalNamespaceOwnershipPolicyList reads a list of values of the 'namespace_ownership_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNamespaceOwnershipPolicyList(source interface{}) (items []NamespaceOwnershipPolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNamespaceOwnershipPolicyList(iterator) + err = iterator.Error + return +} + +// readNamespaceOwnershipPolicyList reads list of values of the ”namespace_ownership_policy' type from +// the given iterator. +func readNamespaceOwnershipPolicyList(iterator *jsoniter.Iterator) []NamespaceOwnershipPolicy { + list := []NamespaceOwnershipPolicy{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := NamespaceOwnershipPolicy(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/namespace_ownership_policy_type.go b/clustersmgmt/v2alpha1/namespace_ownership_policy_type.go new file mode 100644 index 00000000..811824de --- /dev/null +++ b/clustersmgmt/v2alpha1/namespace_ownership_policy_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NamespaceOwnershipPolicy represents the values of the 'namespace_ownership_policy' enumerated type. +type NamespaceOwnershipPolicy string + +const ( + // InterNamespaceAllowed. + NamespaceOwnershipPolicyInterNamespaceAllowed NamespaceOwnershipPolicy = "InterNamespaceAllowed" + // Strict. + NamespaceOwnershipPolicyStrict NamespaceOwnershipPolicy = "Strict" +) diff --git a/clustersmgmt/v2alpha1/network_builder.go b/clustersmgmt/v2alpha1/network_builder.go new file mode 100644 index 00000000..ebaedab1 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_builder.go @@ -0,0 +1,103 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NetworkBuilder contains the data and logic needed to build 'network' objects. +// +// Network configuration of a cluster. +type NetworkBuilder struct { + bitmap_ uint32 + hostPrefix int + machineCIDR string + podCIDR string + serviceCIDR string + type_ string +} + +// NewNetwork creates a new builder of 'network' objects. +func NewNetwork() *NetworkBuilder { + return &NetworkBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NetworkBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// HostPrefix sets the value of the 'host_prefix' attribute to the given value. +func (b *NetworkBuilder) HostPrefix(value int) *NetworkBuilder { + b.hostPrefix = value + b.bitmap_ |= 1 + return b +} + +// MachineCIDR sets the value of the 'machine_CIDR' attribute to the given value. +func (b *NetworkBuilder) MachineCIDR(value string) *NetworkBuilder { + b.machineCIDR = value + b.bitmap_ |= 2 + return b +} + +// PodCIDR sets the value of the 'pod_CIDR' attribute to the given value. +func (b *NetworkBuilder) PodCIDR(value string) *NetworkBuilder { + b.podCIDR = value + b.bitmap_ |= 4 + return b +} + +// ServiceCIDR sets the value of the 'service_CIDR' attribute to the given value. +func (b *NetworkBuilder) ServiceCIDR(value string) *NetworkBuilder { + b.serviceCIDR = value + b.bitmap_ |= 8 + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *NetworkBuilder) Type(value string) *NetworkBuilder { + b.type_ = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NetworkBuilder) Copy(object *Network) *NetworkBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.hostPrefix = object.hostPrefix + b.machineCIDR = object.machineCIDR + b.podCIDR = object.podCIDR + b.serviceCIDR = object.serviceCIDR + b.type_ = object.type_ + return b +} + +// Build creates a 'network' object using the configuration stored in the builder. +func (b *NetworkBuilder) Build() (object *Network, err error) { + object = new(Network) + object.bitmap_ = b.bitmap_ + object.hostPrefix = b.hostPrefix + object.machineCIDR = b.machineCIDR + object.podCIDR = b.podCIDR + object.serviceCIDR = b.serviceCIDR + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/network_list_builder.go b/clustersmgmt/v2alpha1/network_list_builder.go new file mode 100644 index 00000000..d1683163 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NetworkListBuilder contains the data and logic needed to build +// 'network' objects. +type NetworkListBuilder struct { + items []*NetworkBuilder +} + +// NewNetworkList creates a new builder of 'network' objects. +func NewNetworkList() *NetworkListBuilder { + return new(NetworkListBuilder) +} + +// Items sets the items of the list. +func (b *NetworkListBuilder) Items(values ...*NetworkBuilder) *NetworkListBuilder { + b.items = make([]*NetworkBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NetworkListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NetworkListBuilder) Copy(list *NetworkList) *NetworkListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NetworkBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNetwork().Copy(v) + } + } + return b +} + +// Build creates a list of 'network' objects using the +// configuration stored in the builder. +func (b *NetworkListBuilder) Build() (list *NetworkList, err error) { + items := make([]*Network, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NetworkList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/network_list_type_json.go b/clustersmgmt/v2alpha1/network_list_type_json.go new file mode 100644 index 00000000..5fcd1a34 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNetworkList writes a list of values of the 'network' type to +// the given writer. +func MarshalNetworkList(list []*Network, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNetworkList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNetworkList writes a list of value of the 'network' type to +// the given stream. +func writeNetworkList(list []*Network, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNetwork(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNetworkList reads a list of values of the 'network' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNetworkList(source interface{}) (items []*Network, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNetworkList(iterator) + err = iterator.Error + return +} + +// readNetworkList reads list of values of the ”network' type from +// the given iterator. +func readNetworkList(iterator *jsoniter.Iterator) []*Network { + list := []*Network{} + for iterator.ReadArray() { + item := readNetwork(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/network_type.go b/clustersmgmt/v2alpha1/network_type.go new file mode 100644 index 00000000..090a60cc --- /dev/null +++ b/clustersmgmt/v2alpha1/network_type.go @@ -0,0 +1,238 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Network represents the values of the 'network' type. +// +// Network configuration of a cluster. +type Network struct { + bitmap_ uint32 + hostPrefix int + machineCIDR string + podCIDR string + serviceCIDR string + type_ string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Network) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// HostPrefix returns the value of the 'host_prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Network host prefix which is defaulted to `23` if not specified. +func (o *Network) HostPrefix() int { + if o != nil && o.bitmap_&1 != 0 { + return o.hostPrefix + } + return 0 +} + +// GetHostPrefix returns the value of the 'host_prefix' attribute and +// a flag indicating if the attribute has a value. +// +// Network host prefix which is defaulted to `23` if not specified. +func (o *Network) GetHostPrefix() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.hostPrefix + } + return +} + +// MachineCIDR returns the value of the 'machine_CIDR' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// IP address block from which to assign machine IP addresses, for example `10.0.0.0/16`. +func (o *Network) MachineCIDR() string { + if o != nil && o.bitmap_&2 != 0 { + return o.machineCIDR + } + return "" +} + +// GetMachineCIDR returns the value of the 'machine_CIDR' attribute and +// a flag indicating if the attribute has a value. +// +// IP address block from which to assign machine IP addresses, for example `10.0.0.0/16`. +func (o *Network) GetMachineCIDR() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.machineCIDR + } + return +} + +// PodCIDR returns the value of the 'pod_CIDR' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// IP address block from which to assign pod IP addresses, for example `10.128.0.0/14`. +func (o *Network) PodCIDR() string { + if o != nil && o.bitmap_&4 != 0 { + return o.podCIDR + } + return "" +} + +// GetPodCIDR returns the value of the 'pod_CIDR' attribute and +// a flag indicating if the attribute has a value. +// +// IP address block from which to assign pod IP addresses, for example `10.128.0.0/14`. +func (o *Network) GetPodCIDR() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.podCIDR + } + return +} + +// ServiceCIDR returns the value of the 'service_CIDR' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// IP address block from which to assign service IP addresses, for example `172.30.0.0/16`. +func (o *Network) ServiceCIDR() string { + if o != nil && o.bitmap_&8 != 0 { + return o.serviceCIDR + } + return "" +} + +// GetServiceCIDR returns the value of the 'service_CIDR' attribute and +// a flag indicating if the attribute has a value. +// +// IP address block from which to assign service IP addresses, for example `172.30.0.0/16`. +func (o *Network) GetServiceCIDR() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.serviceCIDR + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The main controller responsible for rendering the core networking components. +func (o *Network) Type() string { + if o != nil && o.bitmap_&16 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// The main controller responsible for rendering the core networking components. +func (o *Network) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.type_ + } + return +} + +// NetworkListKind is the name of the type used to represent list of objects of +// type 'network'. +const NetworkListKind = "NetworkList" + +// NetworkListLinkKind is the name of the type used to represent links to list +// of objects of type 'network'. +const NetworkListLinkKind = "NetworkListLink" + +// NetworkNilKind is the name of the type used to nil lists of objects of +// type 'network'. +const NetworkListNilKind = "NetworkListNil" + +// NetworkList is a list of values of the 'network' type. +type NetworkList struct { + href string + link bool + items []*Network +} + +// Len returns the length of the list. +func (l *NetworkList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NetworkList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NetworkList) Get(i int) *Network { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NetworkList) Slice() []*Network { + var slice []*Network + if l == nil { + slice = make([]*Network, 0) + } else { + slice = make([]*Network, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NetworkList) Each(f func(item *Network) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NetworkList) Range(f func(index int, item *Network) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/network_type_json.go b/clustersmgmt/v2alpha1/network_type_json.go new file mode 100644 index 00000000..0476ccb3 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_type_json.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNetwork writes a value of the 'network' type to the given writer. +func MarshalNetwork(object *Network, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNetwork(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNetwork writes a value of the 'network' type to the given stream. +func writeNetwork(object *Network, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("host_prefix") + stream.WriteInt(object.hostPrefix) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("machine_cidr") + stream.WriteString(object.machineCIDR) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("pod_cidr") + stream.WriteString(object.podCIDR) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_cidr") + stream.WriteString(object.serviceCIDR) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalNetwork reads a value of the 'network' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNetwork(source interface{}) (object *Network, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNetwork(iterator) + err = iterator.Error + return +} + +// readNetwork reads a value of the 'network' type from the given iterator. +func readNetwork(iterator *jsoniter.Iterator) *Network { + object := &Network{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "host_prefix": + value := iterator.ReadInt() + object.hostPrefix = value + object.bitmap_ |= 1 + case "machine_cidr": + value := iterator.ReadString() + object.machineCIDR = value + object.bitmap_ |= 2 + case "pod_cidr": + value := iterator.ReadString() + object.podCIDR = value + object.bitmap_ |= 4 + case "service_cidr": + value := iterator.ReadString() + object.serviceCIDR = value + object.bitmap_ |= 8 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/network_verification_builder.go b/clustersmgmt/v2alpha1/network_verification_builder.go new file mode 100644 index 00000000..87732c0f --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_builder.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NetworkVerificationBuilder contains the data and logic needed to build 'network_verification' objects. +type NetworkVerificationBuilder struct { + bitmap_ uint32 + cloudProviderData *CloudProviderDataBuilder + clusterId string + items []*SubnetNetworkVerificationBuilder + platform Platform + total int +} + +// NewNetworkVerification creates a new builder of 'network_verification' objects. +func NewNetworkVerification() *NetworkVerificationBuilder { + return &NetworkVerificationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NetworkVerificationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CloudProviderData sets the value of the 'cloud_provider_data' attribute to the given value. +// +// Description of a cloud provider data used for cloud provider inquiries. +func (b *NetworkVerificationBuilder) CloudProviderData(value *CloudProviderDataBuilder) *NetworkVerificationBuilder { + b.cloudProviderData = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// ClusterId sets the value of the 'cluster_id' attribute to the given value. +func (b *NetworkVerificationBuilder) ClusterId(value string) *NetworkVerificationBuilder { + b.clusterId = value + b.bitmap_ |= 2 + return b +} + +// Items sets the value of the 'items' attribute to the given values. +func (b *NetworkVerificationBuilder) Items(values ...*SubnetNetworkVerificationBuilder) *NetworkVerificationBuilder { + b.items = make([]*SubnetNetworkVerificationBuilder, len(values)) + copy(b.items, values) + b.bitmap_ |= 4 + return b +} + +// Platform sets the value of the 'platform' attribute to the given value. +// +// Representation of an platform type field. +func (b *NetworkVerificationBuilder) Platform(value Platform) *NetworkVerificationBuilder { + b.platform = value + b.bitmap_ |= 8 + return b +} + +// Total sets the value of the 'total' attribute to the given value. +func (b *NetworkVerificationBuilder) Total(value int) *NetworkVerificationBuilder { + b.total = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NetworkVerificationBuilder) Copy(object *NetworkVerification) *NetworkVerificationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.cloudProviderData != nil { + b.cloudProviderData = NewCloudProviderData().Copy(object.cloudProviderData) + } else { + b.cloudProviderData = nil + } + b.clusterId = object.clusterId + if object.items != nil { + b.items = make([]*SubnetNetworkVerificationBuilder, len(object.items)) + for i, v := range object.items { + b.items[i] = NewSubnetNetworkVerification().Copy(v) + } + } else { + b.items = nil + } + b.platform = object.platform + b.total = object.total + return b +} + +// Build creates a 'network_verification' object using the configuration stored in the builder. +func (b *NetworkVerificationBuilder) Build() (object *NetworkVerification, err error) { + object = new(NetworkVerification) + object.bitmap_ = b.bitmap_ + if b.cloudProviderData != nil { + object.cloudProviderData, err = b.cloudProviderData.Build() + if err != nil { + return + } + } + object.clusterId = b.clusterId + if b.items != nil { + object.items = make([]*SubnetNetworkVerification, len(b.items)) + for i, v := range b.items { + object.items[i], err = v.Build() + if err != nil { + return + } + } + } + object.platform = b.platform + object.total = b.total + return +} diff --git a/clustersmgmt/v2alpha1/network_verification_client.go b/clustersmgmt/v2alpha1/network_verification_client.go new file mode 100644 index 00000000..1ac6e3d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NetworkVerificationClient is the client of the 'network_verification' resource. +// +// Manages a subnet network verification. +type NetworkVerificationClient struct { + transport http.RoundTripper + path string +} + +// NewNetworkVerificationClient creates a new client for the 'network_verification' +// resource using the given transport to send the requests and receive the +// responses. +func NewNetworkVerificationClient(transport http.RoundTripper, path string) *NetworkVerificationClient { + return &NetworkVerificationClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of a subnet network verification. +func (c *NetworkVerificationClient) Get() *NetworkVerificationGetRequest { + return &NetworkVerificationGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// NetworkVerificationPollRequest is the request for the Poll method. +type NetworkVerificationPollRequest struct { + request *NetworkVerificationGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *NetworkVerificationPollRequest) Parameter(name string, value interface{}) *NetworkVerificationPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *NetworkVerificationPollRequest) Header(name string, value interface{}) *NetworkVerificationPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *NetworkVerificationPollRequest) Interval(value time.Duration) *NetworkVerificationPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *NetworkVerificationPollRequest) Status(value int) *NetworkVerificationPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *NetworkVerificationPollRequest) Predicate(value func(*NetworkVerificationGetResponse) bool) *NetworkVerificationPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*NetworkVerificationGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *NetworkVerificationPollRequest) StartContext(ctx context.Context) (response *NetworkVerificationPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &NetworkVerificationPollResponse{ + response: result.(*NetworkVerificationGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *NetworkVerificationPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// NetworkVerificationPollResponse is the response for the Poll method. +type NetworkVerificationPollResponse struct { + response *NetworkVerificationGetResponse +} + +// Status returns the response status code. +func (r *NetworkVerificationPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *NetworkVerificationPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *NetworkVerificationPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *NetworkVerificationPollResponse) Body() *SubnetNetworkVerification { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NetworkVerificationPollResponse) GetBody() (value *SubnetNetworkVerification, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *NetworkVerificationClient) Poll() *NetworkVerificationPollRequest { + return &NetworkVerificationPollRequest{ + request: c.Get(), + } +} + +// NetworkVerificationGetRequest is the request for the 'get' method. +type NetworkVerificationGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *NetworkVerificationGetRequest) Parameter(name string, value interface{}) *NetworkVerificationGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NetworkVerificationGetRequest) Header(name string, value interface{}) *NetworkVerificationGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NetworkVerificationGetRequest) Impersonate(user string) *NetworkVerificationGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NetworkVerificationGetRequest) Send() (result *NetworkVerificationGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NetworkVerificationGetRequest) SendContext(ctx context.Context) (result *NetworkVerificationGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NetworkVerificationGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNetworkVerificationGetResponse(result, reader) + if err != nil { + return + } + return +} + +// NetworkVerificationGetResponse is the response for the 'get' method. +type NetworkVerificationGetResponse struct { + status int + header http.Header + err *errors.Error + body *SubnetNetworkVerification +} + +// Status returns the response status code. +func (r *NetworkVerificationGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NetworkVerificationGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NetworkVerificationGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NetworkVerificationGetResponse) Body() *SubnetNetworkVerification { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NetworkVerificationGetResponse) GetBody() (value *SubnetNetworkVerification, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/network_verification_list_builder.go b/clustersmgmt/v2alpha1/network_verification_list_builder.go new file mode 100644 index 00000000..bbcf474f --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NetworkVerificationListBuilder contains the data and logic needed to build +// 'network_verification' objects. +type NetworkVerificationListBuilder struct { + items []*NetworkVerificationBuilder +} + +// NewNetworkVerificationList creates a new builder of 'network_verification' objects. +func NewNetworkVerificationList() *NetworkVerificationListBuilder { + return new(NetworkVerificationListBuilder) +} + +// Items sets the items of the list. +func (b *NetworkVerificationListBuilder) Items(values ...*NetworkVerificationBuilder) *NetworkVerificationListBuilder { + b.items = make([]*NetworkVerificationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NetworkVerificationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NetworkVerificationListBuilder) Copy(list *NetworkVerificationList) *NetworkVerificationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NetworkVerificationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNetworkVerification().Copy(v) + } + } + return b +} + +// Build creates a list of 'network_verification' objects using the +// configuration stored in the builder. +func (b *NetworkVerificationListBuilder) Build() (list *NetworkVerificationList, err error) { + items := make([]*NetworkVerification, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NetworkVerificationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/network_verification_list_type_json.go b/clustersmgmt/v2alpha1/network_verification_list_type_json.go new file mode 100644 index 00000000..06a46653 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNetworkVerificationList writes a list of values of the 'network_verification' type to +// the given writer. +func MarshalNetworkVerificationList(list []*NetworkVerification, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNetworkVerificationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNetworkVerificationList writes a list of value of the 'network_verification' type to +// the given stream. +func writeNetworkVerificationList(list []*NetworkVerification, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNetworkVerification(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNetworkVerificationList reads a list of values of the 'network_verification' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNetworkVerificationList(source interface{}) (items []*NetworkVerification, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNetworkVerificationList(iterator) + err = iterator.Error + return +} + +// readNetworkVerificationList reads list of values of the ”network_verification' type from +// the given iterator. +func readNetworkVerificationList(iterator *jsoniter.Iterator) []*NetworkVerification { + list := []*NetworkVerification{} + for iterator.ReadArray() { + item := readNetworkVerification(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/network_verification_resource_json.go b/clustersmgmt/v2alpha1/network_verification_resource_json.go new file mode 100644 index 00000000..092e861e --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeNetworkVerificationGetRequest(request *NetworkVerificationGetRequest, writer io.Writer) error { + return nil +} +func readNetworkVerificationGetResponse(response *NetworkVerificationGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalSubnetNetworkVerification(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/network_verification_type.go b/clustersmgmt/v2alpha1/network_verification_type.go new file mode 100644 index 00000000..83f664eb --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_type.go @@ -0,0 +1,236 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NetworkVerification represents the values of the 'network_verification' type. +type NetworkVerification struct { + bitmap_ uint32 + cloudProviderData *CloudProviderData + clusterId string + items []*SubnetNetworkVerification + platform Platform + total int +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NetworkVerification) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CloudProviderData returns the value of the 'cloud_provider_data' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cloud provider data to execute the network verification. +func (o *NetworkVerification) CloudProviderData() *CloudProviderData { + if o != nil && o.bitmap_&1 != 0 { + return o.cloudProviderData + } + return nil +} + +// GetCloudProviderData returns the value of the 'cloud_provider_data' attribute and +// a flag indicating if the attribute has a value. +// +// Cloud provider data to execute the network verification. +func (o *NetworkVerification) GetCloudProviderData() (value *CloudProviderData, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.cloudProviderData + } + return +} + +// ClusterId returns the value of the 'cluster_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster ID needed to execute the network verification. +func (o *NetworkVerification) ClusterId() string { + if o != nil && o.bitmap_&2 != 0 { + return o.clusterId + } + return "" +} + +// GetClusterId returns the value of the 'cluster_id' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster ID needed to execute the network verification. +func (o *NetworkVerification) GetClusterId() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.clusterId + } + return +} + +// Items returns the value of the 'items' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details about each subnet network verification. +func (o *NetworkVerification) Items() []*SubnetNetworkVerification { + if o != nil && o.bitmap_&4 != 0 { + return o.items + } + return nil +} + +// GetItems returns the value of the 'items' attribute and +// a flag indicating if the attribute has a value. +// +// Details about each subnet network verification. +func (o *NetworkVerification) GetItems() (value []*SubnetNetworkVerification, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.items + } + return +} + +// Platform returns the value of the 'platform' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Platform needed to execute the network verification. +func (o *NetworkVerification) Platform() Platform { + if o != nil && o.bitmap_&8 != 0 { + return o.platform + } + return Platform("") +} + +// GetPlatform returns the value of the 'platform' attribute and +// a flag indicating if the attribute has a value. +// +// Platform needed to execute the network verification. +func (o *NetworkVerification) GetPlatform() (value Platform, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.platform + } + return +} + +// Total returns the value of the 'total' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Amount of network verifier executions started. +func (o *NetworkVerification) Total() int { + if o != nil && o.bitmap_&16 != 0 { + return o.total + } + return 0 +} + +// GetTotal returns the value of the 'total' attribute and +// a flag indicating if the attribute has a value. +// +// Amount of network verifier executions started. +func (o *NetworkVerification) GetTotal() (value int, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.total + } + return +} + +// NetworkVerificationListKind is the name of the type used to represent list of objects of +// type 'network_verification'. +const NetworkVerificationListKind = "NetworkVerificationList" + +// NetworkVerificationListLinkKind is the name of the type used to represent links to list +// of objects of type 'network_verification'. +const NetworkVerificationListLinkKind = "NetworkVerificationListLink" + +// NetworkVerificationNilKind is the name of the type used to nil lists of objects of +// type 'network_verification'. +const NetworkVerificationListNilKind = "NetworkVerificationListNil" + +// NetworkVerificationList is a list of values of the 'network_verification' type. +type NetworkVerificationList struct { + href string + link bool + items []*NetworkVerification +} + +// Len returns the length of the list. +func (l *NetworkVerificationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NetworkVerificationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NetworkVerificationList) Get(i int) *NetworkVerification { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NetworkVerificationList) Slice() []*NetworkVerification { + var slice []*NetworkVerification + if l == nil { + slice = make([]*NetworkVerification, 0) + } else { + slice = make([]*NetworkVerification, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NetworkVerificationList) Each(f func(item *NetworkVerification) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NetworkVerificationList) Range(f func(index int, item *NetworkVerification) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/network_verification_type_json.go b/clustersmgmt/v2alpha1/network_verification_type_json.go new file mode 100644 index 00000000..36dab393 --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verification_type_json.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNetworkVerification writes a value of the 'network_verification' type to the given writer. +func MarshalNetworkVerification(object *NetworkVerification, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNetworkVerification(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNetworkVerification writes a value of the 'network_verification' type to the given stream. +func writeNetworkVerification(object *NetworkVerification, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.cloudProviderData != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cloud_provider_data") + writeCloudProviderData(object.cloudProviderData, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_id") + stream.WriteString(object.clusterId) + count++ + } + present_ = object.bitmap_&4 != 0 && object.items != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("items") + writeSubnetNetworkVerificationList(object.items, stream) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("platform") + stream.WriteString(string(object.platform)) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("total") + stream.WriteInt(object.total) + } + stream.WriteObjectEnd() +} + +// UnmarshalNetworkVerification reads a value of the 'network_verification' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNetworkVerification(source interface{}) (object *NetworkVerification, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNetworkVerification(iterator) + err = iterator.Error + return +} + +// readNetworkVerification reads a value of the 'network_verification' type from the given iterator. +func readNetworkVerification(iterator *jsoniter.Iterator) *NetworkVerification { + object := &NetworkVerification{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "cloud_provider_data": + value := readCloudProviderData(iterator) + object.cloudProviderData = value + object.bitmap_ |= 1 + case "cluster_id": + value := iterator.ReadString() + object.clusterId = value + object.bitmap_ |= 2 + case "items": + value := readSubnetNetworkVerificationList(iterator) + object.items = value + object.bitmap_ |= 4 + case "platform": + text := iterator.ReadString() + value := Platform(text) + object.platform = value + object.bitmap_ |= 8 + case "total": + value := iterator.ReadInt() + object.total = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/network_verifications_client.go b/clustersmgmt/v2alpha1/network_verifications_client.go new file mode 100644 index 00000000..390537df --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verifications_client.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NetworkVerificationsClient is the client of the 'network_verifications' resource. +// +// Manages the collection of subnet network verifications. +type NetworkVerificationsClient struct { + transport http.RoundTripper + path string +} + +// NewNetworkVerificationsClient creates a new client for the 'network_verifications' +// resource using the given transport to send the requests and receive the +// responses. +func NewNetworkVerificationsClient(transport http.RoundTripper, path string) *NetworkVerificationsClient { + return &NetworkVerificationsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Creates an entry for a network verification for each subnet supplied setting then to initial state. +func (c *NetworkVerificationsClient) Add() *NetworkVerificationsAddRequest { + return &NetworkVerificationsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// NetworkVerification returns the target 'network_verification' resource for the given identifier. +// +// Reference to the service that manages a specific network verification. +func (c *NetworkVerificationsClient) NetworkVerification(id string) *NetworkVerificationClient { + return NewNetworkVerificationClient( + c.transport, + path.Join(c.path, id), + ) +} + +// NetworkVerificationsAddRequest is the request for the 'add' method. +type NetworkVerificationsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *NetworkVerification +} + +// Parameter adds a query parameter. +func (r *NetworkVerificationsAddRequest) Parameter(name string, value interface{}) *NetworkVerificationsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NetworkVerificationsAddRequest) Header(name string, value interface{}) *NetworkVerificationsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NetworkVerificationsAddRequest) Impersonate(user string) *NetworkVerificationsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *NetworkVerificationsAddRequest) Body(value *NetworkVerification) *NetworkVerificationsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NetworkVerificationsAddRequest) Send() (result *NetworkVerificationsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NetworkVerificationsAddRequest) SendContext(ctx context.Context) (result *NetworkVerificationsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeNetworkVerificationsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NetworkVerificationsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNetworkVerificationsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// NetworkVerificationsAddResponse is the response for the 'add' method. +type NetworkVerificationsAddResponse struct { + status int + header http.Header + err *errors.Error + body *NetworkVerification +} + +// Status returns the response status code. +func (r *NetworkVerificationsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NetworkVerificationsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NetworkVerificationsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NetworkVerificationsAddResponse) Body() *NetworkVerification { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NetworkVerificationsAddResponse) GetBody() (value *NetworkVerification, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/network_verifications_resource_json.go b/clustersmgmt/v2alpha1/network_verifications_resource_json.go new file mode 100644 index 00000000..3bdce0be --- /dev/null +++ b/clustersmgmt/v2alpha1/network_verifications_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeNetworkVerificationsAddRequest(request *NetworkVerificationsAddRequest, writer io.Writer) error { + return MarshalNetworkVerification(request.body, writer) +} +func readNetworkVerificationsAddResponse(response *NetworkVerificationsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNetworkVerification(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/node_info_builder.go b/clustersmgmt/v2alpha1/node_info_builder.go new file mode 100644 index 00000000..27e31735 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_info_builder.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodeInfoBuilder contains the data and logic needed to build 'node_info' objects. +// +// Provides information about a node from specific type in the cluster. +type NodeInfoBuilder struct { + bitmap_ uint32 + amount int + type_ NodeType +} + +// NewNodeInfo creates a new builder of 'node_info' objects. +func NewNodeInfo() *NodeInfoBuilder { + return &NodeInfoBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodeInfoBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Amount sets the value of the 'amount' attribute to the given value. +func (b *NodeInfoBuilder) Amount(value int) *NodeInfoBuilder { + b.amount = value + b.bitmap_ |= 1 + return b +} + +// Type sets the value of the 'type' attribute to the given value. +// +// Type of node received via telemetry. +func (b *NodeInfoBuilder) Type(value NodeType) *NodeInfoBuilder { + b.type_ = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodeInfoBuilder) Copy(object *NodeInfo) *NodeInfoBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.amount = object.amount + b.type_ = object.type_ + return b +} + +// Build creates a 'node_info' object using the configuration stored in the builder. +func (b *NodeInfoBuilder) Build() (object *NodeInfo, err error) { + object = new(NodeInfo) + object.bitmap_ = b.bitmap_ + object.amount = b.amount + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/node_info_list_builder.go b/clustersmgmt/v2alpha1/node_info_list_builder.go new file mode 100644 index 00000000..2be91a15 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_info_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodeInfoListBuilder contains the data and logic needed to build +// 'node_info' objects. +type NodeInfoListBuilder struct { + items []*NodeInfoBuilder +} + +// NewNodeInfoList creates a new builder of 'node_info' objects. +func NewNodeInfoList() *NodeInfoListBuilder { + return new(NodeInfoListBuilder) +} + +// Items sets the items of the list. +func (b *NodeInfoListBuilder) Items(values ...*NodeInfoBuilder) *NodeInfoListBuilder { + b.items = make([]*NodeInfoBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodeInfoListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodeInfoListBuilder) Copy(list *NodeInfoList) *NodeInfoListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodeInfoBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodeInfo().Copy(v) + } + } + return b +} + +// Build creates a list of 'node_info' objects using the +// configuration stored in the builder. +func (b *NodeInfoListBuilder) Build() (list *NodeInfoList, err error) { + items := make([]*NodeInfo, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodeInfoList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/node_info_list_type_json.go b/clustersmgmt/v2alpha1/node_info_list_type_json.go new file mode 100644 index 00000000..6ac8d4b9 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_info_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodeInfoList writes a list of values of the 'node_info' type to +// the given writer. +func MarshalNodeInfoList(list []*NodeInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodeInfoList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodeInfoList writes a list of value of the 'node_info' type to +// the given stream. +func writeNodeInfoList(list []*NodeInfo, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodeInfo(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodeInfoList reads a list of values of the 'node_info' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodeInfoList(source interface{}) (items []*NodeInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodeInfoList(iterator) + err = iterator.Error + return +} + +// readNodeInfoList reads list of values of the ”node_info' type from +// the given iterator. +func readNodeInfoList(iterator *jsoniter.Iterator) []*NodeInfo { + list := []*NodeInfo{} + for iterator.ReadArray() { + item := readNodeInfo(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_info_type.go b/clustersmgmt/v2alpha1/node_info_type.go new file mode 100644 index 00000000..2b3b1d23 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_info_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodeInfo represents the values of the 'node_info' type. +// +// Provides information about a node from specific type in the cluster. +type NodeInfo struct { + bitmap_ uint32 + amount int + type_ NodeType +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodeInfo) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Amount returns the value of the 'amount' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The amount of the nodes from this type. +func (o *NodeInfo) Amount() int { + if o != nil && o.bitmap_&1 != 0 { + return o.amount + } + return 0 +} + +// GetAmount returns the value of the 'amount' attribute and +// a flag indicating if the attribute has a value. +// +// The amount of the nodes from this type. +func (o *NodeInfo) GetAmount() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.amount + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The Node type. +func (o *NodeInfo) Type() NodeType { + if o != nil && o.bitmap_&2 != 0 { + return o.type_ + } + return NodeType("") +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// The Node type. +func (o *NodeInfo) GetType() (value NodeType, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.type_ + } + return +} + +// NodeInfoListKind is the name of the type used to represent list of objects of +// type 'node_info'. +const NodeInfoListKind = "NodeInfoList" + +// NodeInfoListLinkKind is the name of the type used to represent links to list +// of objects of type 'node_info'. +const NodeInfoListLinkKind = "NodeInfoListLink" + +// NodeInfoNilKind is the name of the type used to nil lists of objects of +// type 'node_info'. +const NodeInfoListNilKind = "NodeInfoListNil" + +// NodeInfoList is a list of values of the 'node_info' type. +type NodeInfoList struct { + href string + link bool + items []*NodeInfo +} + +// Len returns the length of the list. +func (l *NodeInfoList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodeInfoList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodeInfoList) Get(i int) *NodeInfo { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodeInfoList) Slice() []*NodeInfo { + var slice []*NodeInfo + if l == nil { + slice = make([]*NodeInfo, 0) + } else { + slice = make([]*NodeInfo, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodeInfoList) Each(f func(item *NodeInfo) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodeInfoList) Range(f func(index int, item *NodeInfo) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/node_info_type_json.go b/clustersmgmt/v2alpha1/node_info_type_json.go new file mode 100644 index 00000000..6ac59e59 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_info_type_json.go @@ -0,0 +1,100 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodeInfo writes a value of the 'node_info' type to the given writer. +func MarshalNodeInfo(object *NodeInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodeInfo(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodeInfo writes a value of the 'node_info' type to the given stream. +func writeNodeInfo(object *NodeInfo, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("amount") + stream.WriteInt(object.amount) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(string(object.type_)) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodeInfo reads a value of the 'node_info' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodeInfo(source interface{}) (object *NodeInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodeInfo(iterator) + err = iterator.Error + return +} + +// readNodeInfo reads a value of the 'node_info' type from the given iterator. +func readNodeInfo(iterator *jsoniter.Iterator) *NodeInfo { + object := &NodeInfo{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "amount": + value := iterator.ReadInt() + object.amount = value + object.bitmap_ |= 1 + case "type": + text := iterator.ReadString() + value := NodeType(text) + object.type_ = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/node_pool_autoscaling_builder.go b/clustersmgmt/v2alpha1/node_pool_autoscaling_builder.go new file mode 100644 index 00000000..83aa67ab --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_autoscaling_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolAutoscalingBuilder contains the data and logic needed to build 'node_pool_autoscaling' objects. +// +// Representation of a autoscaling in a node pool. +type NodePoolAutoscalingBuilder struct { + bitmap_ uint32 + id string + href string + maxReplica int + minReplica int +} + +// NewNodePoolAutoscaling creates a new builder of 'node_pool_autoscaling' objects. +func NewNodePoolAutoscaling() *NodePoolAutoscalingBuilder { + return &NodePoolAutoscalingBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *NodePoolAutoscalingBuilder) Link(value bool) *NodePoolAutoscalingBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *NodePoolAutoscalingBuilder) ID(value string) *NodePoolAutoscalingBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *NodePoolAutoscalingBuilder) HREF(value string) *NodePoolAutoscalingBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodePoolAutoscalingBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// MaxReplica sets the value of the 'max_replica' attribute to the given value. +func (b *NodePoolAutoscalingBuilder) MaxReplica(value int) *NodePoolAutoscalingBuilder { + b.maxReplica = value + b.bitmap_ |= 8 + return b +} + +// MinReplica sets the value of the 'min_replica' attribute to the given value. +func (b *NodePoolAutoscalingBuilder) MinReplica(value int) *NodePoolAutoscalingBuilder { + b.minReplica = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodePoolAutoscalingBuilder) Copy(object *NodePoolAutoscaling) *NodePoolAutoscalingBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.maxReplica = object.maxReplica + b.minReplica = object.minReplica + return b +} + +// Build creates a 'node_pool_autoscaling' object using the configuration stored in the builder. +func (b *NodePoolAutoscalingBuilder) Build() (object *NodePoolAutoscaling, err error) { + object = new(NodePoolAutoscaling) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.maxReplica = b.maxReplica + object.minReplica = b.minReplica + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_autoscaling_list_builder.go b/clustersmgmt/v2alpha1/node_pool_autoscaling_list_builder.go new file mode 100644 index 00000000..fbeb6231 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_autoscaling_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolAutoscalingListBuilder contains the data and logic needed to build +// 'node_pool_autoscaling' objects. +type NodePoolAutoscalingListBuilder struct { + items []*NodePoolAutoscalingBuilder +} + +// NewNodePoolAutoscalingList creates a new builder of 'node_pool_autoscaling' objects. +func NewNodePoolAutoscalingList() *NodePoolAutoscalingListBuilder { + return new(NodePoolAutoscalingListBuilder) +} + +// Items sets the items of the list. +func (b *NodePoolAutoscalingListBuilder) Items(values ...*NodePoolAutoscalingBuilder) *NodePoolAutoscalingListBuilder { + b.items = make([]*NodePoolAutoscalingBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodePoolAutoscalingListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodePoolAutoscalingListBuilder) Copy(list *NodePoolAutoscalingList) *NodePoolAutoscalingListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodePoolAutoscalingBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodePoolAutoscaling().Copy(v) + } + } + return b +} + +// Build creates a list of 'node_pool_autoscaling' objects using the +// configuration stored in the builder. +func (b *NodePoolAutoscalingListBuilder) Build() (list *NodePoolAutoscalingList, err error) { + items := make([]*NodePoolAutoscaling, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodePoolAutoscalingList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_autoscaling_list_type_json.go b/clustersmgmt/v2alpha1/node_pool_autoscaling_list_type_json.go new file mode 100644 index 00000000..4620c6d0 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_autoscaling_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolAutoscalingList writes a list of values of the 'node_pool_autoscaling' type to +// the given writer. +func MarshalNodePoolAutoscalingList(list []*NodePoolAutoscaling, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolAutoscalingList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolAutoscalingList writes a list of value of the 'node_pool_autoscaling' type to +// the given stream. +func writeNodePoolAutoscalingList(list []*NodePoolAutoscaling, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodePoolAutoscaling(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodePoolAutoscalingList reads a list of values of the 'node_pool_autoscaling' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodePoolAutoscalingList(source interface{}) (items []*NodePoolAutoscaling, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodePoolAutoscalingList(iterator) + err = iterator.Error + return +} + +// readNodePoolAutoscalingList reads list of values of the ”node_pool_autoscaling' type from +// the given iterator. +func readNodePoolAutoscalingList(iterator *jsoniter.Iterator) []*NodePoolAutoscaling { + list := []*NodePoolAutoscaling{} + for iterator.ReadArray() { + item := readNodePoolAutoscaling(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_pool_autoscaling_type.go b/clustersmgmt/v2alpha1/node_pool_autoscaling_type.go new file mode 100644 index 00000000..6df1e9f2 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_autoscaling_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolAutoscalingKind is the name of the type used to represent objects +// of type 'node_pool_autoscaling'. +const NodePoolAutoscalingKind = "NodePoolAutoscaling" + +// NodePoolAutoscalingLinkKind is the name of the type used to represent links +// to objects of type 'node_pool_autoscaling'. +const NodePoolAutoscalingLinkKind = "NodePoolAutoscalingLink" + +// NodePoolAutoscalingNilKind is the name of the type used to nil references +// to objects of type 'node_pool_autoscaling'. +const NodePoolAutoscalingNilKind = "NodePoolAutoscalingNil" + +// NodePoolAutoscaling represents the values of the 'node_pool_autoscaling' type. +// +// Representation of a autoscaling in a node pool. +type NodePoolAutoscaling struct { + bitmap_ uint32 + id string + href string + maxReplica int + minReplica int +} + +// Kind returns the name of the type of the object. +func (o *NodePoolAutoscaling) Kind() string { + if o == nil { + return NodePoolAutoscalingNilKind + } + if o.bitmap_&1 != 0 { + return NodePoolAutoscalingLinkKind + } + return NodePoolAutoscalingKind +} + +// Link returns true iif this is a link. +func (o *NodePoolAutoscaling) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *NodePoolAutoscaling) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *NodePoolAutoscaling) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *NodePoolAutoscaling) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *NodePoolAutoscaling) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodePoolAutoscaling) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// MaxReplica returns the value of the 'max_replica' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The maximum number of replicas for the node pool. +func (o *NodePoolAutoscaling) MaxReplica() int { + if o != nil && o.bitmap_&8 != 0 { + return o.maxReplica + } + return 0 +} + +// GetMaxReplica returns the value of the 'max_replica' attribute and +// a flag indicating if the attribute has a value. +// +// The maximum number of replicas for the node pool. +func (o *NodePoolAutoscaling) GetMaxReplica() (value int, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.maxReplica + } + return +} + +// MinReplica returns the value of the 'min_replica' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The minimum number of replicas for the node pool. +func (o *NodePoolAutoscaling) MinReplica() int { + if o != nil && o.bitmap_&16 != 0 { + return o.minReplica + } + return 0 +} + +// GetMinReplica returns the value of the 'min_replica' attribute and +// a flag indicating if the attribute has a value. +// +// The minimum number of replicas for the node pool. +func (o *NodePoolAutoscaling) GetMinReplica() (value int, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.minReplica + } + return +} + +// NodePoolAutoscalingListKind is the name of the type used to represent list of objects of +// type 'node_pool_autoscaling'. +const NodePoolAutoscalingListKind = "NodePoolAutoscalingList" + +// NodePoolAutoscalingListLinkKind is the name of the type used to represent links to list +// of objects of type 'node_pool_autoscaling'. +const NodePoolAutoscalingListLinkKind = "NodePoolAutoscalingListLink" + +// NodePoolAutoscalingNilKind is the name of the type used to nil lists of objects of +// type 'node_pool_autoscaling'. +const NodePoolAutoscalingListNilKind = "NodePoolAutoscalingListNil" + +// NodePoolAutoscalingList is a list of values of the 'node_pool_autoscaling' type. +type NodePoolAutoscalingList struct { + href string + link bool + items []*NodePoolAutoscaling +} + +// Kind returns the name of the type of the object. +func (l *NodePoolAutoscalingList) Kind() string { + if l == nil { + return NodePoolAutoscalingListNilKind + } + if l.link { + return NodePoolAutoscalingListLinkKind + } + return NodePoolAutoscalingListKind +} + +// Link returns true iif this is a link. +func (l *NodePoolAutoscalingList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *NodePoolAutoscalingList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *NodePoolAutoscalingList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *NodePoolAutoscalingList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodePoolAutoscalingList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodePoolAutoscalingList) Get(i int) *NodePoolAutoscaling { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodePoolAutoscalingList) Slice() []*NodePoolAutoscaling { + var slice []*NodePoolAutoscaling + if l == nil { + slice = make([]*NodePoolAutoscaling, 0) + } else { + slice = make([]*NodePoolAutoscaling, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodePoolAutoscalingList) Each(f func(item *NodePoolAutoscaling) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodePoolAutoscalingList) Range(f func(index int, item *NodePoolAutoscaling) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/node_pool_autoscaling_type_json.go b/clustersmgmt/v2alpha1/node_pool_autoscaling_type_json.go new file mode 100644 index 00000000..0d78d5e7 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_autoscaling_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolAutoscaling writes a value of the 'node_pool_autoscaling' type to the given writer. +func MarshalNodePoolAutoscaling(object *NodePoolAutoscaling, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolAutoscaling(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolAutoscaling writes a value of the 'node_pool_autoscaling' type to the given stream. +func writeNodePoolAutoscaling(object *NodePoolAutoscaling, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(NodePoolAutoscalingLinkKind) + } else { + stream.WriteString(NodePoolAutoscalingKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_replica") + stream.WriteInt(object.maxReplica) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("min_replica") + stream.WriteInt(object.minReplica) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodePoolAutoscaling reads a value of the 'node_pool_autoscaling' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodePoolAutoscaling(source interface{}) (object *NodePoolAutoscaling, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodePoolAutoscaling(iterator) + err = iterator.Error + return +} + +// readNodePoolAutoscaling reads a value of the 'node_pool_autoscaling' type from the given iterator. +func readNodePoolAutoscaling(iterator *jsoniter.Iterator) *NodePoolAutoscaling { + object := &NodePoolAutoscaling{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == NodePoolAutoscalingLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "max_replica": + value := iterator.ReadInt() + object.maxReplica = value + object.bitmap_ |= 8 + case "min_replica": + value := iterator.ReadInt() + object.minReplica = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/node_pool_builder.go b/clustersmgmt/v2alpha1/node_pool_builder.go new file mode 100644 index 00000000..d305c2d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_builder.go @@ -0,0 +1,401 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolBuilder contains the data and logic needed to build 'node_pool' objects. +// +// Representation of a node pool in a cluster. +type NodePoolBuilder struct { + bitmap_ uint32 + id string + href string + awsNodePool *AWSNodePoolBuilder + autoscaling *NodePoolAutoscalingBuilder + availabilityZone string + azureNodePool *AzureNodePoolBuilder + kubeletConfigs []string + labels map[string]string + managementUpgrade *NodePoolManagementUpgradeBuilder + nodeDrainGracePeriod *ValueBuilder + replicas int + status *NodePoolStatusBuilder + subnet string + taints []*TaintBuilder + tuningConfigs []string + version *VersionBuilder + autoRepair bool +} + +// NewNodePool creates a new builder of 'node_pool' objects. +func NewNodePool() *NodePoolBuilder { + return &NodePoolBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *NodePoolBuilder) Link(value bool) *NodePoolBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *NodePoolBuilder) ID(value string) *NodePoolBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *NodePoolBuilder) HREF(value string) *NodePoolBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodePoolBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AWSNodePool sets the value of the 'AWS_node_pool' attribute to the given value. +// +// Representation of aws node pool specific parameters. +func (b *NodePoolBuilder) AWSNodePool(value *AWSNodePoolBuilder) *NodePoolBuilder { + b.awsNodePool = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// AutoRepair sets the value of the 'auto_repair' attribute to the given value. +func (b *NodePoolBuilder) AutoRepair(value bool) *NodePoolBuilder { + b.autoRepair = value + b.bitmap_ |= 16 + return b +} + +// Autoscaling sets the value of the 'autoscaling' attribute to the given value. +// +// Representation of a autoscaling in a node pool. +func (b *NodePoolBuilder) Autoscaling(value *NodePoolAutoscalingBuilder) *NodePoolBuilder { + b.autoscaling = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// AvailabilityZone sets the value of the 'availability_zone' attribute to the given value. +func (b *NodePoolBuilder) AvailabilityZone(value string) *NodePoolBuilder { + b.availabilityZone = value + b.bitmap_ |= 64 + return b +} + +// AzureNodePool sets the value of the 'azure_node_pool' attribute to the given value. +// +// Representation of azure node pool specific parameters. +func (b *NodePoolBuilder) AzureNodePool(value *AzureNodePoolBuilder) *NodePoolBuilder { + b.azureNodePool = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// KubeletConfigs sets the value of the 'kubelet_configs' attribute to the given values. +func (b *NodePoolBuilder) KubeletConfigs(values ...string) *NodePoolBuilder { + b.kubeletConfigs = make([]string, len(values)) + copy(b.kubeletConfigs, values) + b.bitmap_ |= 256 + return b +} + +// Labels sets the value of the 'labels' attribute to the given value. +func (b *NodePoolBuilder) Labels(value map[string]string) *NodePoolBuilder { + b.labels = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// ManagementUpgrade sets the value of the 'management_upgrade' attribute to the given value. +// +// Representation of node pool management. +func (b *NodePoolBuilder) ManagementUpgrade(value *NodePoolManagementUpgradeBuilder) *NodePoolBuilder { + b.managementUpgrade = value + if value != nil { + b.bitmap_ |= 1024 + } else { + b.bitmap_ &^= 1024 + } + return b +} + +// NodeDrainGracePeriod sets the value of the 'node_drain_grace_period' attribute to the given value. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +func (b *NodePoolBuilder) NodeDrainGracePeriod(value *ValueBuilder) *NodePoolBuilder { + b.nodeDrainGracePeriod = value + if value != nil { + b.bitmap_ |= 2048 + } else { + b.bitmap_ &^= 2048 + } + return b +} + +// Replicas sets the value of the 'replicas' attribute to the given value. +func (b *NodePoolBuilder) Replicas(value int) *NodePoolBuilder { + b.replicas = value + b.bitmap_ |= 4096 + return b +} + +// Status sets the value of the 'status' attribute to the given value. +// +// Representation of the status of a node pool. +func (b *NodePoolBuilder) Status(value *NodePoolStatusBuilder) *NodePoolBuilder { + b.status = value + if value != nil { + b.bitmap_ |= 8192 + } else { + b.bitmap_ &^= 8192 + } + return b +} + +// Subnet sets the value of the 'subnet' attribute to the given value. +func (b *NodePoolBuilder) Subnet(value string) *NodePoolBuilder { + b.subnet = value + b.bitmap_ |= 16384 + return b +} + +// Taints sets the value of the 'taints' attribute to the given values. +func (b *NodePoolBuilder) Taints(values ...*TaintBuilder) *NodePoolBuilder { + b.taints = make([]*TaintBuilder, len(values)) + copy(b.taints, values) + b.bitmap_ |= 32768 + return b +} + +// TuningConfigs sets the value of the 'tuning_configs' attribute to the given values. +func (b *NodePoolBuilder) TuningConfigs(values ...string) *NodePoolBuilder { + b.tuningConfigs = make([]string, len(values)) + copy(b.tuningConfigs, values) + b.bitmap_ |= 65536 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +// +// Representation of an _OpenShift_ version. +func (b *NodePoolBuilder) Version(value *VersionBuilder) *NodePoolBuilder { + b.version = value + if value != nil { + b.bitmap_ |= 131072 + } else { + b.bitmap_ &^= 131072 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodePoolBuilder) Copy(object *NodePool) *NodePoolBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.awsNodePool != nil { + b.awsNodePool = NewAWSNodePool().Copy(object.awsNodePool) + } else { + b.awsNodePool = nil + } + b.autoRepair = object.autoRepair + if object.autoscaling != nil { + b.autoscaling = NewNodePoolAutoscaling().Copy(object.autoscaling) + } else { + b.autoscaling = nil + } + b.availabilityZone = object.availabilityZone + if object.azureNodePool != nil { + b.azureNodePool = NewAzureNodePool().Copy(object.azureNodePool) + } else { + b.azureNodePool = nil + } + if object.kubeletConfigs != nil { + b.kubeletConfigs = make([]string, len(object.kubeletConfigs)) + copy(b.kubeletConfigs, object.kubeletConfigs) + } else { + b.kubeletConfigs = nil + } + if len(object.labels) > 0 { + b.labels = map[string]string{} + for k, v := range object.labels { + b.labels[k] = v + } + } else { + b.labels = nil + } + if object.managementUpgrade != nil { + b.managementUpgrade = NewNodePoolManagementUpgrade().Copy(object.managementUpgrade) + } else { + b.managementUpgrade = nil + } + if object.nodeDrainGracePeriod != nil { + b.nodeDrainGracePeriod = NewValue().Copy(object.nodeDrainGracePeriod) + } else { + b.nodeDrainGracePeriod = nil + } + b.replicas = object.replicas + if object.status != nil { + b.status = NewNodePoolStatus().Copy(object.status) + } else { + b.status = nil + } + b.subnet = object.subnet + if object.taints != nil { + b.taints = make([]*TaintBuilder, len(object.taints)) + for i, v := range object.taints { + b.taints[i] = NewTaint().Copy(v) + } + } else { + b.taints = nil + } + if object.tuningConfigs != nil { + b.tuningConfigs = make([]string, len(object.tuningConfigs)) + copy(b.tuningConfigs, object.tuningConfigs) + } else { + b.tuningConfigs = nil + } + if object.version != nil { + b.version = NewVersion().Copy(object.version) + } else { + b.version = nil + } + return b +} + +// Build creates a 'node_pool' object using the configuration stored in the builder. +func (b *NodePoolBuilder) Build() (object *NodePool, err error) { + object = new(NodePool) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.awsNodePool != nil { + object.awsNodePool, err = b.awsNodePool.Build() + if err != nil { + return + } + } + object.autoRepair = b.autoRepair + if b.autoscaling != nil { + object.autoscaling, err = b.autoscaling.Build() + if err != nil { + return + } + } + object.availabilityZone = b.availabilityZone + if b.azureNodePool != nil { + object.azureNodePool, err = b.azureNodePool.Build() + if err != nil { + return + } + } + if b.kubeletConfigs != nil { + object.kubeletConfigs = make([]string, len(b.kubeletConfigs)) + copy(object.kubeletConfigs, b.kubeletConfigs) + } + if b.labels != nil { + object.labels = make(map[string]string) + for k, v := range b.labels { + object.labels[k] = v + } + } + if b.managementUpgrade != nil { + object.managementUpgrade, err = b.managementUpgrade.Build() + if err != nil { + return + } + } + if b.nodeDrainGracePeriod != nil { + object.nodeDrainGracePeriod, err = b.nodeDrainGracePeriod.Build() + if err != nil { + return + } + } + object.replicas = b.replicas + if b.status != nil { + object.status, err = b.status.Build() + if err != nil { + return + } + } + object.subnet = b.subnet + if b.taints != nil { + object.taints = make([]*Taint, len(b.taints)) + for i, v := range b.taints { + object.taints[i], err = v.Build() + if err != nil { + return + } + } + } + if b.tuningConfigs != nil { + object.tuningConfigs = make([]string, len(b.tuningConfigs)) + copy(object.tuningConfigs, b.tuningConfigs) + } + if b.version != nil { + object.version, err = b.version.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_client.go b/clustersmgmt/v2alpha1/node_pool_client.go new file mode 100644 index 00000000..e5bbfeb2 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_client.go @@ -0,0 +1,589 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NodePoolClient is the client of the 'node_pool' resource. +// +// Manages a specific nodepool. +type NodePoolClient struct { + transport http.RoundTripper + path string +} + +// NewNodePoolClient creates a new client for the 'node_pool' +// resource using the given transport to send the requests and receive the +// responses. +func NewNodePoolClient(transport http.RoundTripper, path string) *NodePoolClient { + return &NodePoolClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the node pool. +func (c *NodePoolClient) Delete() *NodePoolDeleteRequest { + return &NodePoolDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the node pool. +func (c *NodePoolClient) Get() *NodePoolGetRequest { + return &NodePoolGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the node pool. +func (c *NodePoolClient) Update() *NodePoolUpdateRequest { + return &NodePoolUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// UpgradePolicies returns the target 'node_pool_upgrade_policies' resource. +// +// Reference to the state of the upgrade policy. +func (c *NodePoolClient) UpgradePolicies() *NodePoolUpgradePoliciesClient { + return NewNodePoolUpgradePoliciesClient( + c.transport, + path.Join(c.path, "upgrade_policies"), + ) +} + +// NodePoolPollRequest is the request for the Poll method. +type NodePoolPollRequest struct { + request *NodePoolGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *NodePoolPollRequest) Parameter(name string, value interface{}) *NodePoolPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *NodePoolPollRequest) Header(name string, value interface{}) *NodePoolPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *NodePoolPollRequest) Interval(value time.Duration) *NodePoolPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *NodePoolPollRequest) Status(value int) *NodePoolPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *NodePoolPollRequest) Predicate(value func(*NodePoolGetResponse) bool) *NodePoolPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*NodePoolGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *NodePoolPollRequest) StartContext(ctx context.Context) (response *NodePoolPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &NodePoolPollResponse{ + response: result.(*NodePoolGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *NodePoolPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// NodePoolPollResponse is the response for the Poll method. +type NodePoolPollResponse struct { + response *NodePoolGetResponse +} + +// Status returns the response status code. +func (r *NodePoolPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *NodePoolPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *NodePoolPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *NodePoolPollResponse) Body() *NodePool { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodePoolPollResponse) GetBody() (value *NodePool, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *NodePoolClient) Poll() *NodePoolPollRequest { + return &NodePoolPollRequest{ + request: c.Get(), + } +} + +// NodePoolDeleteRequest is the request for the 'delete' method. +type NodePoolDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *NodePoolDeleteRequest) Parameter(name string, value interface{}) *NodePoolDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolDeleteRequest) Header(name string, value interface{}) *NodePoolDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolDeleteRequest) Impersonate(user string) *NodePoolDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolDeleteRequest) Send() (result *NodePoolDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolDeleteRequest) SendContext(ctx context.Context) (result *NodePoolDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// NodePoolDeleteResponse is the response for the 'delete' method. +type NodePoolDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *NodePoolDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// NodePoolGetRequest is the request for the 'get' method. +type NodePoolGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *NodePoolGetRequest) Parameter(name string, value interface{}) *NodePoolGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolGetRequest) Header(name string, value interface{}) *NodePoolGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolGetRequest) Impersonate(user string) *NodePoolGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolGetRequest) Send() (result *NodePoolGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolGetRequest) SendContext(ctx context.Context) (result *NodePoolGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolGetResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolGetResponse is the response for the 'get' method. +type NodePoolGetResponse struct { + status int + header http.Header + err *errors.Error + body *NodePool +} + +// Status returns the response status code. +func (r *NodePoolGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NodePoolGetResponse) Body() *NodePool { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodePoolGetResponse) GetBody() (value *NodePool, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// NodePoolUpdateRequest is the request for the 'update' method. +type NodePoolUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *NodePool +} + +// Parameter adds a query parameter. +func (r *NodePoolUpdateRequest) Parameter(name string, value interface{}) *NodePoolUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolUpdateRequest) Header(name string, value interface{}) *NodePoolUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolUpdateRequest) Impersonate(user string) *NodePoolUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *NodePoolUpdateRequest) Body(value *NodePool) *NodePoolUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolUpdateRequest) Send() (result *NodePoolUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolUpdateRequest) SendContext(ctx context.Context) (result *NodePoolUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeNodePoolUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolUpdateResponse is the response for the 'update' method. +type NodePoolUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *NodePool +} + +// Status returns the response status code. +func (r *NodePoolUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NodePoolUpdateResponse) Body() *NodePool { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodePoolUpdateResponse) GetBody() (value *NodePool, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_list_builder.go b/clustersmgmt/v2alpha1/node_pool_list_builder.go new file mode 100644 index 00000000..9b35f237 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolListBuilder contains the data and logic needed to build +// 'node_pool' objects. +type NodePoolListBuilder struct { + items []*NodePoolBuilder +} + +// NewNodePoolList creates a new builder of 'node_pool' objects. +func NewNodePoolList() *NodePoolListBuilder { + return new(NodePoolListBuilder) +} + +// Items sets the items of the list. +func (b *NodePoolListBuilder) Items(values ...*NodePoolBuilder) *NodePoolListBuilder { + b.items = make([]*NodePoolBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodePoolListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodePoolListBuilder) Copy(list *NodePoolList) *NodePoolListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodePoolBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodePool().Copy(v) + } + } + return b +} + +// Build creates a list of 'node_pool' objects using the +// configuration stored in the builder. +func (b *NodePoolListBuilder) Build() (list *NodePoolList, err error) { + items := make([]*NodePool, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodePoolList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_list_type_json.go b/clustersmgmt/v2alpha1/node_pool_list_type_json.go new file mode 100644 index 00000000..6a5192a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolList writes a list of values of the 'node_pool' type to +// the given writer. +func MarshalNodePoolList(list []*NodePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolList writes a list of value of the 'node_pool' type to +// the given stream. +func writeNodePoolList(list []*NodePool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodePool(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodePoolList reads a list of values of the 'node_pool' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodePoolList(source interface{}) (items []*NodePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodePoolList(iterator) + err = iterator.Error + return +} + +// readNodePoolList reads list of values of the ”node_pool' type from +// the given iterator. +func readNodePoolList(iterator *jsoniter.Iterator) []*NodePool { + list := []*NodePool{} + for iterator.ReadArray() { + item := readNodePool(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_pool_management_upgrade_builder.go b/clustersmgmt/v2alpha1/node_pool_management_upgrade_builder.go new file mode 100644 index 00000000..8b716411 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_management_upgrade_builder.go @@ -0,0 +1,109 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolManagementUpgradeBuilder contains the data and logic needed to build 'node_pool_management_upgrade' objects. +// +// Representation of node pool management. +type NodePoolManagementUpgradeBuilder struct { + bitmap_ uint32 + id string + href string + maxSurge string + maxUnavailable string + type_ string +} + +// NewNodePoolManagementUpgrade creates a new builder of 'node_pool_management_upgrade' objects. +func NewNodePoolManagementUpgrade() *NodePoolManagementUpgradeBuilder { + return &NodePoolManagementUpgradeBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *NodePoolManagementUpgradeBuilder) Link(value bool) *NodePoolManagementUpgradeBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *NodePoolManagementUpgradeBuilder) ID(value string) *NodePoolManagementUpgradeBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *NodePoolManagementUpgradeBuilder) HREF(value string) *NodePoolManagementUpgradeBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodePoolManagementUpgradeBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// MaxSurge sets the value of the 'max_surge' attribute to the given value. +func (b *NodePoolManagementUpgradeBuilder) MaxSurge(value string) *NodePoolManagementUpgradeBuilder { + b.maxSurge = value + b.bitmap_ |= 8 + return b +} + +// MaxUnavailable sets the value of the 'max_unavailable' attribute to the given value. +func (b *NodePoolManagementUpgradeBuilder) MaxUnavailable(value string) *NodePoolManagementUpgradeBuilder { + b.maxUnavailable = value + b.bitmap_ |= 16 + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *NodePoolManagementUpgradeBuilder) Type(value string) *NodePoolManagementUpgradeBuilder { + b.type_ = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodePoolManagementUpgradeBuilder) Copy(object *NodePoolManagementUpgrade) *NodePoolManagementUpgradeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.maxSurge = object.maxSurge + b.maxUnavailable = object.maxUnavailable + b.type_ = object.type_ + return b +} + +// Build creates a 'node_pool_management_upgrade' object using the configuration stored in the builder. +func (b *NodePoolManagementUpgradeBuilder) Build() (object *NodePoolManagementUpgrade, err error) { + object = new(NodePoolManagementUpgrade) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.maxSurge = b.maxSurge + object.maxUnavailable = b.maxUnavailable + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_management_upgrade_list_builder.go b/clustersmgmt/v2alpha1/node_pool_management_upgrade_list_builder.go new file mode 100644 index 00000000..702f2068 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_management_upgrade_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolManagementUpgradeListBuilder contains the data and logic needed to build +// 'node_pool_management_upgrade' objects. +type NodePoolManagementUpgradeListBuilder struct { + items []*NodePoolManagementUpgradeBuilder +} + +// NewNodePoolManagementUpgradeList creates a new builder of 'node_pool_management_upgrade' objects. +func NewNodePoolManagementUpgradeList() *NodePoolManagementUpgradeListBuilder { + return new(NodePoolManagementUpgradeListBuilder) +} + +// Items sets the items of the list. +func (b *NodePoolManagementUpgradeListBuilder) Items(values ...*NodePoolManagementUpgradeBuilder) *NodePoolManagementUpgradeListBuilder { + b.items = make([]*NodePoolManagementUpgradeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodePoolManagementUpgradeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodePoolManagementUpgradeListBuilder) Copy(list *NodePoolManagementUpgradeList) *NodePoolManagementUpgradeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodePoolManagementUpgradeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodePoolManagementUpgrade().Copy(v) + } + } + return b +} + +// Build creates a list of 'node_pool_management_upgrade' objects using the +// configuration stored in the builder. +func (b *NodePoolManagementUpgradeListBuilder) Build() (list *NodePoolManagementUpgradeList, err error) { + items := make([]*NodePoolManagementUpgrade, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodePoolManagementUpgradeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_management_upgrade_list_type_json.go b/clustersmgmt/v2alpha1/node_pool_management_upgrade_list_type_json.go new file mode 100644 index 00000000..d51d0c90 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_management_upgrade_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolManagementUpgradeList writes a list of values of the 'node_pool_management_upgrade' type to +// the given writer. +func MarshalNodePoolManagementUpgradeList(list []*NodePoolManagementUpgrade, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolManagementUpgradeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolManagementUpgradeList writes a list of value of the 'node_pool_management_upgrade' type to +// the given stream. +func writeNodePoolManagementUpgradeList(list []*NodePoolManagementUpgrade, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodePoolManagementUpgrade(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodePoolManagementUpgradeList reads a list of values of the 'node_pool_management_upgrade' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodePoolManagementUpgradeList(source interface{}) (items []*NodePoolManagementUpgrade, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodePoolManagementUpgradeList(iterator) + err = iterator.Error + return +} + +// readNodePoolManagementUpgradeList reads list of values of the ”node_pool_management_upgrade' type from +// the given iterator. +func readNodePoolManagementUpgradeList(iterator *jsoniter.Iterator) []*NodePoolManagementUpgrade { + list := []*NodePoolManagementUpgrade{} + for iterator.ReadArray() { + item := readNodePoolManagementUpgrade(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_pool_management_upgrade_type.go b/clustersmgmt/v2alpha1/node_pool_management_upgrade_type.go new file mode 100644 index 00000000..c75fe477 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_management_upgrade_type.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolManagementUpgradeKind is the name of the type used to represent objects +// of type 'node_pool_management_upgrade'. +const NodePoolManagementUpgradeKind = "NodePoolManagementUpgrade" + +// NodePoolManagementUpgradeLinkKind is the name of the type used to represent links +// to objects of type 'node_pool_management_upgrade'. +const NodePoolManagementUpgradeLinkKind = "NodePoolManagementUpgradeLink" + +// NodePoolManagementUpgradeNilKind is the name of the type used to nil references +// to objects of type 'node_pool_management_upgrade'. +const NodePoolManagementUpgradeNilKind = "NodePoolManagementUpgradeNil" + +// NodePoolManagementUpgrade represents the values of the 'node_pool_management_upgrade' type. +// +// Representation of node pool management. +type NodePoolManagementUpgrade struct { + bitmap_ uint32 + id string + href string + maxSurge string + maxUnavailable string + type_ string +} + +// Kind returns the name of the type of the object. +func (o *NodePoolManagementUpgrade) Kind() string { + if o == nil { + return NodePoolManagementUpgradeNilKind + } + if o.bitmap_&1 != 0 { + return NodePoolManagementUpgradeLinkKind + } + return NodePoolManagementUpgradeKind +} + +// Link returns true iif this is a link. +func (o *NodePoolManagementUpgrade) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *NodePoolManagementUpgrade) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *NodePoolManagementUpgrade) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *NodePoolManagementUpgrade) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *NodePoolManagementUpgrade) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodePoolManagementUpgrade) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// MaxSurge returns the value of the 'max_surge' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Maximum number of nodes in the NodePool of a ROSA HCP cluster that can be scheduled above the desired number of nodes during the upgrade. +func (o *NodePoolManagementUpgrade) MaxSurge() string { + if o != nil && o.bitmap_&8 != 0 { + return o.maxSurge + } + return "" +} + +// GetMaxSurge returns the value of the 'max_surge' attribute and +// a flag indicating if the attribute has a value. +// +// Maximum number of nodes in the NodePool of a ROSA HCP cluster that can be scheduled above the desired number of nodes during the upgrade. +func (o *NodePoolManagementUpgrade) GetMaxSurge() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.maxSurge + } + return +} + +// MaxUnavailable returns the value of the 'max_unavailable' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Maximum number of nodes in the NodePool of a ROSA HCP cluster that can be unavailable during the upgrade. +func (o *NodePoolManagementUpgrade) MaxUnavailable() string { + if o != nil && o.bitmap_&16 != 0 { + return o.maxUnavailable + } + return "" +} + +// GetMaxUnavailable returns the value of the 'max_unavailable' attribute and +// a flag indicating if the attribute has a value. +// +// Maximum number of nodes in the NodePool of a ROSA HCP cluster that can be unavailable during the upgrade. +func (o *NodePoolManagementUpgrade) GetMaxUnavailable() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.maxUnavailable + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Type of strategy for handling upgrades. +func (o *NodePoolManagementUpgrade) Type() string { + if o != nil && o.bitmap_&32 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +// +// Type of strategy for handling upgrades. +func (o *NodePoolManagementUpgrade) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.type_ + } + return +} + +// NodePoolManagementUpgradeListKind is the name of the type used to represent list of objects of +// type 'node_pool_management_upgrade'. +const NodePoolManagementUpgradeListKind = "NodePoolManagementUpgradeList" + +// NodePoolManagementUpgradeListLinkKind is the name of the type used to represent links to list +// of objects of type 'node_pool_management_upgrade'. +const NodePoolManagementUpgradeListLinkKind = "NodePoolManagementUpgradeListLink" + +// NodePoolManagementUpgradeNilKind is the name of the type used to nil lists of objects of +// type 'node_pool_management_upgrade'. +const NodePoolManagementUpgradeListNilKind = "NodePoolManagementUpgradeListNil" + +// NodePoolManagementUpgradeList is a list of values of the 'node_pool_management_upgrade' type. +type NodePoolManagementUpgradeList struct { + href string + link bool + items []*NodePoolManagementUpgrade +} + +// Kind returns the name of the type of the object. +func (l *NodePoolManagementUpgradeList) Kind() string { + if l == nil { + return NodePoolManagementUpgradeListNilKind + } + if l.link { + return NodePoolManagementUpgradeListLinkKind + } + return NodePoolManagementUpgradeListKind +} + +// Link returns true iif this is a link. +func (l *NodePoolManagementUpgradeList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *NodePoolManagementUpgradeList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *NodePoolManagementUpgradeList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *NodePoolManagementUpgradeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodePoolManagementUpgradeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodePoolManagementUpgradeList) Get(i int) *NodePoolManagementUpgrade { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodePoolManagementUpgradeList) Slice() []*NodePoolManagementUpgrade { + var slice []*NodePoolManagementUpgrade + if l == nil { + slice = make([]*NodePoolManagementUpgrade, 0) + } else { + slice = make([]*NodePoolManagementUpgrade, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodePoolManagementUpgradeList) Each(f func(item *NodePoolManagementUpgrade) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodePoolManagementUpgradeList) Range(f func(index int, item *NodePoolManagementUpgrade) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/node_pool_management_upgrade_type_json.go b/clustersmgmt/v2alpha1/node_pool_management_upgrade_type_json.go new file mode 100644 index 00000000..7bb67161 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_management_upgrade_type_json.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolManagementUpgrade writes a value of the 'node_pool_management_upgrade' type to the given writer. +func MarshalNodePoolManagementUpgrade(object *NodePoolManagementUpgrade, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolManagementUpgrade(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolManagementUpgrade writes a value of the 'node_pool_management_upgrade' type to the given stream. +func writeNodePoolManagementUpgrade(object *NodePoolManagementUpgrade, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(NodePoolManagementUpgradeLinkKind) + } else { + stream.WriteString(NodePoolManagementUpgradeKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_surge") + stream.WriteString(object.maxSurge) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_unavailable") + stream.WriteString(object.maxUnavailable) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodePoolManagementUpgrade reads a value of the 'node_pool_management_upgrade' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodePoolManagementUpgrade(source interface{}) (object *NodePoolManagementUpgrade, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodePoolManagementUpgrade(iterator) + err = iterator.Error + return +} + +// readNodePoolManagementUpgrade reads a value of the 'node_pool_management_upgrade' type from the given iterator. +func readNodePoolManagementUpgrade(iterator *jsoniter.Iterator) *NodePoolManagementUpgrade { + object := &NodePoolManagementUpgrade{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == NodePoolManagementUpgradeLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "max_surge": + value := iterator.ReadString() + object.maxSurge = value + object.bitmap_ |= 8 + case "max_unavailable": + value := iterator.ReadString() + object.maxUnavailable = value + object.bitmap_ |= 16 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/node_pool_resource_json.go b/clustersmgmt/v2alpha1/node_pool_resource_json.go new file mode 100644 index 00000000..75b268d4 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeNodePoolDeleteRequest(request *NodePoolDeleteRequest, writer io.Writer) error { + return nil +} +func readNodePoolDeleteResponse(response *NodePoolDeleteResponse, reader io.Reader) error { + return nil +} +func writeNodePoolGetRequest(request *NodePoolGetRequest, writer io.Writer) error { + return nil +} +func readNodePoolGetResponse(response *NodePoolGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodePool(reader) + return err +} +func writeNodePoolUpdateRequest(request *NodePoolUpdateRequest, writer io.Writer) error { + return MarshalNodePool(request.body, writer) +} +func readNodePoolUpdateResponse(response *NodePoolUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodePool(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/node_pool_status_builder.go b/clustersmgmt/v2alpha1/node_pool_status_builder.go new file mode 100644 index 00000000..21021a43 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_status_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolStatusBuilder contains the data and logic needed to build 'node_pool_status' objects. +// +// Representation of the status of a node pool. +type NodePoolStatusBuilder struct { + bitmap_ uint32 + id string + href string + currentReplicas int + message string +} + +// NewNodePoolStatus creates a new builder of 'node_pool_status' objects. +func NewNodePoolStatus() *NodePoolStatusBuilder { + return &NodePoolStatusBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *NodePoolStatusBuilder) Link(value bool) *NodePoolStatusBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *NodePoolStatusBuilder) ID(value string) *NodePoolStatusBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *NodePoolStatusBuilder) HREF(value string) *NodePoolStatusBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodePoolStatusBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// CurrentReplicas sets the value of the 'current_replicas' attribute to the given value. +func (b *NodePoolStatusBuilder) CurrentReplicas(value int) *NodePoolStatusBuilder { + b.currentReplicas = value + b.bitmap_ |= 8 + return b +} + +// Message sets the value of the 'message' attribute to the given value. +func (b *NodePoolStatusBuilder) Message(value string) *NodePoolStatusBuilder { + b.message = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodePoolStatusBuilder) Copy(object *NodePoolStatus) *NodePoolStatusBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.currentReplicas = object.currentReplicas + b.message = object.message + return b +} + +// Build creates a 'node_pool_status' object using the configuration stored in the builder. +func (b *NodePoolStatusBuilder) Build() (object *NodePoolStatus, err error) { + object = new(NodePoolStatus) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.currentReplicas = b.currentReplicas + object.message = b.message + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_status_list_builder.go b/clustersmgmt/v2alpha1/node_pool_status_list_builder.go new file mode 100644 index 00000000..c29dc619 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_status_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolStatusListBuilder contains the data and logic needed to build +// 'node_pool_status' objects. +type NodePoolStatusListBuilder struct { + items []*NodePoolStatusBuilder +} + +// NewNodePoolStatusList creates a new builder of 'node_pool_status' objects. +func NewNodePoolStatusList() *NodePoolStatusListBuilder { + return new(NodePoolStatusListBuilder) +} + +// Items sets the items of the list. +func (b *NodePoolStatusListBuilder) Items(values ...*NodePoolStatusBuilder) *NodePoolStatusListBuilder { + b.items = make([]*NodePoolStatusBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodePoolStatusListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodePoolStatusListBuilder) Copy(list *NodePoolStatusList) *NodePoolStatusListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodePoolStatusBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodePoolStatus().Copy(v) + } + } + return b +} + +// Build creates a list of 'node_pool_status' objects using the +// configuration stored in the builder. +func (b *NodePoolStatusListBuilder) Build() (list *NodePoolStatusList, err error) { + items := make([]*NodePoolStatus, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodePoolStatusList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_status_list_type_json.go b/clustersmgmt/v2alpha1/node_pool_status_list_type_json.go new file mode 100644 index 00000000..0f2e5955 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_status_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolStatusList writes a list of values of the 'node_pool_status' type to +// the given writer. +func MarshalNodePoolStatusList(list []*NodePoolStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolStatusList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolStatusList writes a list of value of the 'node_pool_status' type to +// the given stream. +func writeNodePoolStatusList(list []*NodePoolStatus, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodePoolStatus(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodePoolStatusList reads a list of values of the 'node_pool_status' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodePoolStatusList(source interface{}) (items []*NodePoolStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodePoolStatusList(iterator) + err = iterator.Error + return +} + +// readNodePoolStatusList reads list of values of the ”node_pool_status' type from +// the given iterator. +func readNodePoolStatusList(iterator *jsoniter.Iterator) []*NodePoolStatus { + list := []*NodePoolStatus{} + for iterator.ReadArray() { + item := readNodePoolStatus(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_pool_status_type.go b/clustersmgmt/v2alpha1/node_pool_status_type.go new file mode 100644 index 00000000..aa1f0f5d --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_status_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolStatusKind is the name of the type used to represent objects +// of type 'node_pool_status'. +const NodePoolStatusKind = "NodePoolStatus" + +// NodePoolStatusLinkKind is the name of the type used to represent links +// to objects of type 'node_pool_status'. +const NodePoolStatusLinkKind = "NodePoolStatusLink" + +// NodePoolStatusNilKind is the name of the type used to nil references +// to objects of type 'node_pool_status'. +const NodePoolStatusNilKind = "NodePoolStatusNil" + +// NodePoolStatus represents the values of the 'node_pool_status' type. +// +// Representation of the status of a node pool. +type NodePoolStatus struct { + bitmap_ uint32 + id string + href string + currentReplicas int + message string +} + +// Kind returns the name of the type of the object. +func (o *NodePoolStatus) Kind() string { + if o == nil { + return NodePoolStatusNilKind + } + if o.bitmap_&1 != 0 { + return NodePoolStatusLinkKind + } + return NodePoolStatusKind +} + +// Link returns true iif this is a link. +func (o *NodePoolStatus) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *NodePoolStatus) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *NodePoolStatus) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *NodePoolStatus) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *NodePoolStatus) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodePoolStatus) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// CurrentReplicas returns the value of the 'current_replicas' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The current number of replicas for the node pool. +func (o *NodePoolStatus) CurrentReplicas() int { + if o != nil && o.bitmap_&8 != 0 { + return o.currentReplicas + } + return 0 +} + +// GetCurrentReplicas returns the value of the 'current_replicas' attribute and +// a flag indicating if the attribute has a value. +// +// The current number of replicas for the node pool. +func (o *NodePoolStatus) GetCurrentReplicas() (value int, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.currentReplicas + } + return +} + +// Message returns the value of the 'message' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Adds additional information about the NodePool status when the node pool doesn't reach the desired replicas. +func (o *NodePoolStatus) Message() string { + if o != nil && o.bitmap_&16 != 0 { + return o.message + } + return "" +} + +// GetMessage returns the value of the 'message' attribute and +// a flag indicating if the attribute has a value. +// +// Adds additional information about the NodePool status when the node pool doesn't reach the desired replicas. +func (o *NodePoolStatus) GetMessage() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.message + } + return +} + +// NodePoolStatusListKind is the name of the type used to represent list of objects of +// type 'node_pool_status'. +const NodePoolStatusListKind = "NodePoolStatusList" + +// NodePoolStatusListLinkKind is the name of the type used to represent links to list +// of objects of type 'node_pool_status'. +const NodePoolStatusListLinkKind = "NodePoolStatusListLink" + +// NodePoolStatusNilKind is the name of the type used to nil lists of objects of +// type 'node_pool_status'. +const NodePoolStatusListNilKind = "NodePoolStatusListNil" + +// NodePoolStatusList is a list of values of the 'node_pool_status' type. +type NodePoolStatusList struct { + href string + link bool + items []*NodePoolStatus +} + +// Kind returns the name of the type of the object. +func (l *NodePoolStatusList) Kind() string { + if l == nil { + return NodePoolStatusListNilKind + } + if l.link { + return NodePoolStatusListLinkKind + } + return NodePoolStatusListKind +} + +// Link returns true iif this is a link. +func (l *NodePoolStatusList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *NodePoolStatusList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *NodePoolStatusList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *NodePoolStatusList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodePoolStatusList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodePoolStatusList) Get(i int) *NodePoolStatus { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodePoolStatusList) Slice() []*NodePoolStatus { + var slice []*NodePoolStatus + if l == nil { + slice = make([]*NodePoolStatus, 0) + } else { + slice = make([]*NodePoolStatus, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodePoolStatusList) Each(f func(item *NodePoolStatus) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodePoolStatusList) Range(f func(index int, item *NodePoolStatus) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/node_pool_status_type_json.go b/clustersmgmt/v2alpha1/node_pool_status_type_json.go new file mode 100644 index 00000000..6988ca94 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_status_type_json.go @@ -0,0 +1,133 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolStatus writes a value of the 'node_pool_status' type to the given writer. +func MarshalNodePoolStatus(object *NodePoolStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolStatus(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolStatus writes a value of the 'node_pool_status' type to the given stream. +func writeNodePoolStatus(object *NodePoolStatus, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(NodePoolStatusLinkKind) + } else { + stream.WriteString(NodePoolStatusKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("current_replicas") + stream.WriteInt(object.currentReplicas) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("message") + stream.WriteString(object.message) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodePoolStatus reads a value of the 'node_pool_status' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodePoolStatus(source interface{}) (object *NodePoolStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodePoolStatus(iterator) + err = iterator.Error + return +} + +// readNodePoolStatus reads a value of the 'node_pool_status' type from the given iterator. +func readNodePoolStatus(iterator *jsoniter.Iterator) *NodePoolStatus { + object := &NodePoolStatus{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == NodePoolStatusLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "current_replicas": + value := iterator.ReadInt() + object.currentReplicas = value + object.bitmap_ |= 8 + case "message": + value := iterator.ReadString() + object.message = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/node_pool_type.go b/clustersmgmt/v2alpha1/node_pool_type.go new file mode 100644 index 00000000..0185e520 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_type.go @@ -0,0 +1,582 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolKind is the name of the type used to represent objects +// of type 'node_pool'. +const NodePoolKind = "NodePool" + +// NodePoolLinkKind is the name of the type used to represent links +// to objects of type 'node_pool'. +const NodePoolLinkKind = "NodePoolLink" + +// NodePoolNilKind is the name of the type used to nil references +// to objects of type 'node_pool'. +const NodePoolNilKind = "NodePoolNil" + +// NodePool represents the values of the 'node_pool' type. +// +// Representation of a node pool in a cluster. +type NodePool struct { + bitmap_ uint32 + id string + href string + awsNodePool *AWSNodePool + autoscaling *NodePoolAutoscaling + availabilityZone string + azureNodePool *AzureNodePool + kubeletConfigs []string + labels map[string]string + managementUpgrade *NodePoolManagementUpgrade + nodeDrainGracePeriod *Value + replicas int + status *NodePoolStatus + subnet string + taints []*Taint + tuningConfigs []string + version *Version + autoRepair bool +} + +// Kind returns the name of the type of the object. +func (o *NodePool) Kind() string { + if o == nil { + return NodePoolNilKind + } + if o.bitmap_&1 != 0 { + return NodePoolLinkKind + } + return NodePoolKind +} + +// Link returns true iif this is a link. +func (o *NodePool) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *NodePool) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *NodePool) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *NodePool) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *NodePool) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodePool) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AWSNodePool returns the value of the 'AWS_node_pool' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS specific parameters (Optional). +func (o *NodePool) AWSNodePool() *AWSNodePool { + if o != nil && o.bitmap_&8 != 0 { + return o.awsNodePool + } + return nil +} + +// GetAWSNodePool returns the value of the 'AWS_node_pool' attribute and +// a flag indicating if the attribute has a value. +// +// AWS specific parameters (Optional). +func (o *NodePool) GetAWSNodePool() (value *AWSNodePool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.awsNodePool + } + return +} + +// AutoRepair returns the value of the 'auto_repair' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Specifies whether health checks should be enabled for machines in the NodePool. +func (o *NodePool) AutoRepair() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.autoRepair + } + return false +} + +// GetAutoRepair returns the value of the 'auto_repair' attribute and +// a flag indicating if the attribute has a value. +// +// Specifies whether health checks should be enabled for machines in the NodePool. +func (o *NodePool) GetAutoRepair() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.autoRepair + } + return +} + +// Autoscaling returns the value of the 'autoscaling' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Details for auto-scaling the machine pool. +// Replicas and autoscaling cannot be used together. +func (o *NodePool) Autoscaling() *NodePoolAutoscaling { + if o != nil && o.bitmap_&32 != 0 { + return o.autoscaling + } + return nil +} + +// GetAutoscaling returns the value of the 'autoscaling' attribute and +// a flag indicating if the attribute has a value. +// +// Details for auto-scaling the machine pool. +// Replicas and autoscaling cannot be used together. +func (o *NodePool) GetAutoscaling() (value *NodePoolAutoscaling, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.autoscaling + } + return +} + +// AvailabilityZone returns the value of the 'availability_zone' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The availability zone upon which the node is created. +func (o *NodePool) AvailabilityZone() string { + if o != nil && o.bitmap_&64 != 0 { + return o.availabilityZone + } + return "" +} + +// GetAvailabilityZone returns the value of the 'availability_zone' attribute and +// a flag indicating if the attribute has a value. +// +// The availability zone upon which the node is created. +func (o *NodePool) GetAvailabilityZone() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.availabilityZone + } + return +} + +// AzureNodePool returns the value of the 'azure_node_pool' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Azure specific parameters. +func (o *NodePool) AzureNodePool() *AzureNodePool { + if o != nil && o.bitmap_&128 != 0 { + return o.azureNodePool + } + return nil +} + +// GetAzureNodePool returns the value of the 'azure_node_pool' attribute and +// a flag indicating if the attribute has a value. +// +// Azure specific parameters. +func (o *NodePool) GetAzureNodePool() (value *AzureNodePool, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.azureNodePool + } + return +} + +// KubeletConfigs returns the value of the 'kubelet_configs' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The names of the KubeletConfigs for this node pool. +func (o *NodePool) KubeletConfigs() []string { + if o != nil && o.bitmap_&256 != 0 { + return o.kubeletConfigs + } + return nil +} + +// GetKubeletConfigs returns the value of the 'kubelet_configs' attribute and +// a flag indicating if the attribute has a value. +// +// The names of the KubeletConfigs for this node pool. +func (o *NodePool) GetKubeletConfigs() (value []string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.kubeletConfigs + } + return +} + +// Labels returns the value of the 'labels' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The labels set on the Nodes created. +func (o *NodePool) Labels() map[string]string { + if o != nil && o.bitmap_&512 != 0 { + return o.labels + } + return nil +} + +// GetLabels returns the value of the 'labels' attribute and +// a flag indicating if the attribute has a value. +// +// The labels set on the Nodes created. +func (o *NodePool) GetLabels() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.labels + } + return +} + +// ManagementUpgrade returns the value of the 'management_upgrade' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Management parameters (Optional). +func (o *NodePool) ManagementUpgrade() *NodePoolManagementUpgrade { + if o != nil && o.bitmap_&1024 != 0 { + return o.managementUpgrade + } + return nil +} + +// GetManagementUpgrade returns the value of the 'management_upgrade' attribute and +// a flag indicating if the attribute has a value. +// +// Management parameters (Optional). +func (o *NodePool) GetManagementUpgrade() (value *NodePoolManagementUpgrade, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.managementUpgrade + } + return +} + +// NodeDrainGracePeriod returns the value of the 'node_drain_grace_period' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Time to wait for a NodePool to drain when it is upgraded or replaced before it is forcibly removed. +func (o *NodePool) NodeDrainGracePeriod() *Value { + if o != nil && o.bitmap_&2048 != 0 { + return o.nodeDrainGracePeriod + } + return nil +} + +// GetNodeDrainGracePeriod returns the value of the 'node_drain_grace_period' attribute and +// a flag indicating if the attribute has a value. +// +// Time to wait for a NodePool to drain when it is upgraded or replaced before it is forcibly removed. +func (o *NodePool) GetNodeDrainGracePeriod() (value *Value, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.nodeDrainGracePeriod + } + return +} + +// Replicas returns the value of the 'replicas' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The number of Machines (and Nodes) to create. +// Replicas and autoscaling cannot be used together. +func (o *NodePool) Replicas() int { + if o != nil && o.bitmap_&4096 != 0 { + return o.replicas + } + return 0 +} + +// GetReplicas returns the value of the 'replicas' attribute and +// a flag indicating if the attribute has a value. +// +// The number of Machines (and Nodes) to create. +// Replicas and autoscaling cannot be used together. +func (o *NodePool) GetReplicas() (value int, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.replicas + } + return +} + +// Status returns the value of the 'status' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// NodePool status. +func (o *NodePool) Status() *NodePoolStatus { + if o != nil && o.bitmap_&8192 != 0 { + return o.status + } + return nil +} + +// GetStatus returns the value of the 'status' attribute and +// a flag indicating if the attribute has a value. +// +// NodePool status. +func (o *NodePool) GetStatus() (value *NodePoolStatus, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.status + } + return +} + +// Subnet returns the value of the 'subnet' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The subnet upon which the nodes are created. +func (o *NodePool) Subnet() string { + if o != nil && o.bitmap_&16384 != 0 { + return o.subnet + } + return "" +} + +// GetSubnet returns the value of the 'subnet' attribute and +// a flag indicating if the attribute has a value. +// +// The subnet upon which the nodes are created. +func (o *NodePool) GetSubnet() (value string, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.subnet + } + return +} + +// Taints returns the value of the 'taints' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The taints set on the Nodes created. +func (o *NodePool) Taints() []*Taint { + if o != nil && o.bitmap_&32768 != 0 { + return o.taints + } + return nil +} + +// GetTaints returns the value of the 'taints' attribute and +// a flag indicating if the attribute has a value. +// +// The taints set on the Nodes created. +func (o *NodePool) GetTaints() (value []*Taint, ok bool) { + ok = o != nil && o.bitmap_&32768 != 0 + if ok { + value = o.taints + } + return +} + +// TuningConfigs returns the value of the 'tuning_configs' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The names of the tuning configs for this node pool. +func (o *NodePool) TuningConfigs() []string { + if o != nil && o.bitmap_&65536 != 0 { + return o.tuningConfigs + } + return nil +} + +// GetTuningConfigs returns the value of the 'tuning_configs' attribute and +// a flag indicating if the attribute has a value. +// +// The names of the tuning configs for this node pool. +func (o *NodePool) GetTuningConfigs() (value []string, ok bool) { + ok = o != nil && o.bitmap_&65536 != 0 + if ok { + value = o.tuningConfigs + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version of the node pool. +func (o *NodePool) Version() *Version { + if o != nil && o.bitmap_&131072 != 0 { + return o.version + } + return nil +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Version of the node pool. +func (o *NodePool) GetVersion() (value *Version, ok bool) { + ok = o != nil && o.bitmap_&131072 != 0 + if ok { + value = o.version + } + return +} + +// NodePoolListKind is the name of the type used to represent list of objects of +// type 'node_pool'. +const NodePoolListKind = "NodePoolList" + +// NodePoolListLinkKind is the name of the type used to represent links to list +// of objects of type 'node_pool'. +const NodePoolListLinkKind = "NodePoolListLink" + +// NodePoolNilKind is the name of the type used to nil lists of objects of +// type 'node_pool'. +const NodePoolListNilKind = "NodePoolListNil" + +// NodePoolList is a list of values of the 'node_pool' type. +type NodePoolList struct { + href string + link bool + items []*NodePool +} + +// Kind returns the name of the type of the object. +func (l *NodePoolList) Kind() string { + if l == nil { + return NodePoolListNilKind + } + if l.link { + return NodePoolListLinkKind + } + return NodePoolListKind +} + +// Link returns true iif this is a link. +func (l *NodePoolList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *NodePoolList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *NodePoolList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *NodePoolList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodePoolList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodePoolList) Get(i int) *NodePool { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodePoolList) Slice() []*NodePool { + var slice []*NodePool + if l == nil { + slice = make([]*NodePool, 0) + } else { + slice = make([]*NodePool, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodePoolList) Each(f func(item *NodePool) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodePoolList) Range(f func(index int, item *NodePool) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/node_pool_type_json.go b/clustersmgmt/v2alpha1/node_pool_type_json.go new file mode 100644 index 00000000..beebff7e --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_type_json.go @@ -0,0 +1,331 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePool writes a value of the 'node_pool' type to the given writer. +func MarshalNodePool(object *NodePool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePool(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePool writes a value of the 'node_pool' type to the given stream. +func writeNodePool(object *NodePool, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(NodePoolLinkKind) + } else { + stream.WriteString(NodePoolKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.awsNodePool != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws_node_pool") + writeAWSNodePool(object.awsNodePool, stream) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("auto_repair") + stream.WriteBool(object.autoRepair) + count++ + } + present_ = object.bitmap_&32 != 0 && object.autoscaling != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("autoscaling") + writeNodePoolAutoscaling(object.autoscaling, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zone") + stream.WriteString(object.availabilityZone) + count++ + } + present_ = object.bitmap_&128 != 0 && object.azureNodePool != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("azure_node_pool") + writeAzureNodePool(object.azureNodePool, stream) + count++ + } + present_ = object.bitmap_&256 != 0 && object.kubeletConfigs != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kubelet_configs") + writeStringList(object.kubeletConfigs, stream) + count++ + } + present_ = object.bitmap_&512 != 0 && object.labels != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("labels") + if object.labels != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.labels)) + i := 0 + for key := range object.labels { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.labels[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&1024 != 0 && object.managementUpgrade != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("management_upgrade") + writeNodePoolManagementUpgrade(object.managementUpgrade, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.nodeDrainGracePeriod != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("node_drain_grace_period") + writeValue(object.nodeDrainGracePeriod, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("replicas") + stream.WriteInt(object.replicas) + count++ + } + present_ = object.bitmap_&8192 != 0 && object.status != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("status") + writeNodePoolStatus(object.status, stream) + count++ + } + present_ = object.bitmap_&16384 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnet") + stream.WriteString(object.subnet) + count++ + } + present_ = object.bitmap_&32768 != 0 && object.taints != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("taints") + writeTaintList(object.taints, stream) + count++ + } + present_ = object.bitmap_&65536 != 0 && object.tuningConfigs != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tuning_configs") + writeStringList(object.tuningConfigs, stream) + count++ + } + present_ = object.bitmap_&131072 != 0 && object.version != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + writeVersion(object.version, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodePool reads a value of the 'node_pool' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodePool(source interface{}) (object *NodePool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodePool(iterator) + err = iterator.Error + return +} + +// readNodePool reads a value of the 'node_pool' type from the given iterator. +func readNodePool(iterator *jsoniter.Iterator) *NodePool { + object := &NodePool{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == NodePoolLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "aws_node_pool": + value := readAWSNodePool(iterator) + object.awsNodePool = value + object.bitmap_ |= 8 + case "auto_repair": + value := iterator.ReadBool() + object.autoRepair = value + object.bitmap_ |= 16 + case "autoscaling": + value := readNodePoolAutoscaling(iterator) + object.autoscaling = value + object.bitmap_ |= 32 + case "availability_zone": + value := iterator.ReadString() + object.availabilityZone = value + object.bitmap_ |= 64 + case "azure_node_pool": + value := readAzureNodePool(iterator) + object.azureNodePool = value + object.bitmap_ |= 128 + case "kubelet_configs": + value := readStringList(iterator) + object.kubeletConfigs = value + object.bitmap_ |= 256 + case "labels": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.labels = value + object.bitmap_ |= 512 + case "management_upgrade": + value := readNodePoolManagementUpgrade(iterator) + object.managementUpgrade = value + object.bitmap_ |= 1024 + case "node_drain_grace_period": + value := readValue(iterator) + object.nodeDrainGracePeriod = value + object.bitmap_ |= 2048 + case "replicas": + value := iterator.ReadInt() + object.replicas = value + object.bitmap_ |= 4096 + case "status": + value := readNodePoolStatus(iterator) + object.status = value + object.bitmap_ |= 8192 + case "subnet": + value := iterator.ReadString() + object.subnet = value + object.bitmap_ |= 16384 + case "taints": + value := readTaintList(iterator) + object.taints = value + object.bitmap_ |= 32768 + case "tuning_configs": + value := readStringList(iterator) + object.tuningConfigs = value + object.bitmap_ |= 65536 + case "version": + value := readVersion(iterator) + object.version = value + object.bitmap_ |= 131072 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policies_client.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policies_client.go new file mode 100644 index 00000000..a3e66a57 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policies_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NodePoolUpgradePoliciesClient is the client of the 'node_pool_upgrade_policies' resource. +// +// Manages the collection of upgrade policies for the node pool of a cluster. +type NodePoolUpgradePoliciesClient struct { + transport http.RoundTripper + path string +} + +// NewNodePoolUpgradePoliciesClient creates a new client for the 'node_pool_upgrade_policies' +// resource using the given transport to send the requests and receive the +// responses. +func NewNodePoolUpgradePoliciesClient(transport http.RoundTripper, path string) *NodePoolUpgradePoliciesClient { + return &NodePoolUpgradePoliciesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new upgrade policy to the node pool of the cluster. +func (c *NodePoolUpgradePoliciesClient) Add() *NodePoolUpgradePoliciesAddRequest { + return &NodePoolUpgradePoliciesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of upgrade policies for the node pool. +func (c *NodePoolUpgradePoliciesClient) List() *NodePoolUpgradePoliciesListRequest { + return &NodePoolUpgradePoliciesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// NodePoolUpgradePolicy returns the target 'node_pool_upgrade_policy' resource for the given identifier. +// +// Reference to the service that manages an specific upgrade policy for the node pool. +func (c *NodePoolUpgradePoliciesClient) NodePoolUpgradePolicy(id string) *NodePoolUpgradePolicyClient { + return NewNodePoolUpgradePolicyClient( + c.transport, + path.Join(c.path, id), + ) +} + +// NodePoolUpgradePoliciesAddRequest is the request for the 'add' method. +type NodePoolUpgradePoliciesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *NodePoolUpgradePolicy +} + +// Parameter adds a query parameter. +func (r *NodePoolUpgradePoliciesAddRequest) Parameter(name string, value interface{}) *NodePoolUpgradePoliciesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolUpgradePoliciesAddRequest) Header(name string, value interface{}) *NodePoolUpgradePoliciesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolUpgradePoliciesAddRequest) Impersonate(user string) *NodePoolUpgradePoliciesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *NodePoolUpgradePoliciesAddRequest) Body(value *NodePoolUpgradePolicy) *NodePoolUpgradePoliciesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolUpgradePoliciesAddRequest) Send() (result *NodePoolUpgradePoliciesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolUpgradePoliciesAddRequest) SendContext(ctx context.Context) (result *NodePoolUpgradePoliciesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeNodePoolUpgradePoliciesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolUpgradePoliciesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolUpgradePoliciesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolUpgradePoliciesAddResponse is the response for the 'add' method. +type NodePoolUpgradePoliciesAddResponse struct { + status int + header http.Header + err *errors.Error + body *NodePoolUpgradePolicy +} + +// Status returns the response status code. +func (r *NodePoolUpgradePoliciesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolUpgradePoliciesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolUpgradePoliciesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *NodePoolUpgradePoliciesAddResponse) Body() *NodePoolUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the upgrade policy. +func (r *NodePoolUpgradePoliciesAddResponse) GetBody() (value *NodePoolUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// NodePoolUpgradePoliciesListRequest is the request for the 'list' method. +type NodePoolUpgradePoliciesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *NodePoolUpgradePoliciesListRequest) Parameter(name string, value interface{}) *NodePoolUpgradePoliciesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolUpgradePoliciesListRequest) Header(name string, value interface{}) *NodePoolUpgradePoliciesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolUpgradePoliciesListRequest) Impersonate(user string) *NodePoolUpgradePoliciesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *NodePoolUpgradePoliciesListRequest) Page(value int) *NodePoolUpgradePoliciesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *NodePoolUpgradePoliciesListRequest) Size(value int) *NodePoolUpgradePoliciesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolUpgradePoliciesListRequest) Send() (result *NodePoolUpgradePoliciesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolUpgradePoliciesListRequest) SendContext(ctx context.Context) (result *NodePoolUpgradePoliciesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolUpgradePoliciesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolUpgradePoliciesListResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolUpgradePoliciesListResponse is the response for the 'list' method. +type NodePoolUpgradePoliciesListResponse struct { + status int + header http.Header + err *errors.Error + items *NodePoolUpgradePolicyList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *NodePoolUpgradePoliciesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolUpgradePoliciesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolUpgradePoliciesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of upgrade policy. +func (r *NodePoolUpgradePoliciesListResponse) Items() *NodePoolUpgradePolicyList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of upgrade policy. +func (r *NodePoolUpgradePoliciesListResponse) GetItems() (value *NodePoolUpgradePolicyList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *NodePoolUpgradePoliciesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *NodePoolUpgradePoliciesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *NodePoolUpgradePoliciesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *NodePoolUpgradePoliciesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *NodePoolUpgradePoliciesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *NodePoolUpgradePoliciesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policies_resource_json.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policies_resource_json.go new file mode 100644 index 00000000..cdefac41 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policies_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeNodePoolUpgradePoliciesAddRequest(request *NodePoolUpgradePoliciesAddRequest, writer io.Writer) error { + return MarshalNodePoolUpgradePolicy(request.body, writer) +} +func readNodePoolUpgradePoliciesAddResponse(response *NodePoolUpgradePoliciesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodePoolUpgradePolicy(reader) + return err +} +func writeNodePoolUpgradePoliciesListRequest(request *NodePoolUpgradePoliciesListRequest, writer io.Writer) error { + return nil +} +func readNodePoolUpgradePoliciesListResponse(response *NodePoolUpgradePoliciesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readNodePoolUpgradePolicyList(iterator) + response.items = &NodePoolUpgradePolicyList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_builder.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_builder.go new file mode 100644 index 00000000..938a9cd3 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_builder.go @@ -0,0 +1,212 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// NodePoolUpgradePolicyBuilder contains the data and logic needed to build 'node_pool_upgrade_policy' objects. +// +// Representation of an upgrade policy that can be set for a node pool. +type NodePoolUpgradePolicyBuilder struct { + bitmap_ uint32 + id string + href string + clusterID string + creationTimestamp time.Time + lastUpdateTimestamp time.Time + nextRun time.Time + nodePoolID string + schedule string + scheduleType ScheduleType + state *UpgradePolicyStateBuilder + upgradeType UpgradeType + version string + enableMinorVersionUpgrades bool +} + +// NewNodePoolUpgradePolicy creates a new builder of 'node_pool_upgrade_policy' objects. +func NewNodePoolUpgradePolicy() *NodePoolUpgradePolicyBuilder { + return &NodePoolUpgradePolicyBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *NodePoolUpgradePolicyBuilder) Link(value bool) *NodePoolUpgradePolicyBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *NodePoolUpgradePolicyBuilder) ID(value string) *NodePoolUpgradePolicyBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *NodePoolUpgradePolicyBuilder) HREF(value string) *NodePoolUpgradePolicyBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodePoolUpgradePolicyBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ClusterID sets the value of the 'cluster_ID' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) ClusterID(value string) *NodePoolUpgradePolicyBuilder { + b.clusterID = value + b.bitmap_ |= 8 + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) CreationTimestamp(value time.Time) *NodePoolUpgradePolicyBuilder { + b.creationTimestamp = value + b.bitmap_ |= 16 + return b +} + +// EnableMinorVersionUpgrades sets the value of the 'enable_minor_version_upgrades' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) EnableMinorVersionUpgrades(value bool) *NodePoolUpgradePolicyBuilder { + b.enableMinorVersionUpgrades = value + b.bitmap_ |= 32 + return b +} + +// LastUpdateTimestamp sets the value of the 'last_update_timestamp' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) LastUpdateTimestamp(value time.Time) *NodePoolUpgradePolicyBuilder { + b.lastUpdateTimestamp = value + b.bitmap_ |= 64 + return b +} + +// NextRun sets the value of the 'next_run' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) NextRun(value time.Time) *NodePoolUpgradePolicyBuilder { + b.nextRun = value + b.bitmap_ |= 128 + return b +} + +// NodePoolID sets the value of the 'node_pool_ID' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) NodePoolID(value string) *NodePoolUpgradePolicyBuilder { + b.nodePoolID = value + b.bitmap_ |= 256 + return b +} + +// Schedule sets the value of the 'schedule' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) Schedule(value string) *NodePoolUpgradePolicyBuilder { + b.schedule = value + b.bitmap_ |= 512 + return b +} + +// ScheduleType sets the value of the 'schedule_type' attribute to the given value. +// +// ScheduleType defines which type of scheduling should be used for the upgrade policy. +func (b *NodePoolUpgradePolicyBuilder) ScheduleType(value ScheduleType) *NodePoolUpgradePolicyBuilder { + b.scheduleType = value + b.bitmap_ |= 1024 + return b +} + +// State sets the value of the 'state' attribute to the given value. +// +// Representation of an upgrade policy state that that is set for a cluster. +func (b *NodePoolUpgradePolicyBuilder) State(value *UpgradePolicyStateBuilder) *NodePoolUpgradePolicyBuilder { + b.state = value + if value != nil { + b.bitmap_ |= 2048 + } else { + b.bitmap_ &^= 2048 + } + return b +} + +// UpgradeType sets the value of the 'upgrade_type' attribute to the given value. +// +// UpgradeType defines which type of upgrade should be used. +func (b *NodePoolUpgradePolicyBuilder) UpgradeType(value UpgradeType) *NodePoolUpgradePolicyBuilder { + b.upgradeType = value + b.bitmap_ |= 4096 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +func (b *NodePoolUpgradePolicyBuilder) Version(value string) *NodePoolUpgradePolicyBuilder { + b.version = value + b.bitmap_ |= 8192 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodePoolUpgradePolicyBuilder) Copy(object *NodePoolUpgradePolicy) *NodePoolUpgradePolicyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.clusterID = object.clusterID + b.creationTimestamp = object.creationTimestamp + b.enableMinorVersionUpgrades = object.enableMinorVersionUpgrades + b.lastUpdateTimestamp = object.lastUpdateTimestamp + b.nextRun = object.nextRun + b.nodePoolID = object.nodePoolID + b.schedule = object.schedule + b.scheduleType = object.scheduleType + if object.state != nil { + b.state = NewUpgradePolicyState().Copy(object.state) + } else { + b.state = nil + } + b.upgradeType = object.upgradeType + b.version = object.version + return b +} + +// Build creates a 'node_pool_upgrade_policy' object using the configuration stored in the builder. +func (b *NodePoolUpgradePolicyBuilder) Build() (object *NodePoolUpgradePolicy, err error) { + object = new(NodePoolUpgradePolicy) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.clusterID = b.clusterID + object.creationTimestamp = b.creationTimestamp + object.enableMinorVersionUpgrades = b.enableMinorVersionUpgrades + object.lastUpdateTimestamp = b.lastUpdateTimestamp + object.nextRun = b.nextRun + object.nodePoolID = b.nodePoolID + object.schedule = b.schedule + object.scheduleType = b.scheduleType + if b.state != nil { + object.state, err = b.state.Build() + if err != nil { + return + } + } + object.upgradeType = b.upgradeType + object.version = b.version + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_client.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_client.go new file mode 100644 index 00000000..95033fe2 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NodePoolUpgradePolicyClient is the client of the 'node_pool_upgrade_policy' resource. +// +// Manages a specific upgrade policy for the node pool. +type NodePoolUpgradePolicyClient struct { + transport http.RoundTripper + path string +} + +// NewNodePoolUpgradePolicyClient creates a new client for the 'node_pool_upgrade_policy' +// resource using the given transport to send the requests and receive the +// responses. +func NewNodePoolUpgradePolicyClient(transport http.RoundTripper, path string) *NodePoolUpgradePolicyClient { + return &NodePoolUpgradePolicyClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the upgrade policy for the node pool. +func (c *NodePoolUpgradePolicyClient) Delete() *NodePoolUpgradePolicyDeleteRequest { + return &NodePoolUpgradePolicyDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the upgrade policy for the node pool. +func (c *NodePoolUpgradePolicyClient) Get() *NodePoolUpgradePolicyGetRequest { + return &NodePoolUpgradePolicyGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the upgrade policy for the node pool. +func (c *NodePoolUpgradePolicyClient) Update() *NodePoolUpgradePolicyUpdateRequest { + return &NodePoolUpgradePolicyUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// NodePoolUpgradePolicyPollRequest is the request for the Poll method. +type NodePoolUpgradePolicyPollRequest struct { + request *NodePoolUpgradePolicyGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *NodePoolUpgradePolicyPollRequest) Parameter(name string, value interface{}) *NodePoolUpgradePolicyPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *NodePoolUpgradePolicyPollRequest) Header(name string, value interface{}) *NodePoolUpgradePolicyPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *NodePoolUpgradePolicyPollRequest) Interval(value time.Duration) *NodePoolUpgradePolicyPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *NodePoolUpgradePolicyPollRequest) Status(value int) *NodePoolUpgradePolicyPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *NodePoolUpgradePolicyPollRequest) Predicate(value func(*NodePoolUpgradePolicyGetResponse) bool) *NodePoolUpgradePolicyPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*NodePoolUpgradePolicyGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *NodePoolUpgradePolicyPollRequest) StartContext(ctx context.Context) (response *NodePoolUpgradePolicyPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &NodePoolUpgradePolicyPollResponse{ + response: result.(*NodePoolUpgradePolicyGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *NodePoolUpgradePolicyPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// NodePoolUpgradePolicyPollResponse is the response for the Poll method. +type NodePoolUpgradePolicyPollResponse struct { + response *NodePoolUpgradePolicyGetResponse +} + +// Status returns the response status code. +func (r *NodePoolUpgradePolicyPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *NodePoolUpgradePolicyPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *NodePoolUpgradePolicyPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *NodePoolUpgradePolicyPollResponse) Body() *NodePoolUpgradePolicy { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodePoolUpgradePolicyPollResponse) GetBody() (value *NodePoolUpgradePolicy, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *NodePoolUpgradePolicyClient) Poll() *NodePoolUpgradePolicyPollRequest { + return &NodePoolUpgradePolicyPollRequest{ + request: c.Get(), + } +} + +// NodePoolUpgradePolicyDeleteRequest is the request for the 'delete' method. +type NodePoolUpgradePolicyDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *NodePoolUpgradePolicyDeleteRequest) Parameter(name string, value interface{}) *NodePoolUpgradePolicyDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolUpgradePolicyDeleteRequest) Header(name string, value interface{}) *NodePoolUpgradePolicyDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolUpgradePolicyDeleteRequest) Impersonate(user string) *NodePoolUpgradePolicyDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolUpgradePolicyDeleteRequest) Send() (result *NodePoolUpgradePolicyDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolUpgradePolicyDeleteRequest) SendContext(ctx context.Context) (result *NodePoolUpgradePolicyDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolUpgradePolicyDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// NodePoolUpgradePolicyDeleteResponse is the response for the 'delete' method. +type NodePoolUpgradePolicyDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *NodePoolUpgradePolicyDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolUpgradePolicyDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolUpgradePolicyDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// NodePoolUpgradePolicyGetRequest is the request for the 'get' method. +type NodePoolUpgradePolicyGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *NodePoolUpgradePolicyGetRequest) Parameter(name string, value interface{}) *NodePoolUpgradePolicyGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolUpgradePolicyGetRequest) Header(name string, value interface{}) *NodePoolUpgradePolicyGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolUpgradePolicyGetRequest) Impersonate(user string) *NodePoolUpgradePolicyGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolUpgradePolicyGetRequest) Send() (result *NodePoolUpgradePolicyGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolUpgradePolicyGetRequest) SendContext(ctx context.Context) (result *NodePoolUpgradePolicyGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolUpgradePolicyGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolUpgradePolicyGetResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolUpgradePolicyGetResponse is the response for the 'get' method. +type NodePoolUpgradePolicyGetResponse struct { + status int + header http.Header + err *errors.Error + body *NodePoolUpgradePolicy +} + +// Status returns the response status code. +func (r *NodePoolUpgradePolicyGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolUpgradePolicyGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolUpgradePolicyGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NodePoolUpgradePolicyGetResponse) Body() *NodePoolUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodePoolUpgradePolicyGetResponse) GetBody() (value *NodePoolUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// NodePoolUpgradePolicyUpdateRequest is the request for the 'update' method. +type NodePoolUpgradePolicyUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *NodePoolUpgradePolicy +} + +// Parameter adds a query parameter. +func (r *NodePoolUpgradePolicyUpdateRequest) Parameter(name string, value interface{}) *NodePoolUpgradePolicyUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolUpgradePolicyUpdateRequest) Header(name string, value interface{}) *NodePoolUpgradePolicyUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolUpgradePolicyUpdateRequest) Impersonate(user string) *NodePoolUpgradePolicyUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *NodePoolUpgradePolicyUpdateRequest) Body(value *NodePoolUpgradePolicy) *NodePoolUpgradePolicyUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolUpgradePolicyUpdateRequest) Send() (result *NodePoolUpgradePolicyUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolUpgradePolicyUpdateRequest) SendContext(ctx context.Context) (result *NodePoolUpgradePolicyUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeNodePoolUpgradePolicyUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolUpgradePolicyUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolUpgradePolicyUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolUpgradePolicyUpdateResponse is the response for the 'update' method. +type NodePoolUpgradePolicyUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *NodePoolUpgradePolicy +} + +// Status returns the response status code. +func (r *NodePoolUpgradePolicyUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolUpgradePolicyUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolUpgradePolicyUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NodePoolUpgradePolicyUpdateResponse) Body() *NodePoolUpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodePoolUpgradePolicyUpdateResponse) GetBody() (value *NodePoolUpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_list_builder.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_list_builder.go new file mode 100644 index 00000000..8a650ec4 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodePoolUpgradePolicyListBuilder contains the data and logic needed to build +// 'node_pool_upgrade_policy' objects. +type NodePoolUpgradePolicyListBuilder struct { + items []*NodePoolUpgradePolicyBuilder +} + +// NewNodePoolUpgradePolicyList creates a new builder of 'node_pool_upgrade_policy' objects. +func NewNodePoolUpgradePolicyList() *NodePoolUpgradePolicyListBuilder { + return new(NodePoolUpgradePolicyListBuilder) +} + +// Items sets the items of the list. +func (b *NodePoolUpgradePolicyListBuilder) Items(values ...*NodePoolUpgradePolicyBuilder) *NodePoolUpgradePolicyListBuilder { + b.items = make([]*NodePoolUpgradePolicyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodePoolUpgradePolicyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodePoolUpgradePolicyListBuilder) Copy(list *NodePoolUpgradePolicyList) *NodePoolUpgradePolicyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodePoolUpgradePolicyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodePoolUpgradePolicy().Copy(v) + } + } + return b +} + +// Build creates a list of 'node_pool_upgrade_policy' objects using the +// configuration stored in the builder. +func (b *NodePoolUpgradePolicyListBuilder) Build() (list *NodePoolUpgradePolicyList, err error) { + items := make([]*NodePoolUpgradePolicy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodePoolUpgradePolicyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_list_type_json.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_list_type_json.go new file mode 100644 index 00000000..47ef247f --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolUpgradePolicyList writes a list of values of the 'node_pool_upgrade_policy' type to +// the given writer. +func MarshalNodePoolUpgradePolicyList(list []*NodePoolUpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolUpgradePolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolUpgradePolicyList writes a list of value of the 'node_pool_upgrade_policy' type to +// the given stream. +func writeNodePoolUpgradePolicyList(list []*NodePoolUpgradePolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodePoolUpgradePolicy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodePoolUpgradePolicyList reads a list of values of the 'node_pool_upgrade_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodePoolUpgradePolicyList(source interface{}) (items []*NodePoolUpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodePoolUpgradePolicyList(iterator) + err = iterator.Error + return +} + +// readNodePoolUpgradePolicyList reads list of values of the ”node_pool_upgrade_policy' type from +// the given iterator. +func readNodePoolUpgradePolicyList(iterator *jsoniter.Iterator) []*NodePoolUpgradePolicy { + list := []*NodePoolUpgradePolicy{} + for iterator.ReadArray() { + item := readNodePoolUpgradePolicy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_resource_json.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_resource_json.go new file mode 100644 index 00000000..b91f64a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeNodePoolUpgradePolicyDeleteRequest(request *NodePoolUpgradePolicyDeleteRequest, writer io.Writer) error { + return nil +} +func readNodePoolUpgradePolicyDeleteResponse(response *NodePoolUpgradePolicyDeleteResponse, reader io.Reader) error { + return nil +} +func writeNodePoolUpgradePolicyGetRequest(request *NodePoolUpgradePolicyGetRequest, writer io.Writer) error { + return nil +} +func readNodePoolUpgradePolicyGetResponse(response *NodePoolUpgradePolicyGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodePoolUpgradePolicy(reader) + return err +} +func writeNodePoolUpgradePolicyUpdateRequest(request *NodePoolUpgradePolicyUpdateRequest, writer io.Writer) error { + return MarshalNodePoolUpgradePolicy(request.body, writer) +} +func readNodePoolUpgradePolicyUpdateResponse(response *NodePoolUpgradePolicyUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodePoolUpgradePolicy(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_type.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_type.go new file mode 100644 index 00000000..ec5560c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_type.go @@ -0,0 +1,486 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// NodePoolUpgradePolicyKind is the name of the type used to represent objects +// of type 'node_pool_upgrade_policy'. +const NodePoolUpgradePolicyKind = "NodePoolUpgradePolicy" + +// NodePoolUpgradePolicyLinkKind is the name of the type used to represent links +// to objects of type 'node_pool_upgrade_policy'. +const NodePoolUpgradePolicyLinkKind = "NodePoolUpgradePolicyLink" + +// NodePoolUpgradePolicyNilKind is the name of the type used to nil references +// to objects of type 'node_pool_upgrade_policy'. +const NodePoolUpgradePolicyNilKind = "NodePoolUpgradePolicyNil" + +// NodePoolUpgradePolicy represents the values of the 'node_pool_upgrade_policy' type. +// +// Representation of an upgrade policy that can be set for a node pool. +type NodePoolUpgradePolicy struct { + bitmap_ uint32 + id string + href string + clusterID string + creationTimestamp time.Time + lastUpdateTimestamp time.Time + nextRun time.Time + nodePoolID string + schedule string + scheduleType ScheduleType + state *UpgradePolicyState + upgradeType UpgradeType + version string + enableMinorVersionUpgrades bool +} + +// Kind returns the name of the type of the object. +func (o *NodePoolUpgradePolicy) Kind() string { + if o == nil { + return NodePoolUpgradePolicyNilKind + } + if o.bitmap_&1 != 0 { + return NodePoolUpgradePolicyLinkKind + } + return NodePoolUpgradePolicyKind +} + +// Link returns true iif this is a link. +func (o *NodePoolUpgradePolicy) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *NodePoolUpgradePolicy) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *NodePoolUpgradePolicy) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *NodePoolUpgradePolicy) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *NodePoolUpgradePolicy) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodePoolUpgradePolicy) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ClusterID returns the value of the 'cluster_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster ID this upgrade policy for node pool is defined for. +func (o *NodePoolUpgradePolicy) ClusterID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clusterID + } + return "" +} + +// GetClusterID returns the value of the 'cluster_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster ID this upgrade policy for node pool is defined for. +func (o *NodePoolUpgradePolicy) GetClusterID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clusterID + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Timestamp for creation of resource. +func (o *NodePoolUpgradePolicy) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Timestamp for creation of resource. +func (o *NodePoolUpgradePolicy) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// EnableMinorVersionUpgrades returns the value of the 'enable_minor_version_upgrades' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed). +func (o *NodePoolUpgradePolicy) EnableMinorVersionUpgrades() bool { + if o != nil && o.bitmap_&32 != 0 { + return o.enableMinorVersionUpgrades + } + return false +} + +// GetEnableMinorVersionUpgrades returns the value of the 'enable_minor_version_upgrades' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed). +func (o *NodePoolUpgradePolicy) GetEnableMinorVersionUpgrades() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.enableMinorVersionUpgrades + } + return +} + +// LastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Timestamp for last update that happened to resource. +func (o *NodePoolUpgradePolicy) LastUpdateTimestamp() time.Time { + if o != nil && o.bitmap_&64 != 0 { + return o.lastUpdateTimestamp + } + return time.Time{} +} + +// GetLastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Timestamp for last update that happened to resource. +func (o *NodePoolUpgradePolicy) GetLastUpdateTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.lastUpdateTimestamp + } + return +} + +// NextRun returns the value of the 'next_run' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Next time the upgrade should run. +func (o *NodePoolUpgradePolicy) NextRun() time.Time { + if o != nil && o.bitmap_&128 != 0 { + return o.nextRun + } + return time.Time{} +} + +// GetNextRun returns the value of the 'next_run' attribute and +// a flag indicating if the attribute has a value. +// +// Next time the upgrade should run. +func (o *NodePoolUpgradePolicy) GetNextRun() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.nextRun + } + return +} + +// NodePoolID returns the value of the 'node_pool_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Node Pool ID this upgrade policy is defined for. +func (o *NodePoolUpgradePolicy) NodePoolID() string { + if o != nil && o.bitmap_&256 != 0 { + return o.nodePoolID + } + return "" +} + +// GetNodePoolID returns the value of the 'node_pool_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Node Pool ID this upgrade policy is defined for. +func (o *NodePoolUpgradePolicy) GetNodePoolID() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.nodePoolID + } + return +} + +// Schedule returns the value of the 'schedule' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *NodePoolUpgradePolicy) Schedule() string { + if o != nil && o.bitmap_&512 != 0 { + return o.schedule + } + return "" +} + +// GetSchedule returns the value of the 'schedule' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *NodePoolUpgradePolicy) GetSchedule() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.schedule + } + return +} + +// ScheduleType returns the value of the 'schedule_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule type of the upgrade. +func (o *NodePoolUpgradePolicy) ScheduleType() ScheduleType { + if o != nil && o.bitmap_&1024 != 0 { + return o.scheduleType + } + return ScheduleType("") +} + +// GetScheduleType returns the value of the 'schedule_type' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule type of the upgrade. +func (o *NodePoolUpgradePolicy) GetScheduleType() (value ScheduleType, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.scheduleType + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State of the upgrade policy for the node pool. +func (o *NodePoolUpgradePolicy) State() *UpgradePolicyState { + if o != nil && o.bitmap_&2048 != 0 { + return o.state + } + return nil +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// State of the upgrade policy for the node pool. +func (o *NodePoolUpgradePolicy) GetState() (value *UpgradePolicyState, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.state + } + return +} + +// UpgradeType returns the value of the 'upgrade_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Upgrade type of the node pool. +func (o *NodePoolUpgradePolicy) UpgradeType() UpgradeType { + if o != nil && o.bitmap_&4096 != 0 { + return o.upgradeType + } + return UpgradeType("") +} + +// GetUpgradeType returns the value of the 'upgrade_type' attribute and +// a flag indicating if the attribute has a value. +// +// Upgrade type of the node pool. +func (o *NodePoolUpgradePolicy) GetUpgradeType() (value UpgradeType, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.upgradeType + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version is the desired upgrade version. +func (o *NodePoolUpgradePolicy) Version() string { + if o != nil && o.bitmap_&8192 != 0 { + return o.version + } + return "" +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Version is the desired upgrade version. +func (o *NodePoolUpgradePolicy) GetVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.version + } + return +} + +// NodePoolUpgradePolicyListKind is the name of the type used to represent list of objects of +// type 'node_pool_upgrade_policy'. +const NodePoolUpgradePolicyListKind = "NodePoolUpgradePolicyList" + +// NodePoolUpgradePolicyListLinkKind is the name of the type used to represent links to list +// of objects of type 'node_pool_upgrade_policy'. +const NodePoolUpgradePolicyListLinkKind = "NodePoolUpgradePolicyListLink" + +// NodePoolUpgradePolicyNilKind is the name of the type used to nil lists of objects of +// type 'node_pool_upgrade_policy'. +const NodePoolUpgradePolicyListNilKind = "NodePoolUpgradePolicyListNil" + +// NodePoolUpgradePolicyList is a list of values of the 'node_pool_upgrade_policy' type. +type NodePoolUpgradePolicyList struct { + href string + link bool + items []*NodePoolUpgradePolicy +} + +// Kind returns the name of the type of the object. +func (l *NodePoolUpgradePolicyList) Kind() string { + if l == nil { + return NodePoolUpgradePolicyListNilKind + } + if l.link { + return NodePoolUpgradePolicyListLinkKind + } + return NodePoolUpgradePolicyListKind +} + +// Link returns true iif this is a link. +func (l *NodePoolUpgradePolicyList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *NodePoolUpgradePolicyList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *NodePoolUpgradePolicyList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *NodePoolUpgradePolicyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodePoolUpgradePolicyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodePoolUpgradePolicyList) Get(i int) *NodePoolUpgradePolicy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodePoolUpgradePolicyList) Slice() []*NodePoolUpgradePolicy { + var slice []*NodePoolUpgradePolicy + if l == nil { + slice = make([]*NodePoolUpgradePolicy, 0) + } else { + slice = make([]*NodePoolUpgradePolicy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodePoolUpgradePolicyList) Each(f func(item *NodePoolUpgradePolicy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodePoolUpgradePolicyList) Range(f func(index int, item *NodePoolUpgradePolicy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/node_pool_upgrade_policy_type_json.go b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_type_json.go new file mode 100644 index 00000000..ca9fefba --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pool_upgrade_policy_type_json.go @@ -0,0 +1,265 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodePoolUpgradePolicy writes a value of the 'node_pool_upgrade_policy' type to the given writer. +func MarshalNodePoolUpgradePolicy(object *NodePoolUpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodePoolUpgradePolicy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodePoolUpgradePolicy writes a value of the 'node_pool_upgrade_policy' type to the given stream. +func writeNodePoolUpgradePolicy(object *NodePoolUpgradePolicy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(NodePoolUpgradePolicyLinkKind) + } else { + stream.WriteString(NodePoolUpgradePolicyKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_id") + stream.WriteString(object.clusterID) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enable_minor_version_upgrades") + stream.WriteBool(object.enableMinorVersionUpgrades) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_update_timestamp") + stream.WriteString((object.lastUpdateTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("next_run") + stream.WriteString((object.nextRun).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("node_pool_id") + stream.WriteString(object.nodePoolID) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule") + stream.WriteString(object.schedule) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule_type") + stream.WriteString(string(object.scheduleType)) + count++ + } + present_ = object.bitmap_&2048 != 0 && object.state != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + writeUpgradePolicyState(object.state, stream) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("upgrade_type") + stream.WriteString(string(object.upgradeType)) + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + stream.WriteString(object.version) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodePoolUpgradePolicy reads a value of the 'node_pool_upgrade_policy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodePoolUpgradePolicy(source interface{}) (object *NodePoolUpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodePoolUpgradePolicy(iterator) + err = iterator.Error + return +} + +// readNodePoolUpgradePolicy reads a value of the 'node_pool_upgrade_policy' type from the given iterator. +func readNodePoolUpgradePolicy(iterator *jsoniter.Iterator) *NodePoolUpgradePolicy { + object := &NodePoolUpgradePolicy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == NodePoolUpgradePolicyLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "cluster_id": + value := iterator.ReadString() + object.clusterID = value + object.bitmap_ |= 8 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 16 + case "enable_minor_version_upgrades": + value := iterator.ReadBool() + object.enableMinorVersionUpgrades = value + object.bitmap_ |= 32 + case "last_update_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUpdateTimestamp = value + object.bitmap_ |= 64 + case "next_run": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.nextRun = value + object.bitmap_ |= 128 + case "node_pool_id": + value := iterator.ReadString() + object.nodePoolID = value + object.bitmap_ |= 256 + case "schedule": + value := iterator.ReadString() + object.schedule = value + object.bitmap_ |= 512 + case "schedule_type": + text := iterator.ReadString() + value := ScheduleType(text) + object.scheduleType = value + object.bitmap_ |= 1024 + case "state": + value := readUpgradePolicyState(iterator) + object.state = value + object.bitmap_ |= 2048 + case "upgrade_type": + text := iterator.ReadString() + value := UpgradeType(text) + object.upgradeType = value + object.bitmap_ |= 4096 + case "version": + value := iterator.ReadString() + object.version = value + object.bitmap_ |= 8192 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/node_pools_client.go b/clustersmgmt/v2alpha1/node_pools_client.go new file mode 100644 index 00000000..17409dc4 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pools_client.go @@ -0,0 +1,505 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NodePoolsClient is the client of the 'node_pools' resource. +// +// Manages the collection of node pools of a cluster. +type NodePoolsClient struct { + transport http.RoundTripper + path string +} + +// NewNodePoolsClient creates a new client for the 'node_pools' +// resource using the given transport to send the requests and receive the +// responses. +func NewNodePoolsClient(transport http.RoundTripper, path string) *NodePoolsClient { + return &NodePoolsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new node pool to the cluster. +func (c *NodePoolsClient) Add() *NodePoolsAddRequest { + return &NodePoolsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of node pools. +func (c *NodePoolsClient) List() *NodePoolsListRequest { + return &NodePoolsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// NodePool returns the target 'node_pool' resource for the given identifier. +// +// Reference to the service that manages a specific node pool. +func (c *NodePoolsClient) NodePool(id string) *NodePoolClient { + return NewNodePoolClient( + c.transport, + path.Join(c.path, id), + ) +} + +// NodePoolsAddRequest is the request for the 'add' method. +type NodePoolsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *NodePool +} + +// Parameter adds a query parameter. +func (r *NodePoolsAddRequest) Parameter(name string, value interface{}) *NodePoolsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolsAddRequest) Header(name string, value interface{}) *NodePoolsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolsAddRequest) Impersonate(user string) *NodePoolsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the node pool +func (r *NodePoolsAddRequest) Body(value *NodePool) *NodePoolsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolsAddRequest) Send() (result *NodePoolsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolsAddRequest) SendContext(ctx context.Context) (result *NodePoolsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeNodePoolsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolsAddResponse is the response for the 'add' method. +type NodePoolsAddResponse struct { + status int + header http.Header + err *errors.Error + body *NodePool +} + +// Status returns the response status code. +func (r *NodePoolsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the node pool +func (r *NodePoolsAddResponse) Body() *NodePool { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the node pool +func (r *NodePoolsAddResponse) GetBody() (value *NodePool, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// NodePoolsListRequest is the request for the 'list' method. +type NodePoolsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *NodePoolsListRequest) Parameter(name string, value interface{}) *NodePoolsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodePoolsListRequest) Header(name string, value interface{}) *NodePoolsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodePoolsListRequest) Impersonate(user string) *NodePoolsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the node pools instead of +// the names of the columns of a table. For example, in order to sort the node pools +// descending by identifier the value should be: +// +// ```sql +// id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *NodePoolsListRequest) Order(value string) *NodePoolsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *NodePoolsListRequest) Page(value int) *NodePoolsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the node pools instead of +// the names of the columns of a table. For example, in order to retrieve all the +// node pools with replicas of two the following is required: +// +// ```sql +// replicas = 2 +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// node pools that the user has permission to see will be returned. +func (r *NodePoolsListRequest) Search(value string) *NodePoolsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *NodePoolsListRequest) Size(value int) *NodePoolsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodePoolsListRequest) Send() (result *NodePoolsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodePoolsListRequest) SendContext(ctx context.Context) (result *NodePoolsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodePoolsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodePoolsListResponse(result, reader) + if err != nil { + return + } + return +} + +// NodePoolsListResponse is the response for the 'list' method. +type NodePoolsListResponse struct { + status int + header http.Header + err *errors.Error + items *NodePoolList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *NodePoolsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodePoolsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodePoolsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of node pools. +func (r *NodePoolsListResponse) Items() *NodePoolList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of node pools. +func (r *NodePoolsListResponse) GetItems() (value *NodePoolList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *NodePoolsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *NodePoolsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *NodePoolsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *NodePoolsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *NodePoolsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *NodePoolsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/node_pools_resource_json.go b/clustersmgmt/v2alpha1/node_pools_resource_json.go new file mode 100644 index 00000000..48ad4e68 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_pools_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeNodePoolsAddRequest(request *NodePoolsAddRequest, writer io.Writer) error { + return MarshalNodePool(request.body, writer) +} +func readNodePoolsAddResponse(response *NodePoolsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodePool(reader) + return err +} +func writeNodePoolsListRequest(request *NodePoolsListRequest, writer io.Writer) error { + return nil +} +func readNodePoolsListResponse(response *NodePoolsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readNodePoolList(iterator) + response.items = &NodePoolList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/node_type_list_type_json.go b/clustersmgmt/v2alpha1/node_type_list_type_json.go new file mode 100644 index 00000000..a3520ebd --- /dev/null +++ b/clustersmgmt/v2alpha1/node_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodeTypeList writes a list of values of the 'node_type' type to +// the given writer. +func MarshalNodeTypeList(list []NodeType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodeTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodeTypeList writes a list of value of the 'node_type' type to +// the given stream. +func writeNodeTypeList(list []NodeType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodeTypeList reads a list of values of the 'node_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodeTypeList(source interface{}) (items []NodeType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodeTypeList(iterator) + err = iterator.Error + return +} + +// readNodeTypeList reads list of values of the ”node_type' type from +// the given iterator. +func readNodeTypeList(iterator *jsoniter.Iterator) []NodeType { + list := []NodeType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := NodeType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/node_type_type.go b/clustersmgmt/v2alpha1/node_type_type.go new file mode 100644 index 00000000..d2f9ba77 --- /dev/null +++ b/clustersmgmt/v2alpha1/node_type_type.go @@ -0,0 +1,32 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodeType represents the values of the 'node_type' enumerated type. +type NodeType string + +const ( + // Compute. + NodeTypeCompute NodeType = "compute" + // Infra. + NodeTypeInfra NodeType = "infra" + // Master. + NodeTypeMaster NodeType = "master" +) diff --git a/clustersmgmt/v2alpha1/nodes_info_builder.go b/clustersmgmt/v2alpha1/nodes_info_builder.go new file mode 100644 index 00000000..4179b121 --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_info_builder.go @@ -0,0 +1,79 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodesInfoBuilder contains the data and logic needed to build 'nodes_info' objects. +// +// Provides information about the nodes in the cluster. +type NodesInfoBuilder struct { + bitmap_ uint32 + nodes []*NodeInfoBuilder +} + +// NewNodesInfo creates a new builder of 'nodes_info' objects. +func NewNodesInfo() *NodesInfoBuilder { + return &NodesInfoBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *NodesInfoBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Nodes sets the value of the 'nodes' attribute to the given values. +func (b *NodesInfoBuilder) Nodes(values ...*NodeInfoBuilder) *NodesInfoBuilder { + b.nodes = make([]*NodeInfoBuilder, len(values)) + copy(b.nodes, values) + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *NodesInfoBuilder) Copy(object *NodesInfo) *NodesInfoBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.nodes != nil { + b.nodes = make([]*NodeInfoBuilder, len(object.nodes)) + for i, v := range object.nodes { + b.nodes[i] = NewNodeInfo().Copy(v) + } + } else { + b.nodes = nil + } + return b +} + +// Build creates a 'nodes_info' object using the configuration stored in the builder. +func (b *NodesInfoBuilder) Build() (object *NodesInfo, err error) { + object = new(NodesInfo) + object.bitmap_ = b.bitmap_ + if b.nodes != nil { + object.nodes = make([]*NodeInfo, len(b.nodes)) + for i, v := range b.nodes { + object.nodes[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/nodes_info_list_builder.go b/clustersmgmt/v2alpha1/nodes_info_list_builder.go new file mode 100644 index 00000000..bc6a1e69 --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_info_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodesInfoListBuilder contains the data and logic needed to build +// 'nodes_info' objects. +type NodesInfoListBuilder struct { + items []*NodesInfoBuilder +} + +// NewNodesInfoList creates a new builder of 'nodes_info' objects. +func NewNodesInfoList() *NodesInfoListBuilder { + return new(NodesInfoListBuilder) +} + +// Items sets the items of the list. +func (b *NodesInfoListBuilder) Items(values ...*NodesInfoBuilder) *NodesInfoListBuilder { + b.items = make([]*NodesInfoBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *NodesInfoListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *NodesInfoListBuilder) Copy(list *NodesInfoList) *NodesInfoListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*NodesInfoBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewNodesInfo().Copy(v) + } + } + return b +} + +// Build creates a list of 'nodes_info' objects using the +// configuration stored in the builder. +func (b *NodesInfoListBuilder) Build() (list *NodesInfoList, err error) { + items := make([]*NodesInfo, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(NodesInfoList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/nodes_info_list_type_json.go b/clustersmgmt/v2alpha1/nodes_info_list_type_json.go new file mode 100644 index 00000000..d6068c1b --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_info_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodesInfoList writes a list of values of the 'nodes_info' type to +// the given writer. +func MarshalNodesInfoList(list []*NodesInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodesInfoList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodesInfoList writes a list of value of the 'nodes_info' type to +// the given stream. +func writeNodesInfoList(list []*NodesInfo, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeNodesInfo(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalNodesInfoList reads a list of values of the 'nodes_info' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalNodesInfoList(source interface{}) (items []*NodesInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readNodesInfoList(iterator) + err = iterator.Error + return +} + +// readNodesInfoList reads list of values of the ”nodes_info' type from +// the given iterator. +func readNodesInfoList(iterator *jsoniter.Iterator) []*NodesInfo { + list := []*NodesInfo{} + for iterator.ReadArray() { + item := readNodesInfo(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/nodes_info_type.go b/clustersmgmt/v2alpha1/nodes_info_type.go new file mode 100644 index 00000000..d2a44505 --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_info_type.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// NodesInfo represents the values of the 'nodes_info' type. +// +// Provides information about the nodes in the cluster. +type NodesInfo struct { + bitmap_ uint32 + nodes []*NodeInfo +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *NodesInfo) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Nodes returns the value of the 'nodes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *NodesInfo) Nodes() []*NodeInfo { + if o != nil && o.bitmap_&1 != 0 { + return o.nodes + } + return nil +} + +// GetNodes returns the value of the 'nodes' attribute and +// a flag indicating if the attribute has a value. +func (o *NodesInfo) GetNodes() (value []*NodeInfo, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.nodes + } + return +} + +// NodesInfoListKind is the name of the type used to represent list of objects of +// type 'nodes_info'. +const NodesInfoListKind = "NodesInfoList" + +// NodesInfoListLinkKind is the name of the type used to represent links to list +// of objects of type 'nodes_info'. +const NodesInfoListLinkKind = "NodesInfoListLink" + +// NodesInfoNilKind is the name of the type used to nil lists of objects of +// type 'nodes_info'. +const NodesInfoListNilKind = "NodesInfoListNil" + +// NodesInfoList is a list of values of the 'nodes_info' type. +type NodesInfoList struct { + href string + link bool + items []*NodesInfo +} + +// Len returns the length of the list. +func (l *NodesInfoList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *NodesInfoList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *NodesInfoList) Get(i int) *NodesInfo { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *NodesInfoList) Slice() []*NodesInfo { + var slice []*NodesInfo + if l == nil { + slice = make([]*NodesInfo, 0) + } else { + slice = make([]*NodesInfo, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *NodesInfoList) Each(f func(item *NodesInfo) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *NodesInfoList) Range(f func(index int, item *NodesInfo) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/nodes_info_type_json.go b/clustersmgmt/v2alpha1/nodes_info_type_json.go new file mode 100644 index 00000000..d598f2a3 --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_info_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalNodesInfo writes a value of the 'nodes_info' type to the given writer. +func MarshalNodesInfo(object *NodesInfo, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeNodesInfo(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeNodesInfo writes a value of the 'nodes_info' type to the given stream. +func writeNodesInfo(object *NodesInfo, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.nodes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("nodes") + writeNodeInfoList(object.nodes, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalNodesInfo reads a value of the 'nodes_info' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalNodesInfo(source interface{}) (object *NodesInfo, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readNodesInfo(iterator) + err = iterator.Error + return +} + +// readNodesInfo reads a value of the 'nodes_info' type from the given iterator. +func readNodesInfo(iterator *jsoniter.Iterator) *NodesInfo { + object := &NodesInfo{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "nodes": + value := readNodeInfoList(iterator) + object.nodes = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/nodes_metric_query_client.go b/clustersmgmt/v2alpha1/nodes_metric_query_client.go new file mode 100644 index 00000000..22fb0e1e --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_metric_query_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// NodesMetricQueryClient is the client of the 'nodes_metric_query' resource. +// +// Provides information about the nodes in the cluster. +type NodesMetricQueryClient struct { + transport http.RoundTripper + path string +} + +// NewNodesMetricQueryClient creates a new client for the 'nodes_metric_query' +// resource using the given transport to send the requests and receive the +// responses. +func NewNodesMetricQueryClient(transport http.RoundTripper, path string) *NodesMetricQueryClient { + return &NodesMetricQueryClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *NodesMetricQueryClient) Get() *NodesMetricQueryGetRequest { + return &NodesMetricQueryGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// NodesMetricQueryPollRequest is the request for the Poll method. +type NodesMetricQueryPollRequest struct { + request *NodesMetricQueryGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *NodesMetricQueryPollRequest) Parameter(name string, value interface{}) *NodesMetricQueryPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *NodesMetricQueryPollRequest) Header(name string, value interface{}) *NodesMetricQueryPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *NodesMetricQueryPollRequest) Interval(value time.Duration) *NodesMetricQueryPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *NodesMetricQueryPollRequest) Status(value int) *NodesMetricQueryPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *NodesMetricQueryPollRequest) Predicate(value func(*NodesMetricQueryGetResponse) bool) *NodesMetricQueryPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*NodesMetricQueryGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *NodesMetricQueryPollRequest) StartContext(ctx context.Context) (response *NodesMetricQueryPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &NodesMetricQueryPollResponse{ + response: result.(*NodesMetricQueryGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *NodesMetricQueryPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// NodesMetricQueryPollResponse is the response for the Poll method. +type NodesMetricQueryPollResponse struct { + response *NodesMetricQueryGetResponse +} + +// Status returns the response status code. +func (r *NodesMetricQueryPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *NodesMetricQueryPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *NodesMetricQueryPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *NodesMetricQueryPollResponse) Body() *NodesInfo { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodesMetricQueryPollResponse) GetBody() (value *NodesInfo, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *NodesMetricQueryClient) Poll() *NodesMetricQueryPollRequest { + return &NodesMetricQueryPollRequest{ + request: c.Get(), + } +} + +// NodesMetricQueryGetRequest is the request for the 'get' method. +type NodesMetricQueryGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *NodesMetricQueryGetRequest) Parameter(name string, value interface{}) *NodesMetricQueryGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *NodesMetricQueryGetRequest) Header(name string, value interface{}) *NodesMetricQueryGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *NodesMetricQueryGetRequest) Impersonate(user string) *NodesMetricQueryGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *NodesMetricQueryGetRequest) Send() (result *NodesMetricQueryGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *NodesMetricQueryGetRequest) SendContext(ctx context.Context) (result *NodesMetricQueryGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &NodesMetricQueryGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readNodesMetricQueryGetResponse(result, reader) + if err != nil { + return + } + return +} + +// NodesMetricQueryGetResponse is the response for the 'get' method. +type NodesMetricQueryGetResponse struct { + status int + header http.Header + err *errors.Error + body *NodesInfo +} + +// Status returns the response status code. +func (r *NodesMetricQueryGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *NodesMetricQueryGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *NodesMetricQueryGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *NodesMetricQueryGetResponse) Body() *NodesInfo { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *NodesMetricQueryGetResponse) GetBody() (value *NodesInfo, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/nodes_metric_query_resource_json.go b/clustersmgmt/v2alpha1/nodes_metric_query_resource_json.go new file mode 100644 index 00000000..f85ede53 --- /dev/null +++ b/clustersmgmt/v2alpha1/nodes_metric_query_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeNodesMetricQueryGetRequest(request *NodesMetricQueryGetRequest, writer io.Writer) error { + return nil +} +func readNodesMetricQueryGetResponse(response *NodesMetricQueryGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalNodesInfo(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/oidc_config_builder.go b/clustersmgmt/v2alpha1/oidc_config_builder.go new file mode 100644 index 00000000..5ec899fe --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_builder.go @@ -0,0 +1,167 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// OidcConfigBuilder contains the data and logic needed to build 'oidc_config' objects. +// +// Contains the necessary attributes to support oidc configuration hosting under Red Hat or registering a Customer's byo oidc config. +type OidcConfigBuilder struct { + bitmap_ uint32 + href string + id string + creationTimestamp time.Time + installerRoleArn string + issuerUrl string + lastUpdateTimestamp time.Time + lastUsedTimestamp time.Time + organizationId string + secretArn string + managed bool + reusable bool +} + +// NewOidcConfig creates a new builder of 'oidc_config' objects. +func NewOidcConfig() *OidcConfigBuilder { + return &OidcConfigBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *OidcConfigBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// HREF sets the value of the 'HREF' attribute to the given value. +func (b *OidcConfigBuilder) HREF(value string) *OidcConfigBuilder { + b.href = value + b.bitmap_ |= 1 + return b +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *OidcConfigBuilder) ID(value string) *OidcConfigBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *OidcConfigBuilder) CreationTimestamp(value time.Time) *OidcConfigBuilder { + b.creationTimestamp = value + b.bitmap_ |= 4 + return b +} + +// InstallerRoleArn sets the value of the 'installer_role_arn' attribute to the given value. +func (b *OidcConfigBuilder) InstallerRoleArn(value string) *OidcConfigBuilder { + b.installerRoleArn = value + b.bitmap_ |= 8 + return b +} + +// IssuerUrl sets the value of the 'issuer_url' attribute to the given value. +func (b *OidcConfigBuilder) IssuerUrl(value string) *OidcConfigBuilder { + b.issuerUrl = value + b.bitmap_ |= 16 + return b +} + +// LastUpdateTimestamp sets the value of the 'last_update_timestamp' attribute to the given value. +func (b *OidcConfigBuilder) LastUpdateTimestamp(value time.Time) *OidcConfigBuilder { + b.lastUpdateTimestamp = value + b.bitmap_ |= 32 + return b +} + +// LastUsedTimestamp sets the value of the 'last_used_timestamp' attribute to the given value. +func (b *OidcConfigBuilder) LastUsedTimestamp(value time.Time) *OidcConfigBuilder { + b.lastUsedTimestamp = value + b.bitmap_ |= 64 + return b +} + +// Managed sets the value of the 'managed' attribute to the given value. +func (b *OidcConfigBuilder) Managed(value bool) *OidcConfigBuilder { + b.managed = value + b.bitmap_ |= 128 + return b +} + +// OrganizationId sets the value of the 'organization_id' attribute to the given value. +func (b *OidcConfigBuilder) OrganizationId(value string) *OidcConfigBuilder { + b.organizationId = value + b.bitmap_ |= 256 + return b +} + +// Reusable sets the value of the 'reusable' attribute to the given value. +func (b *OidcConfigBuilder) Reusable(value bool) *OidcConfigBuilder { + b.reusable = value + b.bitmap_ |= 512 + return b +} + +// SecretArn sets the value of the 'secret_arn' attribute to the given value. +func (b *OidcConfigBuilder) SecretArn(value string) *OidcConfigBuilder { + b.secretArn = value + b.bitmap_ |= 1024 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *OidcConfigBuilder) Copy(object *OidcConfig) *OidcConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.href = object.href + b.id = object.id + b.creationTimestamp = object.creationTimestamp + b.installerRoleArn = object.installerRoleArn + b.issuerUrl = object.issuerUrl + b.lastUpdateTimestamp = object.lastUpdateTimestamp + b.lastUsedTimestamp = object.lastUsedTimestamp + b.managed = object.managed + b.organizationId = object.organizationId + b.reusable = object.reusable + b.secretArn = object.secretArn + return b +} + +// Build creates a 'oidc_config' object using the configuration stored in the builder. +func (b *OidcConfigBuilder) Build() (object *OidcConfig, err error) { + object = new(OidcConfig) + object.bitmap_ = b.bitmap_ + object.href = b.href + object.id = b.id + object.creationTimestamp = b.creationTimestamp + object.installerRoleArn = b.installerRoleArn + object.issuerUrl = b.issuerUrl + object.lastUpdateTimestamp = b.lastUpdateTimestamp + object.lastUsedTimestamp = b.lastUsedTimestamp + object.managed = b.managed + object.organizationId = b.organizationId + object.reusable = b.reusable + object.secretArn = b.secretArn + return +} diff --git a/clustersmgmt/v2alpha1/oidc_config_client.go b/clustersmgmt/v2alpha1/oidc_config_client.go new file mode 100644 index 00000000..83ff04c3 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// OidcConfigClient is the client of the 'oidc_config' resource. +// +// Manages an Oidc Config configuration. +type OidcConfigClient struct { + transport http.RoundTripper + path string +} + +// NewOidcConfigClient creates a new client for the 'oidc_config' +// resource using the given transport to send the requests and receive the +// responses. +func NewOidcConfigClient(transport http.RoundTripper, path string) *OidcConfigClient { + return &OidcConfigClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the OidcConfig. +func (c *OidcConfigClient) Delete() *OidcConfigDeleteRequest { + return &OidcConfigDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of an OidcConfig. +func (c *OidcConfigClient) Get() *OidcConfigGetRequest { + return &OidcConfigGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates attributes of an OidcConfig. +func (c *OidcConfigClient) Update() *OidcConfigUpdateRequest { + return &OidcConfigUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// OidcConfigPollRequest is the request for the Poll method. +type OidcConfigPollRequest struct { + request *OidcConfigGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *OidcConfigPollRequest) Parameter(name string, value interface{}) *OidcConfigPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *OidcConfigPollRequest) Header(name string, value interface{}) *OidcConfigPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *OidcConfigPollRequest) Interval(value time.Duration) *OidcConfigPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *OidcConfigPollRequest) Status(value int) *OidcConfigPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *OidcConfigPollRequest) Predicate(value func(*OidcConfigGetResponse) bool) *OidcConfigPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*OidcConfigGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *OidcConfigPollRequest) StartContext(ctx context.Context) (response *OidcConfigPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &OidcConfigPollResponse{ + response: result.(*OidcConfigGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *OidcConfigPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// OidcConfigPollResponse is the response for the Poll method. +type OidcConfigPollResponse struct { + response *OidcConfigGetResponse +} + +// Status returns the response status code. +func (r *OidcConfigPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *OidcConfigPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *OidcConfigPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *OidcConfigPollResponse) Body() *OidcConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *OidcConfigPollResponse) GetBody() (value *OidcConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *OidcConfigClient) Poll() *OidcConfigPollRequest { + return &OidcConfigPollRequest{ + request: c.Get(), + } +} + +// OidcConfigDeleteRequest is the request for the 'delete' method. +type OidcConfigDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *OidcConfigDeleteRequest) Parameter(name string, value interface{}) *OidcConfigDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OidcConfigDeleteRequest) Header(name string, value interface{}) *OidcConfigDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OidcConfigDeleteRequest) Impersonate(user string) *OidcConfigDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OidcConfigDeleteRequest) Send() (result *OidcConfigDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OidcConfigDeleteRequest) SendContext(ctx context.Context) (result *OidcConfigDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OidcConfigDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// OidcConfigDeleteResponse is the response for the 'delete' method. +type OidcConfigDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *OidcConfigDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OidcConfigDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OidcConfigDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// OidcConfigGetRequest is the request for the 'get' method. +type OidcConfigGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *OidcConfigGetRequest) Parameter(name string, value interface{}) *OidcConfigGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OidcConfigGetRequest) Header(name string, value interface{}) *OidcConfigGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OidcConfigGetRequest) Impersonate(user string) *OidcConfigGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OidcConfigGetRequest) Send() (result *OidcConfigGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OidcConfigGetRequest) SendContext(ctx context.Context) (result *OidcConfigGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OidcConfigGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readOidcConfigGetResponse(result, reader) + if err != nil { + return + } + return +} + +// OidcConfigGetResponse is the response for the 'get' method. +type OidcConfigGetResponse struct { + status int + header http.Header + err *errors.Error + body *OidcConfig +} + +// Status returns the response status code. +func (r *OidcConfigGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OidcConfigGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OidcConfigGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *OidcConfigGetResponse) Body() *OidcConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *OidcConfigGetResponse) GetBody() (value *OidcConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// OidcConfigUpdateRequest is the request for the 'update' method. +type OidcConfigUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *OidcConfig +} + +// Parameter adds a query parameter. +func (r *OidcConfigUpdateRequest) Parameter(name string, value interface{}) *OidcConfigUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OidcConfigUpdateRequest) Header(name string, value interface{}) *OidcConfigUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OidcConfigUpdateRequest) Impersonate(user string) *OidcConfigUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *OidcConfigUpdateRequest) Body(value *OidcConfig) *OidcConfigUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OidcConfigUpdateRequest) Send() (result *OidcConfigUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OidcConfigUpdateRequest) SendContext(ctx context.Context) (result *OidcConfigUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeOidcConfigUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OidcConfigUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readOidcConfigUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// OidcConfigUpdateResponse is the response for the 'update' method. +type OidcConfigUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *OidcConfig +} + +// Status returns the response status code. +func (r *OidcConfigUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OidcConfigUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OidcConfigUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *OidcConfigUpdateResponse) Body() *OidcConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *OidcConfigUpdateResponse) GetBody() (value *OidcConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/oidc_config_list_builder.go b/clustersmgmt/v2alpha1/oidc_config_list_builder.go new file mode 100644 index 00000000..68c23591 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OidcConfigListBuilder contains the data and logic needed to build +// 'oidc_config' objects. +type OidcConfigListBuilder struct { + items []*OidcConfigBuilder +} + +// NewOidcConfigList creates a new builder of 'oidc_config' objects. +func NewOidcConfigList() *OidcConfigListBuilder { + return new(OidcConfigListBuilder) +} + +// Items sets the items of the list. +func (b *OidcConfigListBuilder) Items(values ...*OidcConfigBuilder) *OidcConfigListBuilder { + b.items = make([]*OidcConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *OidcConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *OidcConfigListBuilder) Copy(list *OidcConfigList) *OidcConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*OidcConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewOidcConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'oidc_config' objects using the +// configuration stored in the builder. +func (b *OidcConfigListBuilder) Build() (list *OidcConfigList, err error) { + items := make([]*OidcConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(OidcConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/oidc_config_list_type_json.go b/clustersmgmt/v2alpha1/oidc_config_list_type_json.go new file mode 100644 index 00000000..26025b0f --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOidcConfigList writes a list of values of the 'oidc_config' type to +// the given writer. +func MarshalOidcConfigList(list []*OidcConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOidcConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOidcConfigList writes a list of value of the 'oidc_config' type to +// the given stream. +func writeOidcConfigList(list []*OidcConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeOidcConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalOidcConfigList reads a list of values of the 'oidc_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalOidcConfigList(source interface{}) (items []*OidcConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readOidcConfigList(iterator) + err = iterator.Error + return +} + +// readOidcConfigList reads list of values of the ”oidc_config' type from +// the given iterator. +func readOidcConfigList(iterator *jsoniter.Iterator) []*OidcConfig { + list := []*OidcConfig{} + for iterator.ReadArray() { + item := readOidcConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/oidc_config_resource_json.go b/clustersmgmt/v2alpha1/oidc_config_resource_json.go new file mode 100644 index 00000000..de5fcca3 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeOidcConfigDeleteRequest(request *OidcConfigDeleteRequest, writer io.Writer) error { + return nil +} +func readOidcConfigDeleteResponse(response *OidcConfigDeleteResponse, reader io.Reader) error { + return nil +} +func writeOidcConfigGetRequest(request *OidcConfigGetRequest, writer io.Writer) error { + return nil +} +func readOidcConfigGetResponse(response *OidcConfigGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalOidcConfig(reader) + return err +} +func writeOidcConfigUpdateRequest(request *OidcConfigUpdateRequest, writer io.Writer) error { + return MarshalOidcConfig(request.body, writer) +} +func readOidcConfigUpdateResponse(response *OidcConfigUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalOidcConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/oidc_config_type.go b/clustersmgmt/v2alpha1/oidc_config_type.go new file mode 100644 index 00000000..5589e654 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_type.go @@ -0,0 +1,386 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// OidcConfig represents the values of the 'oidc_config' type. +// +// Contains the necessary attributes to support oidc configuration hosting under Red Hat or registering a Customer's byo oidc config. +type OidcConfig struct { + bitmap_ uint32 + href string + id string + creationTimestamp time.Time + installerRoleArn string + issuerUrl string + lastUpdateTimestamp time.Time + lastUsedTimestamp time.Time + organizationId string + secretArn string + managed bool + reusable bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *OidcConfig) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// HREF returns the value of the 'HREF' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HREF for the oidc config, filled in response. +func (o *OidcConfig) HREF() string { + if o != nil && o.bitmap_&1 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the value of the 'HREF' attribute and +// a flag indicating if the attribute has a value. +// +// HREF for the oidc config, filled in response. +func (o *OidcConfig) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.href + } + return +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ID for the oidc config, filled in response. +func (o *OidcConfig) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// ID for the oidc config, filled in response. +func (o *OidcConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Creation timestamp, filled in response. +func (o *OidcConfig) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&4 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Creation timestamp, filled in response. +func (o *OidcConfig) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// InstallerRoleArn returns the value of the 'installer_role_arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN of the AWS role to assume when installing the cluster as to reveal the secret, supplied in request. It is only to be used in Unmanaged Oidc Config. +func (o *OidcConfig) InstallerRoleArn() string { + if o != nil && o.bitmap_&8 != 0 { + return o.installerRoleArn + } + return "" +} + +// GetInstallerRoleArn returns the value of the 'installer_role_arn' attribute and +// a flag indicating if the attribute has a value. +// +// ARN of the AWS role to assume when installing the cluster as to reveal the secret, supplied in request. It is only to be used in Unmanaged Oidc Config. +func (o *OidcConfig) GetInstallerRoleArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.installerRoleArn + } + return +} + +// IssuerUrl returns the value of the 'issuer_url' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Issuer URL, filled in response when Managed and supplied in Unmanaged. +func (o *OidcConfig) IssuerUrl() string { + if o != nil && o.bitmap_&16 != 0 { + return o.issuerUrl + } + return "" +} + +// GetIssuerUrl returns the value of the 'issuer_url' attribute and +// a flag indicating if the attribute has a value. +// +// Issuer URL, filled in response when Managed and supplied in Unmanaged. +func (o *OidcConfig) GetIssuerUrl() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.issuerUrl + } + return +} + +// LastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Last update timestamp, filled when patching a valid attribute of this oidc config. +func (o *OidcConfig) LastUpdateTimestamp() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.lastUpdateTimestamp + } + return time.Time{} +} + +// GetLastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Last update timestamp, filled when patching a valid attribute of this oidc config. +func (o *OidcConfig) GetLastUpdateTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.lastUpdateTimestamp + } + return +} + +// LastUsedTimestamp returns the value of the 'last_used_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Last used timestamp, filled by the latest cluster that used this oidc config. +func (o *OidcConfig) LastUsedTimestamp() time.Time { + if o != nil && o.bitmap_&64 != 0 { + return o.lastUsedTimestamp + } + return time.Time{} +} + +// GetLastUsedTimestamp returns the value of the 'last_used_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Last used timestamp, filled by the latest cluster that used this oidc config. +func (o *OidcConfig) GetLastUsedTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.lastUsedTimestamp + } + return +} + +// Managed returns the value of the 'managed' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates whether it is Managed or Unmanaged (Customer hosted). +func (o *OidcConfig) Managed() bool { + if o != nil && o.bitmap_&128 != 0 { + return o.managed + } + return false +} + +// GetManaged returns the value of the 'managed' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates whether it is Managed or Unmanaged (Customer hosted). +func (o *OidcConfig) GetManaged() (value bool, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.managed + } + return +} + +// OrganizationId returns the value of the 'organization_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Organization ID, filled in response respecting token provided. +func (o *OidcConfig) OrganizationId() string { + if o != nil && o.bitmap_&256 != 0 { + return o.organizationId + } + return "" +} + +// GetOrganizationId returns the value of the 'organization_id' attribute and +// a flag indicating if the attribute has a value. +// +// Organization ID, filled in response respecting token provided. +func (o *OidcConfig) GetOrganizationId() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.organizationId + } + return +} + +// Reusable returns the value of the 'reusable' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates whether the Oidc Config can be reused. +func (o *OidcConfig) Reusable() bool { + if o != nil && o.bitmap_&512 != 0 { + return o.reusable + } + return false +} + +// GetReusable returns the value of the 'reusable' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates whether the Oidc Config can be reused. +func (o *OidcConfig) GetReusable() (value bool, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.reusable + } + return +} + +// SecretArn returns the value of the 'secret_arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Secrets Manager ARN for the OIDC private key, supplied in request. It is only to be used in Unmanaged Oidc Config. +func (o *OidcConfig) SecretArn() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.secretArn + } + return "" +} + +// GetSecretArn returns the value of the 'secret_arn' attribute and +// a flag indicating if the attribute has a value. +// +// Secrets Manager ARN for the OIDC private key, supplied in request. It is only to be used in Unmanaged Oidc Config. +func (o *OidcConfig) GetSecretArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.secretArn + } + return +} + +// OidcConfigListKind is the name of the type used to represent list of objects of +// type 'oidc_config'. +const OidcConfigListKind = "OidcConfigList" + +// OidcConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'oidc_config'. +const OidcConfigListLinkKind = "OidcConfigListLink" + +// OidcConfigNilKind is the name of the type used to nil lists of objects of +// type 'oidc_config'. +const OidcConfigListNilKind = "OidcConfigListNil" + +// OidcConfigList is a list of values of the 'oidc_config' type. +type OidcConfigList struct { + href string + link bool + items []*OidcConfig +} + +// Len returns the length of the list. +func (l *OidcConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *OidcConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *OidcConfigList) Get(i int) *OidcConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *OidcConfigList) Slice() []*OidcConfig { + var slice []*OidcConfig + if l == nil { + slice = make([]*OidcConfig, 0) + } else { + slice = make([]*OidcConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *OidcConfigList) Each(f func(item *OidcConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *OidcConfigList) Range(f func(index int, item *OidcConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/oidc_config_type_json.go b/clustersmgmt/v2alpha1/oidc_config_type_json.go new file mode 100644 index 00000000..4a207277 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_config_type_json.go @@ -0,0 +1,229 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOidcConfig writes a value of the 'oidc_config' type to the given writer. +func MarshalOidcConfig(object *OidcConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOidcConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOidcConfig writes a value of the 'oidc_config' type to the given stream. +func writeOidcConfig(object *OidcConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("installer_role_arn") + stream.WriteString(object.installerRoleArn) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("issuer_url") + stream.WriteString(object.issuerUrl) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_update_timestamp") + stream.WriteString((object.lastUpdateTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_used_timestamp") + stream.WriteString((object.lastUsedTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managed") + stream.WriteBool(object.managed) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("organization_id") + stream.WriteString(object.organizationId) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("reusable") + stream.WriteBool(object.reusable) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("secret_arn") + stream.WriteString(object.secretArn) + } + stream.WriteObjectEnd() +} + +// UnmarshalOidcConfig reads a value of the 'oidc_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalOidcConfig(source interface{}) (object *OidcConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readOidcConfig(iterator) + err = iterator.Error + return +} + +// readOidcConfig reads a value of the 'oidc_config' type from the given iterator. +func readOidcConfig(iterator *jsoniter.Iterator) *OidcConfig { + object := &OidcConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "href": + value := iterator.ReadString() + object.href = value + object.bitmap_ |= 1 + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 2 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 4 + case "installer_role_arn": + value := iterator.ReadString() + object.installerRoleArn = value + object.bitmap_ |= 8 + case "issuer_url": + value := iterator.ReadString() + object.issuerUrl = value + object.bitmap_ |= 16 + case "last_update_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUpdateTimestamp = value + object.bitmap_ |= 32 + case "last_used_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUsedTimestamp = value + object.bitmap_ |= 64 + case "managed": + value := iterator.ReadBool() + object.managed = value + object.bitmap_ |= 128 + case "organization_id": + value := iterator.ReadString() + object.organizationId = value + object.bitmap_ |= 256 + case "reusable": + value := iterator.ReadBool() + object.reusable = value + object.bitmap_ |= 512 + case "secret_arn": + value := iterator.ReadString() + object.secretArn = value + object.bitmap_ |= 1024 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/oidc_configs_client.go b/clustersmgmt/v2alpha1/oidc_configs_client.go new file mode 100644 index 00000000..23709668 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_configs_client.go @@ -0,0 +1,451 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// OidcConfigsClient is the client of the 'oidc_configs' resource. +// +// Manages the collection of oidc configurations. +type OidcConfigsClient struct { + transport http.RoundTripper + path string +} + +// NewOidcConfigsClient creates a new client for the 'oidc_configs' +// resource using the given transport to send the requests and receive the +// responses. +func NewOidcConfigsClient(transport http.RoundTripper, path string) *OidcConfigsClient { + return &OidcConfigsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Creates a hosting under Red Hat's S3 bucket for byo oidc configuration. +func (c *OidcConfigsClient) Add() *OidcConfigsAddRequest { + return &OidcConfigsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of oidc configs. +func (c *OidcConfigsClient) List() *OidcConfigsListRequest { + return &OidcConfigsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// OidcConfig returns the target 'oidc_config' resource for the given identifier. +// +// Reference to the service that manages an specific identity provider. +func (c *OidcConfigsClient) OidcConfig(id string) *OidcConfigClient { + return NewOidcConfigClient( + c.transport, + path.Join(c.path, id), + ) +} + +// OidcConfigsAddRequest is the request for the 'add' method. +type OidcConfigsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *OidcConfig +} + +// Parameter adds a query parameter. +func (r *OidcConfigsAddRequest) Parameter(name string, value interface{}) *OidcConfigsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OidcConfigsAddRequest) Header(name string, value interface{}) *OidcConfigsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OidcConfigsAddRequest) Impersonate(user string) *OidcConfigsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *OidcConfigsAddRequest) Body(value *OidcConfig) *OidcConfigsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OidcConfigsAddRequest) Send() (result *OidcConfigsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OidcConfigsAddRequest) SendContext(ctx context.Context) (result *OidcConfigsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeOidcConfigsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OidcConfigsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readOidcConfigsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// OidcConfigsAddResponse is the response for the 'add' method. +type OidcConfigsAddResponse struct { + status int + header http.Header + err *errors.Error + body *OidcConfig +} + +// Status returns the response status code. +func (r *OidcConfigsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OidcConfigsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OidcConfigsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *OidcConfigsAddResponse) Body() *OidcConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *OidcConfigsAddResponse) GetBody() (value *OidcConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// OidcConfigsListRequest is the request for the 'list' method. +type OidcConfigsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *OidcConfigsListRequest) Parameter(name string, value interface{}) *OidcConfigsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OidcConfigsListRequest) Header(name string, value interface{}) *OidcConfigsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OidcConfigsListRequest) Impersonate(user string) *OidcConfigsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *OidcConfigsListRequest) Page(value int) *OidcConfigsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *OidcConfigsListRequest) Size(value int) *OidcConfigsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OidcConfigsListRequest) Send() (result *OidcConfigsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OidcConfigsListRequest) SendContext(ctx context.Context) (result *OidcConfigsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OidcConfigsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readOidcConfigsListResponse(result, reader) + if err != nil { + return + } + return +} + +// OidcConfigsListResponse is the response for the 'list' method. +type OidcConfigsListResponse struct { + status int + header http.Header + err *errors.Error + items *OidcConfigList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *OidcConfigsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OidcConfigsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OidcConfigsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of identity providers. +func (r *OidcConfigsListResponse) Items() *OidcConfigList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of identity providers. +func (r *OidcConfigsListResponse) GetItems() (value *OidcConfigList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *OidcConfigsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *OidcConfigsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *OidcConfigsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *OidcConfigsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *OidcConfigsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *OidcConfigsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/oidc_configs_resource_json.go b/clustersmgmt/v2alpha1/oidc_configs_resource_json.go new file mode 100644 index 00000000..159e8ad2 --- /dev/null +++ b/clustersmgmt/v2alpha1/oidc_configs_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeOidcConfigsAddRequest(request *OidcConfigsAddRequest, writer io.Writer) error { + return MarshalOidcConfig(request.body, writer) +} +func readOidcConfigsAddResponse(response *OidcConfigsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalOidcConfig(reader) + return err +} +func writeOidcConfigsListRequest(request *OidcConfigsListRequest, writer io.Writer) error { + return nil +} +func readOidcConfigsListResponse(response *OidcConfigsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readOidcConfigList(iterator) + response.items = &OidcConfigList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/open_id_claims_builder.go b/clustersmgmt/v2alpha1/open_id_claims_builder.go new file mode 100644 index 00000000..fbd22cd5 --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_claims_builder.go @@ -0,0 +1,129 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenIDClaimsBuilder contains the data and logic needed to build 'open_ID_claims' objects. +// +// _OpenID_ identity provider claims. +type OpenIDClaimsBuilder struct { + bitmap_ uint32 + email []string + groups []string + name []string + preferredUsername []string +} + +// NewOpenIDClaims creates a new builder of 'open_ID_claims' objects. +func NewOpenIDClaims() *OpenIDClaimsBuilder { + return &OpenIDClaimsBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *OpenIDClaimsBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Email sets the value of the 'email' attribute to the given values. +func (b *OpenIDClaimsBuilder) Email(values ...string) *OpenIDClaimsBuilder { + b.email = make([]string, len(values)) + copy(b.email, values) + b.bitmap_ |= 1 + return b +} + +// Groups sets the value of the 'groups' attribute to the given values. +func (b *OpenIDClaimsBuilder) Groups(values ...string) *OpenIDClaimsBuilder { + b.groups = make([]string, len(values)) + copy(b.groups, values) + b.bitmap_ |= 2 + return b +} + +// Name sets the value of the 'name' attribute to the given values. +func (b *OpenIDClaimsBuilder) Name(values ...string) *OpenIDClaimsBuilder { + b.name = make([]string, len(values)) + copy(b.name, values) + b.bitmap_ |= 4 + return b +} + +// PreferredUsername sets the value of the 'preferred_username' attribute to the given values. +func (b *OpenIDClaimsBuilder) PreferredUsername(values ...string) *OpenIDClaimsBuilder { + b.preferredUsername = make([]string, len(values)) + copy(b.preferredUsername, values) + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *OpenIDClaimsBuilder) Copy(object *OpenIDClaims) *OpenIDClaimsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.email != nil { + b.email = make([]string, len(object.email)) + copy(b.email, object.email) + } else { + b.email = nil + } + if object.groups != nil { + b.groups = make([]string, len(object.groups)) + copy(b.groups, object.groups) + } else { + b.groups = nil + } + if object.name != nil { + b.name = make([]string, len(object.name)) + copy(b.name, object.name) + } else { + b.name = nil + } + if object.preferredUsername != nil { + b.preferredUsername = make([]string, len(object.preferredUsername)) + copy(b.preferredUsername, object.preferredUsername) + } else { + b.preferredUsername = nil + } + return b +} + +// Build creates a 'open_ID_claims' object using the configuration stored in the builder. +func (b *OpenIDClaimsBuilder) Build() (object *OpenIDClaims, err error) { + object = new(OpenIDClaims) + object.bitmap_ = b.bitmap_ + if b.email != nil { + object.email = make([]string, len(b.email)) + copy(object.email, b.email) + } + if b.groups != nil { + object.groups = make([]string, len(b.groups)) + copy(object.groups, b.groups) + } + if b.name != nil { + object.name = make([]string, len(b.name)) + copy(object.name, b.name) + } + if b.preferredUsername != nil { + object.preferredUsername = make([]string, len(b.preferredUsername)) + copy(object.preferredUsername, b.preferredUsername) + } + return +} diff --git a/clustersmgmt/v2alpha1/open_id_claims_list_builder.go b/clustersmgmt/v2alpha1/open_id_claims_list_builder.go new file mode 100644 index 00000000..1db8f0ac --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_claims_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenIDClaimsListBuilder contains the data and logic needed to build +// 'open_ID_claims' objects. +type OpenIDClaimsListBuilder struct { + items []*OpenIDClaimsBuilder +} + +// NewOpenIDClaimsList creates a new builder of 'open_ID_claims' objects. +func NewOpenIDClaimsList() *OpenIDClaimsListBuilder { + return new(OpenIDClaimsListBuilder) +} + +// Items sets the items of the list. +func (b *OpenIDClaimsListBuilder) Items(values ...*OpenIDClaimsBuilder) *OpenIDClaimsListBuilder { + b.items = make([]*OpenIDClaimsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *OpenIDClaimsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *OpenIDClaimsListBuilder) Copy(list *OpenIDClaimsList) *OpenIDClaimsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*OpenIDClaimsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewOpenIDClaims().Copy(v) + } + } + return b +} + +// Build creates a list of 'open_ID_claims' objects using the +// configuration stored in the builder. +func (b *OpenIDClaimsListBuilder) Build() (list *OpenIDClaimsList, err error) { + items := make([]*OpenIDClaims, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(OpenIDClaimsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/open_id_claims_list_type_json.go b/clustersmgmt/v2alpha1/open_id_claims_list_type_json.go new file mode 100644 index 00000000..2cc0cc4f --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_claims_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOpenIDClaimsList writes a list of values of the 'open_ID_claims' type to +// the given writer. +func MarshalOpenIDClaimsList(list []*OpenIDClaims, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOpenIDClaimsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOpenIDClaimsList writes a list of value of the 'open_ID_claims' type to +// the given stream. +func writeOpenIDClaimsList(list []*OpenIDClaims, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeOpenIDClaims(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalOpenIDClaimsList reads a list of values of the 'open_ID_claims' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalOpenIDClaimsList(source interface{}) (items []*OpenIDClaims, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readOpenIDClaimsList(iterator) + err = iterator.Error + return +} + +// readOpenIDClaimsList reads list of values of the ”open_ID_claims' type from +// the given iterator. +func readOpenIDClaimsList(iterator *jsoniter.Iterator) []*OpenIDClaims { + list := []*OpenIDClaims{} + for iterator.ReadArray() { + item := readOpenIDClaims(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/open_id_claims_type.go b/clustersmgmt/v2alpha1/open_id_claims_type.go new file mode 100644 index 00000000..8cc01107 --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_claims_type.go @@ -0,0 +1,214 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenIDClaims represents the values of the 'open_ID_claims' type. +// +// _OpenID_ identity provider claims. +type OpenIDClaims struct { + bitmap_ uint32 + email []string + groups []string + name []string + preferredUsername []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *OpenIDClaims) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Email returns the value of the 'email' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of claims to use as the mail address. +func (o *OpenIDClaims) Email() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.email + } + return nil +} + +// GetEmail returns the value of the 'email' attribute and +// a flag indicating if the attribute has a value. +// +// List of claims to use as the mail address. +func (o *OpenIDClaims) GetEmail() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.email + } + return +} + +// Groups returns the value of the 'groups' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of claims to use as the group name. +func (o *OpenIDClaims) Groups() []string { + if o != nil && o.bitmap_&2 != 0 { + return o.groups + } + return nil +} + +// GetGroups returns the value of the 'groups' attribute and +// a flag indicating if the attribute has a value. +// +// List of claims to use as the group name. +func (o *OpenIDClaims) GetGroups() (value []string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.groups + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of claims to use as the display name. +func (o *OpenIDClaims) Name() []string { + if o != nil && o.bitmap_&4 != 0 { + return o.name + } + return nil +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// List of claims to use as the display name. +func (o *OpenIDClaims) GetName() (value []string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.name + } + return +} + +// PreferredUsername returns the value of the 'preferred_username' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of claims to use as the preferred user name when provisioning a user. +func (o *OpenIDClaims) PreferredUsername() []string { + if o != nil && o.bitmap_&8 != 0 { + return o.preferredUsername + } + return nil +} + +// GetPreferredUsername returns the value of the 'preferred_username' attribute and +// a flag indicating if the attribute has a value. +// +// List of claims to use as the preferred user name when provisioning a user. +func (o *OpenIDClaims) GetPreferredUsername() (value []string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.preferredUsername + } + return +} + +// OpenIDClaimsListKind is the name of the type used to represent list of objects of +// type 'open_ID_claims'. +const OpenIDClaimsListKind = "OpenIDClaimsList" + +// OpenIDClaimsListLinkKind is the name of the type used to represent links to list +// of objects of type 'open_ID_claims'. +const OpenIDClaimsListLinkKind = "OpenIDClaimsListLink" + +// OpenIDClaimsNilKind is the name of the type used to nil lists of objects of +// type 'open_ID_claims'. +const OpenIDClaimsListNilKind = "OpenIDClaimsListNil" + +// OpenIDClaimsList is a list of values of the 'open_ID_claims' type. +type OpenIDClaimsList struct { + href string + link bool + items []*OpenIDClaims +} + +// Len returns the length of the list. +func (l *OpenIDClaimsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *OpenIDClaimsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *OpenIDClaimsList) Get(i int) *OpenIDClaims { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *OpenIDClaimsList) Slice() []*OpenIDClaims { + var slice []*OpenIDClaims + if l == nil { + slice = make([]*OpenIDClaims, 0) + } else { + slice = make([]*OpenIDClaims, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *OpenIDClaimsList) Each(f func(item *OpenIDClaims) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *OpenIDClaimsList) Range(f func(index int, item *OpenIDClaims) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/open_id_claims_type_json.go b/clustersmgmt/v2alpha1/open_id_claims_type_json.go new file mode 100644 index 00000000..278013cb --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_claims_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOpenIDClaims writes a value of the 'open_ID_claims' type to the given writer. +func MarshalOpenIDClaims(object *OpenIDClaims, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOpenIDClaims(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOpenIDClaims writes a value of the 'open_ID_claims' type to the given stream. +func writeOpenIDClaims(object *OpenIDClaims, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.email != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("email") + writeStringList(object.email, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.groups != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("groups") + writeStringList(object.groups, stream) + count++ + } + present_ = object.bitmap_&4 != 0 && object.name != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + writeStringList(object.name, stream) + count++ + } + present_ = object.bitmap_&8 != 0 && object.preferredUsername != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("preferred_username") + writeStringList(object.preferredUsername, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalOpenIDClaims reads a value of the 'open_ID_claims' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalOpenIDClaims(source interface{}) (object *OpenIDClaims, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readOpenIDClaims(iterator) + err = iterator.Error + return +} + +// readOpenIDClaims reads a value of the 'open_ID_claims' type from the given iterator. +func readOpenIDClaims(iterator *jsoniter.Iterator) *OpenIDClaims { + object := &OpenIDClaims{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "email": + value := readStringList(iterator) + object.email = value + object.bitmap_ |= 1 + case "groups": + value := readStringList(iterator) + object.groups = value + object.bitmap_ |= 2 + case "name": + value := readStringList(iterator) + object.name = value + object.bitmap_ |= 4 + case "preferred_username": + value := readStringList(iterator) + object.preferredUsername = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/open_id_identity_provider_builder.go b/clustersmgmt/v2alpha1/open_id_identity_provider_builder.go new file mode 100644 index 00000000..d6c21328 --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_identity_provider_builder.go @@ -0,0 +1,163 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenIDIdentityProviderBuilder contains the data and logic needed to build 'open_ID_identity_provider' objects. +// +// Details for `openid` identity providers. +type OpenIDIdentityProviderBuilder struct { + bitmap_ uint32 + ca string + claims *OpenIDClaimsBuilder + clientID string + clientSecret string + extraAuthorizeParameters map[string]string + extraScopes []string + issuer string +} + +// NewOpenIDIdentityProvider creates a new builder of 'open_ID_identity_provider' objects. +func NewOpenIDIdentityProvider() *OpenIDIdentityProviderBuilder { + return &OpenIDIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *OpenIDIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CA sets the value of the 'CA' attribute to the given value. +func (b *OpenIDIdentityProviderBuilder) CA(value string) *OpenIDIdentityProviderBuilder { + b.ca = value + b.bitmap_ |= 1 + return b +} + +// Claims sets the value of the 'claims' attribute to the given value. +// +// _OpenID_ identity provider claims. +func (b *OpenIDIdentityProviderBuilder) Claims(value *OpenIDClaimsBuilder) *OpenIDIdentityProviderBuilder { + b.claims = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// ClientID sets the value of the 'client_ID' attribute to the given value. +func (b *OpenIDIdentityProviderBuilder) ClientID(value string) *OpenIDIdentityProviderBuilder { + b.clientID = value + b.bitmap_ |= 4 + return b +} + +// ClientSecret sets the value of the 'client_secret' attribute to the given value. +func (b *OpenIDIdentityProviderBuilder) ClientSecret(value string) *OpenIDIdentityProviderBuilder { + b.clientSecret = value + b.bitmap_ |= 8 + return b +} + +// ExtraAuthorizeParameters sets the value of the 'extra_authorize_parameters' attribute to the given value. +func (b *OpenIDIdentityProviderBuilder) ExtraAuthorizeParameters(value map[string]string) *OpenIDIdentityProviderBuilder { + b.extraAuthorizeParameters = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// ExtraScopes sets the value of the 'extra_scopes' attribute to the given values. +func (b *OpenIDIdentityProviderBuilder) ExtraScopes(values ...string) *OpenIDIdentityProviderBuilder { + b.extraScopes = make([]string, len(values)) + copy(b.extraScopes, values) + b.bitmap_ |= 32 + return b +} + +// Issuer sets the value of the 'issuer' attribute to the given value. +func (b *OpenIDIdentityProviderBuilder) Issuer(value string) *OpenIDIdentityProviderBuilder { + b.issuer = value + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *OpenIDIdentityProviderBuilder) Copy(object *OpenIDIdentityProvider) *OpenIDIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.ca = object.ca + if object.claims != nil { + b.claims = NewOpenIDClaims().Copy(object.claims) + } else { + b.claims = nil + } + b.clientID = object.clientID + b.clientSecret = object.clientSecret + if len(object.extraAuthorizeParameters) > 0 { + b.extraAuthorizeParameters = map[string]string{} + for k, v := range object.extraAuthorizeParameters { + b.extraAuthorizeParameters[k] = v + } + } else { + b.extraAuthorizeParameters = nil + } + if object.extraScopes != nil { + b.extraScopes = make([]string, len(object.extraScopes)) + copy(b.extraScopes, object.extraScopes) + } else { + b.extraScopes = nil + } + b.issuer = object.issuer + return b +} + +// Build creates a 'open_ID_identity_provider' object using the configuration stored in the builder. +func (b *OpenIDIdentityProviderBuilder) Build() (object *OpenIDIdentityProvider, err error) { + object = new(OpenIDIdentityProvider) + object.bitmap_ = b.bitmap_ + object.ca = b.ca + if b.claims != nil { + object.claims, err = b.claims.Build() + if err != nil { + return + } + } + object.clientID = b.clientID + object.clientSecret = b.clientSecret + if b.extraAuthorizeParameters != nil { + object.extraAuthorizeParameters = make(map[string]string) + for k, v := range b.extraAuthorizeParameters { + object.extraAuthorizeParameters[k] = v + } + } + if b.extraScopes != nil { + object.extraScopes = make([]string, len(b.extraScopes)) + copy(object.extraScopes, b.extraScopes) + } + object.issuer = b.issuer + return +} diff --git a/clustersmgmt/v2alpha1/open_id_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/open_id_identity_provider_list_builder.go new file mode 100644 index 00000000..8ea0bae0 --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenIDIdentityProviderListBuilder contains the data and logic needed to build +// 'open_ID_identity_provider' objects. +type OpenIDIdentityProviderListBuilder struct { + items []*OpenIDIdentityProviderBuilder +} + +// NewOpenIDIdentityProviderList creates a new builder of 'open_ID_identity_provider' objects. +func NewOpenIDIdentityProviderList() *OpenIDIdentityProviderListBuilder { + return new(OpenIDIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *OpenIDIdentityProviderListBuilder) Items(values ...*OpenIDIdentityProviderBuilder) *OpenIDIdentityProviderListBuilder { + b.items = make([]*OpenIDIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *OpenIDIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *OpenIDIdentityProviderListBuilder) Copy(list *OpenIDIdentityProviderList) *OpenIDIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*OpenIDIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewOpenIDIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'open_ID_identity_provider' objects using the +// configuration stored in the builder. +func (b *OpenIDIdentityProviderListBuilder) Build() (list *OpenIDIdentityProviderList, err error) { + items := make([]*OpenIDIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(OpenIDIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/open_id_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/open_id_identity_provider_list_type_json.go new file mode 100644 index 00000000..f664fcdb --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOpenIDIdentityProviderList writes a list of values of the 'open_ID_identity_provider' type to +// the given writer. +func MarshalOpenIDIdentityProviderList(list []*OpenIDIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOpenIDIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOpenIDIdentityProviderList writes a list of value of the 'open_ID_identity_provider' type to +// the given stream. +func writeOpenIDIdentityProviderList(list []*OpenIDIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeOpenIDIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalOpenIDIdentityProviderList reads a list of values of the 'open_ID_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalOpenIDIdentityProviderList(source interface{}) (items []*OpenIDIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readOpenIDIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readOpenIDIdentityProviderList reads list of values of the ”open_ID_identity_provider' type from +// the given iterator. +func readOpenIDIdentityProviderList(iterator *jsoniter.Iterator) []*OpenIDIdentityProvider { + list := []*OpenIDIdentityProvider{} + for iterator.ReadArray() { + item := readOpenIDIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/open_id_identity_provider_type.go b/clustersmgmt/v2alpha1/open_id_identity_provider_type.go new file mode 100644 index 00000000..bf11de3c --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_identity_provider_type.go @@ -0,0 +1,288 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenIDIdentityProvider represents the values of the 'open_ID_identity_provider' type. +// +// Details for `openid` identity providers. +type OpenIDIdentityProvider struct { + bitmap_ uint32 + ca string + claims *OpenIDClaims + clientID string + clientSecret string + extraAuthorizeParameters map[string]string + extraScopes []string + issuer string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *OpenIDIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CA returns the value of the 'CA' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Certificate bunde to use to validate server certificates for the configured URL. +func (o *OpenIDIdentityProvider) CA() string { + if o != nil && o.bitmap_&1 != 0 { + return o.ca + } + return "" +} + +// GetCA returns the value of the 'CA' attribute and +// a flag indicating if the attribute has a value. +// +// Certificate bunde to use to validate server certificates for the configured URL. +func (o *OpenIDIdentityProvider) GetCA() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.ca + } + return +} + +// Claims returns the value of the 'claims' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Claims used to configure the provider. +func (o *OpenIDIdentityProvider) Claims() *OpenIDClaims { + if o != nil && o.bitmap_&2 != 0 { + return o.claims + } + return nil +} + +// GetClaims returns the value of the 'claims' attribute and +// a flag indicating if the attribute has a value. +// +// Claims used to configure the provider. +func (o *OpenIDIdentityProvider) GetClaims() (value *OpenIDClaims, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.claims + } + return +} + +// ClientID returns the value of the 'client_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Identifier of a client registered with the _OpenID_ provider. +func (o *OpenIDIdentityProvider) ClientID() string { + if o != nil && o.bitmap_&4 != 0 { + return o.clientID + } + return "" +} + +// GetClientID returns the value of the 'client_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Identifier of a client registered with the _OpenID_ provider. +func (o *OpenIDIdentityProvider) GetClientID() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.clientID + } + return +} + +// ClientSecret returns the value of the 'client_secret' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Client secret. +func (o *OpenIDIdentityProvider) ClientSecret() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clientSecret + } + return "" +} + +// GetClientSecret returns the value of the 'client_secret' attribute and +// a flag indicating if the attribute has a value. +// +// Client secret. +func (o *OpenIDIdentityProvider) GetClientSecret() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clientSecret + } + return +} + +// ExtraAuthorizeParameters returns the value of the 'extra_authorize_parameters' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional map of extra parameters to add to the authorization token request. +func (o *OpenIDIdentityProvider) ExtraAuthorizeParameters() map[string]string { + if o != nil && o.bitmap_&16 != 0 { + return o.extraAuthorizeParameters + } + return nil +} + +// GetExtraAuthorizeParameters returns the value of the 'extra_authorize_parameters' attribute and +// a flag indicating if the attribute has a value. +// +// Optional map of extra parameters to add to the authorization token request. +func (o *OpenIDIdentityProvider) GetExtraAuthorizeParameters() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.extraAuthorizeParameters + } + return +} + +// ExtraScopes returns the value of the 'extra_scopes' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional list of scopes to request, in addition to the `openid` scope, during the +// authorization token request. +func (o *OpenIDIdentityProvider) ExtraScopes() []string { + if o != nil && o.bitmap_&32 != 0 { + return o.extraScopes + } + return nil +} + +// GetExtraScopes returns the value of the 'extra_scopes' attribute and +// a flag indicating if the attribute has a value. +// +// Optional list of scopes to request, in addition to the `openid` scope, during the +// authorization token request. +func (o *OpenIDIdentityProvider) GetExtraScopes() (value []string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.extraScopes + } + return +} + +// Issuer returns the value of the 'issuer' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The URL that the OpenID Provider asserts as the Issuer Identifier +func (o *OpenIDIdentityProvider) Issuer() string { + if o != nil && o.bitmap_&64 != 0 { + return o.issuer + } + return "" +} + +// GetIssuer returns the value of the 'issuer' attribute and +// a flag indicating if the attribute has a value. +// +// The URL that the OpenID Provider asserts as the Issuer Identifier +func (o *OpenIDIdentityProvider) GetIssuer() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.issuer + } + return +} + +// OpenIDIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'open_ID_identity_provider'. +const OpenIDIdentityProviderListKind = "OpenIDIdentityProviderList" + +// OpenIDIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'open_ID_identity_provider'. +const OpenIDIdentityProviderListLinkKind = "OpenIDIdentityProviderListLink" + +// OpenIDIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'open_ID_identity_provider'. +const OpenIDIdentityProviderListNilKind = "OpenIDIdentityProviderListNil" + +// OpenIDIdentityProviderList is a list of values of the 'open_ID_identity_provider' type. +type OpenIDIdentityProviderList struct { + href string + link bool + items []*OpenIDIdentityProvider +} + +// Len returns the length of the list. +func (l *OpenIDIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *OpenIDIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *OpenIDIdentityProviderList) Get(i int) *OpenIDIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *OpenIDIdentityProviderList) Slice() []*OpenIDIdentityProvider { + var slice []*OpenIDIdentityProvider + if l == nil { + slice = make([]*OpenIDIdentityProvider, 0) + } else { + slice = make([]*OpenIDIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *OpenIDIdentityProviderList) Each(f func(item *OpenIDIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *OpenIDIdentityProviderList) Range(f func(index int, item *OpenIDIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/open_id_identity_provider_type_json.go b/clustersmgmt/v2alpha1/open_id_identity_provider_type_json.go new file mode 100644 index 00000000..a7a522ec --- /dev/null +++ b/clustersmgmt/v2alpha1/open_id_identity_provider_type_json.go @@ -0,0 +1,193 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOpenIDIdentityProvider writes a value of the 'open_ID_identity_provider' type to the given writer. +func MarshalOpenIDIdentityProvider(object *OpenIDIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOpenIDIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOpenIDIdentityProvider writes a value of the 'open_ID_identity_provider' type to the given stream. +func writeOpenIDIdentityProvider(object *OpenIDIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ca") + stream.WriteString(object.ca) + count++ + } + present_ = object.bitmap_&2 != 0 && object.claims != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("claims") + writeOpenIDClaims(object.claims, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_id") + stream.WriteString(object.clientID) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("client_secret") + stream.WriteString(object.clientSecret) + count++ + } + present_ = object.bitmap_&16 != 0 && object.extraAuthorizeParameters != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("extra_authorize_parameters") + if object.extraAuthorizeParameters != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.extraAuthorizeParameters)) + i := 0 + for key := range object.extraAuthorizeParameters { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.extraAuthorizeParameters[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + count++ + } + present_ = object.bitmap_&32 != 0 && object.extraScopes != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("extra_scopes") + writeStringList(object.extraScopes, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("issuer") + stream.WriteString(object.issuer) + } + stream.WriteObjectEnd() +} + +// UnmarshalOpenIDIdentityProvider reads a value of the 'open_ID_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalOpenIDIdentityProvider(source interface{}) (object *OpenIDIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readOpenIDIdentityProvider(iterator) + err = iterator.Error + return +} + +// readOpenIDIdentityProvider reads a value of the 'open_ID_identity_provider' type from the given iterator. +func readOpenIDIdentityProvider(iterator *jsoniter.Iterator) *OpenIDIdentityProvider { + object := &OpenIDIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "ca": + value := iterator.ReadString() + object.ca = value + object.bitmap_ |= 1 + case "claims": + value := readOpenIDClaims(iterator) + object.claims = value + object.bitmap_ |= 2 + case "client_id": + value := iterator.ReadString() + object.clientID = value + object.bitmap_ |= 4 + case "client_secret": + value := iterator.ReadString() + object.clientSecret = value + object.bitmap_ |= 8 + case "extra_authorize_parameters": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.extraAuthorizeParameters = value + object.bitmap_ |= 16 + case "extra_scopes": + value := readStringList(iterator) + object.extraScopes = value + object.bitmap_ |= 32 + case "issuer": + value := iterator.ReadString() + object.issuer = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/openapi.go b/clustersmgmt/v2alpha1/openapi.go new file mode 100644 index 00000000..9744c5e2 --- /dev/null +++ b/clustersmgmt/v2alpha1/openapi.go @@ -0,0 +1,37512 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OpenAPI contains the OpenAPI specification of the service in JSON. +var OpenAPI = []byte{ + 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x22, 0x3a, 0x20, 0x22, + 0x33, 0x2e, 0x30, 0x2e, 0x30, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x6f, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x70, 0x61, + 0x63, 0x68, 0x65, 0x20, 0x32, 0x2e, 0x30, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x2d, 0x32, + 0x2e, 0x30, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x43, 0x4d, 0x20, 0x46, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x63, 0x6d, 0x2d, 0x66, 0x65, + 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x40, 0x72, 0x65, 0x64, 0x68, 0x61, 0x74, 0x2e, 0x63, 0x6f, + 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x22, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x72, 0x6c, + 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x61, 0x70, 0x69, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x74, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x61, 0x70, 0x69, 0x2e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, + 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, + 0x64, 0x4f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, + 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, + 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, + 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x64, + 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, + 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, + 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, + 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x5c, 0x6e, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, + 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, + 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, + 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x64, + 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x64, 0x64, 0x2d, + 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x64, 0x64, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, + 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, + 0x6f, 0x6e, 0x5c, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x69, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x69, 0x64, + 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, + 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, + 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, + 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, + 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, + 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x5c, + 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x30, 0x2e, + 0x31, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, + 0x6c, 0x5c, 0x6e, 0x69, 0x64, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x30, 0x2e, 0x31, 0x2e, + 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x5c, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, + 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x62, 0x79, 0x20, 0x64, 0x69, 0x73, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, + 0x6e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, + 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, + 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, + 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x2f, 0x7b, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x77, 0x73, + 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, + 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, + 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, + 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x77, 0x73, 0x5f, + 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x49, 0x4d, + 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x5c, 0x6e, 0x60, 0x70, 0x61, 0x67, 0x65, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, + 0x73, 0x69, 0x7a, 0x65, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, + 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, + 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, + 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, + 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x73, 0x74, + 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x53, + 0x54, 0x53, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x49, + 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x54, 0x53, 0x20, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x53, 0x54, 0x53, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x53, 0x54, 0x53, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, + 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x53, 0x54, 0x53, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, + 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x54, 0x53, 0x20, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, + 0x69, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x54, 0x53, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, + 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x61, 0x77, + 0x73, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x73, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x77, 0x73, 0x73, 0x74, 0x73, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, + 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, + 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, + 0x79, 0x20, 0x69, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, + 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, + 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, + 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, + 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, + 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x77, 0x73, 0x73, + 0x74, 0x73, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x20, 0x60, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x72, 0x6f, 0x6c, 0x65, 0x60, 0x5c, 0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, + 0x27, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x25, 0x27, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, + 0x6e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x41, 0x57, 0x53, 0x53, 0x54, 0x53, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x77, 0x73, 0x20, 0x63, 0x72, + 0x65, 0x64, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, + 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x76, 0x70, + 0x63, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, + 0x70, 0x63, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, + 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, + 0x27, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x60, 0x70, 0x61, 0x67, 0x65, + 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, + 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, 0x7a, 0x65, 0x60, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x60, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x70, 0x63, 0x73, 0x5c, 0x6e, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, + 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, + 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x5c, 0x6e, 0x76, 0x70, 0x63, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, + 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x20, 0x56, 0x50, 0x43, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x56, 0x50, + 0x43, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, + 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, + 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, + 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x76, 0x70, 0x63, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x70, 0x63, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x66, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, + 0x20, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, + 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, + 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, + 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, + 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, + 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x5c, 0x6e, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x41, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, + 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x41, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, + 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, + 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x5c, + 0x6e, 0x5c, 0x6e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x60, 0x70, + 0x61, 0x67, 0x65, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x20, 0x62, 0x65, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, 0x7a, 0x65, 0x60, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x73, 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, + 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, + 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, + 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x4d, 0x50, 0x4f, + 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x60, 0x70, 0x61, 0x67, 0x65, 0x60, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x31, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, 0x7a, 0x65, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, + 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, + 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x60, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x60, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, + 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, + 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5c, 0x6e, 0x64, + 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x69, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, + 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, + 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, + 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x60, 0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x31, 0x60, 0x20, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5c, + 0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, + 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, + 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, 0x74, 0x2d, + 0x31, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x62, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x65, 0x73, 0x74, 0x45, 0x66, + 0x66, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x73, + 0x74, 0x2d, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x66, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x4f, 0x43, 0x4d, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x5c, 0x6e, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4f, 0x43, 0x50, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x72, + 0x79, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x68, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x68, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x57, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x69, 0x62, 0x65, + 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, + 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x5c, 0x6e, 0x62, 0x75, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, + 0x6f, 0x74, 0x61, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x73, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, + 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, + 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, + 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, + 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, + 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x2d, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x64, 0x64, 0x4f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, + 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, + 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, + 0x7b, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x79, 0x5f, 0x69, + 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x71, + 0x75, 0x69, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, + 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, + 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, + 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x6f, 0x6e, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x5f, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x64, 0x64, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, + 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, + 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, + 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, + 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, + 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, + 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x5c, 0x6e, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, + 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, + 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, + 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, + 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x6f, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x77, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x77, 0x73, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5c, 0x6e, 0x6f, 0x66, 0x20, + 0x61, 0x6e, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5c, 0x6e, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, + 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x5c, 0x6e, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, + 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x5c, 0x6e, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x20, 0x3d, 0x20, 0x27, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, + 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, + 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, + 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x77, 0x73, 0x2f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x61, 0x77, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x66, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x72, 0x6f, 0x6c, + 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x41, 0x57, 0x53, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x77, 0x73, + 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x57, 0x53, 0x20, + 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x5c, 0x6e, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, + 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5c, 0x6e, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x5c, + 0x6e, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x62, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x41, 0x52, 0x4e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x61, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, + 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x5c, 0x6e, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x20, 0x41, 0x52, 0x4e, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, + 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x61, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x25, 0x75, 0x73, 0x65, 0x72, 0x27, + 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x57, 0x53, 0x5c, 0x6e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x77, 0x73, 0x5f, 0x69, + 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x77, + 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x61, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x77, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, + 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x47, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x73, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, + 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5c, 0x6e, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, + 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x69, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, + 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, + 0x6c, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x63, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x27, 0x75, 0x73, 0x65, 0x72, 0x31, 0x27, 0x20, 0x41, 0x4e, + 0x44, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3d, 0x27, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x64, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x67, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x2f, 0x7b, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x5f, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, + 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, + 0x6c, 0x61, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, + 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x73, 0x2f, 0x7b, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x69, 0x64, + 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, + 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x6e, 0x69, + 0x66, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x79, 0x6e, 0x63, 0x73, + 0x65, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x7b, 0x73, 0x79, 0x6e, 0x63, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x79, 0x6e, + 0x63, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, + 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x79, 0x6e, + 0x63, 0x73, 0x65, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, + 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x47, 0x61, 0x74, 0x65, 0x41, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x61, 0x67, 0x72, + 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, + 0x61, 0x74, 0x65, 0x5f, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x67, 0x72, + 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, + 0x65, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x67, 0x72, + 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, + 0x61, 0x74, 0x65, 0x5f, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x41, 0x67, 0x72, 0x65, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x73, 0x65, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2f, 0x7b, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x68, 0x79, 0x70, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, + 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x79, + 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x79, 0x70, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x79, 0x70, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x79, 0x70, + 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x68, 0x74, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x55, 0x73, + 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x64, 0x5f, 0x20, 0x49, 0x44, 0x50, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x49, 0x44, 0x50, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x55, 0x73, + 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x68, + 0x74, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x64, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x44, 0x50, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x44, 0x50, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x27, 0x73, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, + 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x66, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4b, 0x75, + 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x6b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6b, 0x75, + 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x69, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6b, 0x75, 0x62, + 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, + 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, + 0x6f, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x6f, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0x20, 0x69, 0x66, 0x20, 0x30, 0x20, 0x72, 0x65, 0x74, 0x72, 0x65, + 0x69, 0x76, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x5c, + 0x6e, 0x49, 0x66, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3e, 0x20, 0x23, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x61, 0x69, 0x6c, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x74, 0x61, + 0x69, 0x6c, 0x5c, 0x6e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x5c, 0x6e, 0x45, 0x69, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x27, 0x74, 0x61, 0x69, 0x6c, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x27, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, + 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x2e, 0x20, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4c, 0x6f, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x6f, 0x67, 0x73, + 0x2f, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2e, 0x20, + 0x69, 0x66, 0x20, 0x30, 0x20, 0x72, 0x65, 0x74, 0x72, 0x65, 0x69, 0x76, 0x65, 0x20, 0x65, 0x6e, + 0x74, 0x69, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x20, 0x3e, 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x6c, 0x6f, + 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x61, + 0x69, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, + 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x6e, 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x5c, 0x6e, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, + 0x6c, 0x6f, 0x67, 0x2e, 0x5c, 0x6e, 0x45, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x27, 0x74, 0x61, + 0x69, 0x6c, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x27, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x20, + 0x62, 0x6f, 0x74, 0x68, 0x2e, 0x20, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x6f, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x6c, 0x65, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x2f, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x5f, 0x6f, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x50, 0x55, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x53, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x6f, + 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x2f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x5f, 0x6f, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x53, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, + 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, + 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x69, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3a, + 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x32, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, + 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, + 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x6c, 0x69, 0x76, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x73, 0x5f, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, + 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x41, 0x4d, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x49, 0x41, 0x4d, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x41, 0x4d, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, + 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x73, 0x74, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, + 0x61, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x69, 0x61, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x6a, 0x75, 0x6d, 0x70, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x74, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x4a, + 0x75, 0x6d, 0x70, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x75, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x75, 0x6e, + 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x75, + 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x75, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x75, 0x6e, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x2f, 0x7b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x76, 0x70, 0x63, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x56, 0x50, 0x43, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x64, 0x6e, 0x73, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, + 0x64, 0x73, 0x20, 0x61, 0x20, 0x44, 0x4e, 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x4e, 0x53, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x64, 0x6e, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, + 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x64, 0x6e, 0x73, 0x20, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x49, 0x44, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, + 0x30, 0x32, 0x61, 0x35, 0x60, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, + 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x69, 0x64, 0x20, 0x6c, + 0x69, 0x6b, 0x65, 0x20, 0x27, 0x30, 0x32, 0x61, 0x35, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, + 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x64, 0x6e, 0x73, + 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x4e, 0x53, 0x20, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x64, 0x6e, 0x73, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x7b, + 0x64, 0x6e, 0x73, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x4e, 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, + 0x6e, 0x73, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, + 0x4e, 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6e, 0x73, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x2d, 0x20, 0x60, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x60, 0x5c, 0x6e, 0x2d, 0x20, + 0x60, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x60, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x64, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2c, 0x5c, 0x6e, 0x69, 0x74, 0x20, 0x67, 0x65, 0x74, 0x73, 0x20, 0x74, + 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x65, 0x74, + 0x68, 0x65, 0x75, 0x73, 0x2c, 0x20, 0x50, 0x65, 0x6e, 0x64, 0x6f, 0x2c, 0x20, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x57, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x65, 0x76, 0x65, 0x72, 0x5c, 0x6e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, + 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, + 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x41, 0x50, 0x49, 0x5c, 0x6e, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, + 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5c, 0x6e, 0x6e, 0x65, + 0x65, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, + 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, + 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, + 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, + 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, + 0x75, 0x72, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, + 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, + 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, + 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, + 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6c, 0x61, 0x76, 0x6f, + 0x75, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x66, 0x6c, 0x61, 0x76, 0x6f, + 0x75, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x76, + 0x6f, 0x75, 0x72, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x2d, + 0x20, 0x60, 0x61, 0x77, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x60, 0x5c, 0x6e, 0x2d, 0x20, 0x60, 0x61, 0x77, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x60, + 0x5c, 0x6e, 0x2d, 0x20, 0x60, 0x67, 0x63, 0x70, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x60, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, + 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, + 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x46, 0x6c, 0x61, 0x76, + 0x6f, 0x75, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x67, 0x63, 0x70, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, + 0x73, 0x2f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, + 0x65, 0x79, 0x73, 0x2e, 0x5c, 0x6e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, + 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, + 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, + 0x6e, 0x60, 0x70, 0x61, 0x67, 0x65, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, + 0x7a, 0x65, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, + 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, + 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, + 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, + 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, + 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x63, 0x70, 0x5f, 0x69, 0x6e, 0x71, 0x75, + 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, + 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x49, 0x4d, + 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x60, 0x70, 0x61, 0x67, 0x65, 0x60, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x31, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, 0x7a, 0x65, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x60, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, + 0x65, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, + 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x6b, 0x65, 0x79, 0x20, + 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, + 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, + 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x67, 0x63, 0x70, 0x5f, 0x69, 0x6e, + 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, + 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, + 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x67, 0x63, 0x70, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, 0x73, 0x2f, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x5c, 0x6e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x60, 0x70, 0x61, 0x67, 0x65, 0x60, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x31, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, 0x7a, 0x65, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, + 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, + 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, + 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, + 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, + 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x67, 0x63, 0x70, 0x5f, 0x69, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x69, 0x65, + 0x73, 0x2f, 0x76, 0x70, 0x63, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x76, 0x70, 0x63, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x2e, 0x5c, 0x6e, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, + 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5c, 0x6e, 0x60, + 0x70, 0x61, 0x67, 0x65, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, + 0x73, 0x20, 0x62, 0x65, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x73, 0x69, 0x7a, 0x65, + 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x60, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x70, 0x63, 0x73, 0x5c, + 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, + 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x76, 0x70, 0x63, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x56, 0x50, 0x43, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x56, 0x50, 0x43, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, + 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x20, 0x62, 0x65, 0x20, 0x60, 0x31, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, + 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x76, 0x70, 0x63, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, + 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x70, 0x63, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, + 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5c, + 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, + 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, + 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, + 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, + 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, + 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, + 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x5c, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, + 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x5c, 0x6e, 0x61, 0x6c, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x41, 0x60, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, + 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, + 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x41, 0x25, 0x27, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5c, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, + 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, + 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x7b, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x7d, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, + 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x52, 0x65, 0x64, 0x20, 0x48, 0x61, 0x74, + 0x27, 0x73, 0x20, 0x53, 0x33, 0x20, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x62, 0x79, 0x6f, 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x69, + 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x2f, 0x7b, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, + 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x69, 0x64, + 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x69, 0x64, 0x63, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, + 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, + 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x79, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, + 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, + 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, + 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, + 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, + 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, + 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, + 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x61, 0x6e, 0x20, 0x32, 0x30, 0x32, 0x33, 0x2d, 0x30, 0x33, 0x2d, 0x30, 0x31, 0x54, 0x30, 0x30, + 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x5a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x20, 0x3e, 0x20, 0x27, 0x32, 0x30, 0x32, 0x33, 0x2d, 0x30, 0x33, 0x2d, 0x30, 0x31, 0x54, 0x30, + 0x30, 0x3a, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x5a, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, + 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, + 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, + 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, + 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, + 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, + 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, + 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, + 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, + 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, + 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x5c, + 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, + 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, + 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, + 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, + 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, + 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x5c, 0x6e, 0x64, + 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, + 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, + 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x5c, 0x6e, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, + 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, + 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, + 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, + 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, + 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, + 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, + 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, + 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, + 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, + 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, + 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, + 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, + 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, + 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, + 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, + 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x5c, + 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, + 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, + 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, 0x65, + 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, + 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, + 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, + 0x60, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, + 0x74, 0x2d, 0x31, 0x60, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5c, 0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, + 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x27, 0x6d, 0x79, 0x25, 0x27, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x73, + 0x2d, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x31, 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, + 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, + 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x64, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x2f, + 0x7b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x71, + 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, + 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x51, 0x75, 0x6f, + 0x74, 0x61, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, + 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x70, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, + 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x70, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x72, 0x75, 0x73, + 0x74, 0x65, 0x64, 0x49, 0x70, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, + 0x61, 0x74, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, + 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, + 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, + 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, + 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, + 0x61, 0x6e, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, + 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x64, 0x65, + 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, + 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x69, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, + 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, + 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, + 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x5c, + 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x60, 0x31, 0x30, 0x30, + 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, + 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x60, 0x31, 0x30, 0x30, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, + 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x7b, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, + 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, + 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, + 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, + 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x5c, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, + 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, + 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x69, 0x64, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, + 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, + 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, + 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, + 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, + 0x6e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x74, 0x27, 0x5c, 0x6e, + 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x60, 0x31, 0x30, 0x30, 0x60, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, + 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x60, 0x31, 0x30, 0x30, 0x60, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x77, 0x69, 0x66, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x69, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x57, 0x69, 0x66, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x32, 0x30, 0x31, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, + 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x62, 0x79, 0x5f, 0x20, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x61, 0x20, 0x53, 0x51, 0x4c, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, + 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, + 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5c, 0x6e, 0x64, 0x65, + 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x69, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x67, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x20, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x5f, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x5c, 0x6e, 0x53, 0x51, 0x4c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, + 0x66, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x5c, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x6d, 0x79, 0x60, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x60, 0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x31, 0x60, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5c, 0x6e, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x73, 0x71, 0x6c, 0x5c, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, + 0x27, 0x6d, 0x79, 0x25, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, 0x74, 0x2d, 0x31, + 0x27, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x5c, 0x6e, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, + 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x77, + 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x70, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, + 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x61, 0x67, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, + 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2c, 0x5c, 0x6e, 0x72, 0x65, 0x67, 0x61, 0x72, + 0x64, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, + 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x77, 0x69, 0x66, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2f, 0x7b, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x72, 0x79, 0x20, 0x72, 0x75, 0x6e, + 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x6f, + 0x6e, 0x27, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x57, 0x69, 0x66, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, + 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, + 0x77, 0x69, 0x66, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x32, 0x30, 0x30, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x57, 0x69, 0x66, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x41, 0x4d, 0x49, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x4d, 0x49, 0x4f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, + 0x61, 0x74, 0x20, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x27, 0x41, 0x4d, 0x49, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, + 0x41, 0x4d, 0x49, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, + 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x6d, 0x69, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x4d, 0x49, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, + 0x53, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5f, 0x41, + 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x57, 0x65, 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x5f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x20, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x20, 0x45, 0x42, 0x53, 0x20, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, + 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2d, 0x62, 0x61, 0x73, + 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x57, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x54, 0x53, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x57, 0x53, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x57, + 0x53, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x20, 0x41, 0x52, 0x4e, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x27, 0x73, 0x20, 0x56, 0x50, 0x43, 0x20, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x41, 0x57, 0x53, 0x20, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x29, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x41, 0x57, 0x53, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x41, 0x57, 0x53, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, + 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x64, 0x69, 0x74, 0x20, + 0x6c, 0x6f, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x69, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x70, 0x75, 0x72, + 0x63, 0x68, 0x61, 0x73, 0x65, 0x64, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x63, 0x32, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x45, 0x63, 0x32, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x74, 0x74, 0x70, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, 0x43, 0x32, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x63, 0x32, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x48, 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x74, 0x63, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x65, 0x74, 0x63, 0x64, + 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x77, 0x73, 0x45, 0x74, 0x63, 0x64, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x5f, + 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x7a, 0x6f, 0x6e, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x52, 0x4e, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x68, 0x6f, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x74, + 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x69, 0x6e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x73, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x57, 0x53, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x69, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x61, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x73, 0x20, 0x74, + 0x61, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x41, 0x57, 0x53, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, + 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x57, + 0x53, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x5c, 0x6e, + 0x5c, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x57, + 0x53, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x69, 0x6e, 0x66, 0x72, 0x61, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x41, 0x57, 0x53, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x41, 0x57, 0x53, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, 0x49, + 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x41, 0x57, 0x53, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, + 0x6c, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x75, + 0x6d, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x60, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x60, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, + 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, + 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, + 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5f, + 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x52, 0x4c, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x41, 0x57, 0x53, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, + 0x6f, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x2e, 0x5c, 0x6e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x75, 0x73, + 0x65, 0x20, 0x61, 0x20, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x27, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x2e, 0x20, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, + 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x2e, 0x5c, 0x6e, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x20, 0x69, 0x73, 0x20, 0x27, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x41, 0x57, 0x53, 0x20, 0x49, 0x41, 0x4d, 0x20, 0x41, + 0x52, 0x4e, 0x20, 0x77, 0x65, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, + 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x57, + 0x53, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x57, 0x53, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x77, 0x73, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x57, 0x53, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x57, 0x53, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, + 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x41, 0x57, 0x53, 0x20, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x28, 0x65, 0x2e, + 0x67, 0x2e, 0x20, 0x77, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, 0x20, 0x73, 0x70, 0x6f, 0x74, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x53, 0x70, 0x6f, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x6f, + 0x75, 0x74, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6e, + 0x65, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x41, 0x57, 0x53, 0x20, 0x4f, 0x75, 0x74, + 0x70, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x61, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x73, 0x20, 0x41, 0x57, + 0x53, 0x20, 0x74, 0x61, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x41, 0x57, + 0x53, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x41, 0x57, 0x53, 0x20, 0x74, + 0x61, 0x67, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, + 0x67, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x3a, 0x5c, 0x6e, 0x2d, 0x20, + 0x45, 0x61, 0x63, 0x68, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x6f, 0x66, 0x20, 0x32, 0x35, 0x20, 0x74, 0x61, 0x67, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x54, + 0x61, 0x67, 0x73, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x5c, 0x22, 0x61, 0x77, 0x73, 0x3a, 0x5c, 0x22, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x5c, 0x6e, 0x2d, 0x20, 0x54, 0x61, + 0x67, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, + 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x32, 0x38, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x5c, 0x6e, 0x2d, 0x20, 0x54, 0x61, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, + 0x6e, 0x20, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x32, 0x35, 0x36, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x5c, 0x6e, 0x2d, 0x20, 0x54, 0x61, 0x67, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, + 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, + 0x3a, 0x20, 0x5b, 0x5f, 0x20, 0x2e, 0x20, 0x3a, 0x20, 0x2f, 0x20, 0x3d, 0x20, 0x2b, 0x20, 0x2d, + 0x20, 0x40, 0x5d, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x77, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, + 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x57, + 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x41, 0x57, 0x53, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67, + 0x2e, 0x20, 0x77, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x63, 0x32, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x45, 0x63, 0x32, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x74, 0x74, 0x70, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, 0x43, 0x32, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x63, 0x32, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, + 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, 0x45, + 0x43, 0x32, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, + 0x20, 0x49, 0x41, 0x4d, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x45, 0x43, 0x32, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x63, + 0x32, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x6d, 0x35, 0x2e, 0x6c, 0x61, 0x72, 0x67, + 0x65, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, + 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x73, + 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x41, 0x57, 0x53, 0x20, + 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x61, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, + 0x73, 0x20, 0x74, 0x61, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x41, 0x57, + 0x53, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x41, 0x57, 0x53, 0x20, 0x74, + 0x61, 0x67, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, + 0x67, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x3a, 0x5c, 0x6e, 0x2d, 0x20, + 0x45, 0x61, 0x63, 0x68, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x20, 0x6f, 0x66, 0x20, 0x32, 0x35, 0x20, 0x74, 0x61, 0x67, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x54, + 0x61, 0x67, 0x73, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x5c, 0x22, 0x61, 0x77, 0x73, 0x3a, 0x5c, 0x22, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x5c, 0x6e, 0x2d, 0x20, 0x54, 0x61, + 0x67, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, + 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x32, 0x38, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x5c, 0x6e, 0x2d, 0x20, 0x54, 0x61, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, + 0x6e, 0x20, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x32, 0x35, 0x36, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x5c, 0x6e, 0x2d, 0x20, 0x54, 0x61, 0x67, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x6c, + 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x73, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, + 0x3a, 0x20, 0x5b, 0x5f, 0x20, 0x2e, 0x20, 0x3a, 0x20, 0x2f, 0x20, 0x3d, 0x20, 0x2b, 0x20, 0x2d, + 0x20, 0x40, 0x5d, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, + 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x70, + 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x41, 0x57, 0x53, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x57, + 0x53, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x57, 0x53, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, + 0x78, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x20, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x6f, 0x74, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x2c, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x2d, 0x64, 0x65, 0x6d, 0x61, 0x6e, + 0x64, 0x20, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x41, 0x57, 0x53, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6f, 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x20, 0x49, 0x4f, 0x50, 0x53, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x47, 0x69, 0x62, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, 0x53, 0x54, 0x53, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x73, 0x74, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x72, + 0x6f, 0x73, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x53, 0x54, 0x53, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x52, 0x6f, + 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x53, 0x54, 0x53, 0x52, 0x6f, 0x6c, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x41, 0x57, 0x53, 0x53, 0x54, 0x53, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x73, 0x74, 0x73, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x73, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x41, 0x52, 0x4e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x49, 0x44, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x20, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, + 0x57, 0x53, 0x53, 0x54, 0x53, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x73, 0x74, 0x73, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x72, 0x6f, 0x73, 0x61, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x63, 0x70, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, + 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x48, 0x43, 0x50, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x3f, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x73, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3f, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x3f, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, + 0x20, 0x41, 0x52, 0x4e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x52, 0x6f, + 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6c, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x70, 0x65, 0x6e, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x43, 0x43, 0x53, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x43, 0x53, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x43, 0x43, 0x53, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x70, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x2c, 0x5c, 0x6e, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x55, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x53, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, + 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x50, 0x55, 0x20, + 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4f, 0x53, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x50, 0x55, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x43, 0x50, 0x55, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x4f, 0x53, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x43, 0x50, 0x55, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x20, + 0x62, 0x79, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5c, 0x6e, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x4f, 0x53, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x50, 0x55, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x53, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, + 0x6f, 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x4e, 0x53, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x4e, 0x53, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x61, 0x73, 0x65, 0x20, 0x44, 0x4e, 0x53, 0x20, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x20, 0x44, 0x4e, 0x53, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x2e, + 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, 0x75, 0x62, 0x2d, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x60, 0x6d, 0x79, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x60, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x60, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x44, + 0x4e, 0x53, 0x5c, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, + 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x6d, 0x79, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x61, + 0x70, 0x69, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x5c, 0x6e, + 0x6d, 0x79, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x74, 0x63, 0x64, 0x2d, 0x30, + 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x5c, 0x6e, 0x6d, 0x79, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x74, 0x63, 0x64, 0x2d, 0x31, 0x2e, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x5c, 0x6e, 0x6d, 0x79, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x65, 0x74, 0x63, 0x64, 0x2d, 0x33, 0x2e, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x44, 0x4e, 0x53, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, + 0x63, 0x74, 0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x5f, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x64, + 0x6f, 0x6e, 0x27, 0x74, 0x5c, 0x6e, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x6d, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x61, 0x73, 0x73, 0x75, + 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x60, 0x6d, 0x79, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x61, 0x70, + 0x69, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x60, 0x2e, 0x20, + 0x49, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x75, 0x73, 0x65, 0x5c, 0x6e, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x65, + 0x74, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x61, + 0x70, 0x69, 0x2e, 0x75, 0x72, 0x6c, 0x60, 0x5c, 0x6e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x60, 0x31, 0x32, 0x33, 0x60, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, + 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x5c, 0x6e, + 0x74, 0x68, 0x69, 0x73, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x68, 0x74, 0x74, 0x70, + 0x5c, 0x6e, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x31, 0x32, 0x33, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, + 0x31, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x61, 0x74, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, + 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, + 0x61, 0x70, 0x69, 0x2e, 0x75, 0x72, 0x6c, 0x60, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x5c, 0x6e, + 0x7b, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x5c, 0x22, 0x3a, + 0x20, 0x5c, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5c, 0x22, 0x2c, 0x5c, 0x6e, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x22, 0x69, 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x31, 0x32, 0x33, + 0x5c, 0x22, 0x2c, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x22, 0x68, 0x72, 0x65, 0x66, 0x5c, + 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x2f, 0x31, 0x32, 0x33, 0x5c, 0x22, 0x2c, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5c, 0x22, 0x61, 0x70, 0x69, 0x5c, 0x22, 0x3a, 0x20, 0x7b, 0x5c, 0x6e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x22, 0x75, 0x72, 0x6c, 0x5c, 0x22, 0x3a, + 0x20, 0x5c, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x6d, 0x79, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2d, 0x61, 0x70, 0x69, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x3a, 0x36, 0x34, 0x34, 0x33, 0x5c, 0x22, 0x5c, 0x6e, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x5c, 0x6e, 0x7d, 0x5c, + 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x57, 0x65, + 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5c, 0x6e, + 0x44, 0x4e, 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x57, 0x53, + 0x20, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x35, 0x33, 0x20, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, + 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x61, 0x77, 0x73, 0x2e, 0x61, 0x6d, + 0x61, 0x7a, 0x6f, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x35, 0x33, + 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x44, 0x4e, 0x53, 0x20, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x44, 0x4e, 0x53, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x44, 0x4e, 0x53, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, + 0x4e, 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, + 0x4e, 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x4e, + 0x53, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, + 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x64, 0x6e, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x47, 0x43, 0x50, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x75, 0x72, 0x69, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x72, 0x69, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x78, 0x35, 0x30, 0x39, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x20, 0x75, 0x72, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, + 0x50, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x63, 0x70, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x78, 0x35, 0x30, + 0x39, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x78, 0x35, 0x30, 0x39, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x75, 0x72, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, + 0x43, 0x50, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x6b, + 0x65, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, + 0x50, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x47, 0x63, 0x70, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x69, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, + 0x43, 0x50, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x75, 0x72, 0x69, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x62, 0x65, 0x6c, + 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x43, 0x50, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x43, 0x43, 0x53, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4b, + 0x4d, 0x53, 0x20, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, + 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, + 0x79, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x43, 0x50, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, + 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, + 0x61, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x20, 0x63, + 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, + 0x66, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x20, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, + 0x72, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x20, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x47, 0x43, 0x50, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x43, 0x50, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x47, 0x43, 0x50, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x47, 0x63, 0x70, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x61, 0x74, + 0x20, 0x61, 0x20, 0x47, 0x43, 0x50, 0x20, 0x56, 0x4d, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x69, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, + 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x42, 0x69, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, + 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x44, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x50, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x43, 0x50, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, + 0x70, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x50, 0x43, 0x20, 0x6d, 0x61, 0x6d, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x70, 0x63, + 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x73, 0x74, + 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x56, 0x50, 0x43, 0x20, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x43, 0x50, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x48, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x47, 0x43, 0x50, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x47, 0x69, 0x62, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x48, 0x54, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, + 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, + 0x5f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x5f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x48, 0x54, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x64, 0x55, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x44, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x61, 0x72, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x54, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x20, 0x48, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x64, 0x5f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x61, + 0x73, 0x2d, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x48, 0x54, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x20, 0x49, 0x44, 0x50, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x2d, 0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x69, + 0x73, 0x20, 0x68, 0x61, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x20, 0x49, 0x44, 0x50, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x5f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, 0x64, 0x5f, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x44, 0x41, + 0x50, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x44, 0x41, 0x50, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x44, + 0x41, 0x50, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x44, + 0x41, 0x50, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x6c, 0x64, 0x61, 0x70, + 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x55, 0x52, 0x4c, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x6e, 0x20, 0x68, 0x74, + 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x2e, 0x69, 0x65, 0x74, 0x66, + 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2f, 0x72, 0x66, 0x63, 0x32, 0x32, 0x35, + 0x35, 0x5b, 0x52, 0x46, 0x43, 0x20, 0x32, 0x32, 0x35, 0x35, 0x5d, 0x20, 0x55, 0x52, 0x4c, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x4c, 0x44, 0x41, 0x50, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x61, 0x6e, + 0x64, 0x5c, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x44, 0x41, 0x50, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x44, 0x41, 0x50, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x64, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x69, 0x6e, 0x64, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x70, 0x68, 0x61, 0x73, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x69, 0x6e, 0x64, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x70, 0x68, 0x61, 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, + 0x65, 0x6e, 0x20, 0x60, 0x74, 0x72, 0x75, 0x65, 0x60, 0x20, 0x6e, 0x6f, 0x20, 0x54, 0x4c, 0x53, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6d, + 0x61, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x60, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x60, 0x20, + 0x60, 0x6c, 0x64, 0x61, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x2e, 0x2e, 0x2e, 0x60, 0x20, 0x55, 0x52, + 0x4c, 0x73, 0x5c, 0x6e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x6c, 0x64, 0x61, 0x70, 0x3a, + 0x2f, 0x2f, 0x2e, 0x2e, 0x2e, 0x60, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x54, 0x4c, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x53, 0x54, 0x53, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x57, 0x53, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x52, 0x4c, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x74, + 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x2d, 0x20, 0x4f, 0x43, + 0x4d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x2e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x66, 0x20, 0x53, 0x54, 0x53, 0x20, 0x69, 0x73, 0x20, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x69, 0x6e, 0x67, + 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x61, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x49, 0x41, 0x4d, 0x20, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x41, + 0x4d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x4f, 0x69, 0x64, 0x63, + 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x61, 0x6d, + 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x41, 0x4d, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, + 0x6f, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, + 0x72, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x52, 0x4e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x57, 0x53, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, + 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x6f, 0x6c, + 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x52, 0x4e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x57, 0x53, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x53, 0x52, 0x45, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x41, 0x57, 0x53, + 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x54, 0x53, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, + 0x63, 0x72, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x72, + 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x54, 0x53, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x54, 0x53, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x63, 0x70, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x63, + 0x70, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, + 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x6c, 0x69, 0x6e, + 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, + 0x2d, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x61, + 0x73, 0x65, 0x36, 0x34, 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x69, 0x63, 0x6f, + 0x6e, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x69, 0x63, + 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x50, 0x4e, 0x47, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, + 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x6d, 0x61, 0x6e, 0x79, + 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x20, + 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, + 0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x75, 0x62, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, + 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x53, 0x75, 0x62, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x20, 0x43, 0x52, 0x44, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, + 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, + 0x2d, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, + 0x64, 0x64, 0x4f, 0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x65, 0x6e, 0x76, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, + 0x4f, 0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x65, 0x6e, 0x76, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6f, 0x77, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, + 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, + 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, + 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x77, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, + 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x49, 0x44, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x61, 0x64, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, + 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, 0x64, 0x69, 0x74, 0x65, + 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x64, 0x69, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x70, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x5c, 0x6e, 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x5c, 0x22, 0x75, 0x70, 0x5c, 0x22, 0x2c, 0x20, + 0x5c, 0x22, 0x64, 0x6f, 0x77, 0x6e, 0x5c, 0x22, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x5c, 0x22, 0x5c, + 0x22, 0x20, 0x28, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, + 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x72, 0x75, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x61, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x61, 0x6e, 0x6b, 0x20, 0x6f, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x73, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x65, 0x64, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x61, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, + 0x64, 0x64, 0x4f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, + 0x4f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x20, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, + 0x64, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x53, 0x75, 0x62, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x41, 0x20, 0x73, 0x75, 0x62, + 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5c, 0x6e, 0x77, 0x68, 0x6f, 0x27, 0x73, 0x20, + 0x6c, 0x69, 0x66, 0x65, 0x20, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x75, 0x6d, 0x62, 0x72, 0x65, 0x6c, 0x6c, 0x61, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, + 0x64, 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, + 0x4f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x74, 0x61, + 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x74, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, + 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, + 0x64, 0x4f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x70, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x5f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x75, 0x62, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x53, 0x75, 0x62, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x74, + 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x44, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, + 0x75, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x78, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x72, 0x75, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x20, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, + 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x5c, 0x22, 0x6d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x5c, 0x22, 0x20, 0x28, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x5c, 0x22, + 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x5c, 0x22, 0x20, 0x28, 0x72, 0x65, 0x2d, + 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x20, 0x4d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x5c, 0x22, 0x41, 0x44, 0x44, 0x4f, 0x4e, 0x5c, 0x22, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x64, 0x64, + 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, + 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x27, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x27, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x63, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, + 0x27, 0x2c, 0x20, 0x27, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x27, 0x2c, 0x5c, 0x6e, 0x27, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x27, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x75, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x64, 0x6d, + 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, + 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x20, 0x66, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x61, 0x6d, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x20, 0x73, + 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, + 0x74, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x53, + 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x20, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x65, 0x6c, + 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, + 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x6c, 0x65, 0x72, + 0x74, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x20, 0x66, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x41, 0x6c, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x61, 0x75, 0x64, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x52, 0x4e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, + 0x6c, 0x6f, 0x75, 0x64, 0x57, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x75, 0x64, 0x69, 0x74, 0x20, + 0x6c, 0x6f, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x70, 0x75, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x69, + 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x47, 0x50, 0x55, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3c, 0x67, 0x70, 0x75, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3e, 0x3a, + 0x3c, 0x6d, 0x69, 0x6e, 0x3e, 0x3a, 0x3c, 0x6d, 0x61, 0x78, 0x3e, 0x2e, 0x5c, 0x6e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x79, 0x6f, + 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x47, 0x50, 0x55, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, + 0x72, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3c, 0x6d, + 0x69, 0x6e, 0x3e, 0x3a, 0x3c, 0x6d, 0x61, 0x78, 0x3e, 0x2e, 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x79, 0x6f, 0x6e, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, 0x5c, 0x6e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x67, 0x72, 0x6f, 0x77, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x79, + 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x69, 0x67, + 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3c, 0x6d, 0x69, 0x6e, 0x3e, + 0x3a, 0x3c, 0x6d, 0x61, 0x78, 0x3e, 0x2e, 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x79, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x73, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x75, + 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x47, 0x50, 0x55, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x47, 0x50, 0x55, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x74, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x79, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x47, 0x50, 0x55, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x20, 0x62, 0x79, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x5c, 0x6e, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2e, 0x20, 0x46, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x72, 0x72, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x5c, 0x6e, 0x60, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x60, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x72, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x77, 0x20, 0x6c, 0x6f, + 0x6e, 0x67, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x75, + 0x70, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, + 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x48, 0x6f, 0x77, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x65, 0x76, 0x61, + 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x2c, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x61, + 0x6e, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x77, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x61, 0x75, 0x74, 0x6f, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x77, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, + 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x2c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, 0x75, 0x6d, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x62, 0x65, 0x6c, + 0x6f, 0x77, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x77, 0x73, 0x45, 0x74, 0x63, 0x64, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x65, 0x74, 0x63, 0x64, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x41, 0x57, 0x53, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x52, 0x4e, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4b, 0x4d, 0x53, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x74, 0x63, + 0x64, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x5d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5c, 0x6e, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x5c, 0x6e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x60, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x60, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x60, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x65, + 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x60, 0x2e, 0x5c, 0x6e, + 0x60, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x20, 0x69, 0x73, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, 0x4e, + 0x6f, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x2c, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, + 0x4e, 0x61, 0x6d, 0x65, 0x5c, 0x6e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x77, 0x6e, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, + 0x69, 0x64, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x5b, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x44, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5c, 0x6e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5c, 0x6e, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x60, 0x73, + 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x60, 0x2e, 0x5c, 0x6e, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x61, 0x73, 0x73, 0x6f, + 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5c, 0x6e, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x60, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x60, 0x2e, 0x5c, 0x6e, 0x60, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x5c, 0x6e, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, 0x54, + 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x5c, 0x6e, 0x60, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, + 0x72, 0x65, 0x5c, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x73, 0x20, 0x60, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x60, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x5c, + 0x6e, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x60, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x5c, 0x6e, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x6d, 0x75, 0x73, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, + 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x5c, 0x6e, + 0x60, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x2e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x60, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x61, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x5c, 0x6e, 0x60, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x5d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x60, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x60, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x20, 0x69, 0x73, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5c, 0x6e, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x5b, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5d, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x41, 0x7a, 0x75, + 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x60, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x2e, 0x5c, 0x6e, 0x60, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x20, 0x69, + 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x5d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x72, + 0x65, 0x2d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x5c, 0x6e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x60, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x5c, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x60, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, + 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x60, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x60, 0x2e, 0x5c, 0x6e, + 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x60, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x60, + 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, + 0x65, 0x5c, 0x6e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, + 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x60, + 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x64, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x5c, 0x6e, 0x60, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, + 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x60, 0x5c, 0x6e, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x73, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x5c, 0x6e, 0x60, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x5b, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5d, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, + 0x74, 0x20, 0x49, 0x44, 0x20, 0x60, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x60, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x5b, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5d, 0x20, 0x54, 0x68, + 0x65, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x45, 0x6e, 0x74, 0x72, + 0x61, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x20, 0x49, 0x44, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, + 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, + 0x69, 0x62, 0x69, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x47, 0x69, 0x42, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x53, 0x20, 0x64, 0x69, 0x73, + 0x6b, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x50, 0x6f, 0x6f, + 0x6c, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5c, + 0x6e, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x78, 0x20, 0x31, 0x30, 0x32, 0x34, 0x5e, 0x33, + 0x2e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x2c, 0x20, 0x4f, 0x53, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x33, 0x30, 0x20, 0x47, 0x69, 0x42, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x6b, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x53, + 0x20, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x5c, 0x6e, 0x2a, 0x20, 0x53, 0x74, 0x61, 0x6e, + 0x64, 0x61, 0x72, 0x64, 0x5f, 0x4c, 0x52, 0x53, 0x3a, 0x20, 0x48, 0x44, 0x44, 0x5c, 0x6e, 0x2a, + 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x53, 0x53, 0x44, 0x5f, 0x4c, 0x52, 0x53, + 0x3a, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x53, 0x53, 0x44, 0x5c, 0x6e, + 0x2a, 0x20, 0x50, 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x5f, 0x4c, 0x52, 0x53, 0x3a, 0x20, 0x50, + 0x72, 0x65, 0x6d, 0x69, 0x75, 0x6d, 0x20, 0x53, 0x44, 0x44, 0x5c, 0x6e, 0x2a, 0x20, 0x55, 0x6c, + 0x74, 0x72, 0x61, 0x53, 0x53, 0x44, 0x5f, 0x4c, 0x52, 0x53, 0x3a, 0x20, 0x55, 0x6c, 0x74, 0x72, + 0x61, 0x20, 0x53, 0x44, 0x44, 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x60, 0x50, 0x72, 0x65, 0x6d, + 0x69, 0x75, 0x6d, 0x5f, 0x4c, 0x52, 0x53, 0x60, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6d, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x56, 0x69, 0x72, 0x74, 0x75, + 0x61, 0x6c, 0x20, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, + 0x5c, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f, + 0x66, 0x20, 0x56, 0x4d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5c, 0x6e, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, + 0x61, 0x6c, 0x5f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x45, 0x70, 0x68, 0x65, 0x6d, + 0x65, 0x72, 0x61, 0x6c, 0x20, 0x4f, 0x53, 0x20, 0x44, 0x69, 0x73, 0x6b, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x5c, 0x6e, 0x49, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, + 0x20, 0x6e, 0x6f, 0x20, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x4f, 0x53, + 0x20, 0x44, 0x69, 0x73, 0x6b, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x2e, 0x5c, + 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x2e, + 0x5c, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x2e, 0x5c, + 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, + 0x6f, 0x2e, 0x5c, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, + 0x66, 0x74, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x20, + 0x49, 0x44, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6c, + 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x2e, 0x5c, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, 0x49, 0x6d, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x69, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x2d, 0x61, 0x77, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2d, 0x67, 0x63, + 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2d, 0x72, 0x68, 0x6d, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x69, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x42, 0x69, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x74, 0x65, 0x6d, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x27, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x74, 0x65, + 0x6d, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x69, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, + 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, + 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x20, + 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x67, 0x63, 0x70, 0x2c, 0x20, 0x61, 0x77, 0x73, 0x2c, 0x20, 0x65, + 0x74, 0x63, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, + 0x61, 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x47, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, 0x61, 0x73, 0x73, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6b, 0x75, 0x62, 0x65, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, 0x61, + 0x73, 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x47, 0x6c, 0x61, 0x73, + 0x73, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x20, 0x67, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x42, 0x79, 0x6f, 0x4f, 0x69, 0x64, 0x63, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x79, 0x6f, 0x4f, 0x69, 0x64, 0x63, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x5f, 0x42, 0x79, 0x6f, 0x4f, + 0x69, 0x64, 0x63, 0x5f, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x42, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x60, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x52, 0x4f, 0x53, + 0x41, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, + 0x5c, 0x6e, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x62, + 0x79, 0x6f, 0x2d, 0x6f, 0x69, 0x64, 0x63, 0x60, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x56, 0x50, 0x43, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, + 0x20, 0x6f, 0x66, 0x20, 0x41, 0x57, 0x53, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, + 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x41, 0x57, 0x53, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x69, 0x64, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x49, + 0x44, 0x52, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x60, 0x4e, 0x61, 0x6d, 0x65, 0x60, 0x20, + 0x74, 0x61, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x57, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x52, 0x48, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, + 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, + 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, + 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, + 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x2e, 0x20, 0x49, 0x74, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, + 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x5c, 0x6e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x75, 0x6d, 0x61, + 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x61, 0x77, 0x73, 0x60, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x28, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x20, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x27, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x2d, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x66, 0x65, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x3d, 0x74, 0x72, 0x75, 0x65, 0x60, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x64, + 0x61, 0x74, 0x61, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x71, 0x75, + 0x69, 0x72, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x57, 0x65, 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x43, 0x50, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4b, 0x65, 0x79, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x70, 0x63, 0x5f, 0x69, 0x64, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x56, 0x50, 0x43, 0x20, 0x69, 0x64, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, 0x6f, 0x75, 0x64, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x63, 0x73, 0x5f, 0x6f, + 0x6e, 0x6c, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x27, 0x74, 0x72, 0x75, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43, + 0x43, 0x53, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x27, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x27, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x6d, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x28, 0x47, 0x43, 0x50, 0x20, 0x6f, 0x6e, 0x6c, + 0x79, 0x29, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x2d, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x4d, 0x53, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x44, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, + 0x45, 0x2e, 0x67, 0x2e, 0x20, 0x5c, 0x22, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2c, 0x6e, 0x61, + 0x6d, 0x34, 0x2c, 0x75, 0x73, 0x5c, 0x22, 0x2e, 0x20, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x69, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x6d, 0x73, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x28, 0x47, 0x43, 0x50, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x2d, 0x73, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x4b, 0x4d, 0x53, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, 0x5c, 0x6e, 0x45, 0x2e, 0x67, + 0x2e, 0x20, 0x5c, 0x22, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2c, 0x6e, 0x61, 0x6d, 0x34, 0x20, + 0x28, 0x49, 0x6f, 0x77, 0x61, 0x2c, 0x20, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x43, 0x61, 0x72, + 0x6f, 0x6c, 0x69, 0x6e, 0x61, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4f, 0x6b, 0x6c, 0x61, 0x68, + 0x6f, 0x6d, 0x61, 0x29, 0x2c, 0x55, 0x53, 0x5c, 0x22, 0x2e, 0x20, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x20, 0x4b, 0x4d, 0x53, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x2e, + 0x5c, 0x6e, 0x55, 0x6e, 0x66, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, + 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x72, 0x6f, 0x62, 0x75, 0x73, 0x74, 0x20, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x63, 0x74, 0x20, 0x6f, 0x63, 0x6d, 0x2d, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x40, + 0x72, 0x65, 0x64, 0x68, 0x61, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, + 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, + 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x4e, 0x2e, 0x20, 0x56, 0x69, + 0x72, 0x67, 0x69, 0x6e, 0x69, 0x61, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, + 0x6f, 0x76, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, + 0x20, 0x41, 0x57, 0x53, 0x20, 0x47, 0x6f, 0x76, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, + 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x75, 0x73, 0x2d, 0x65, 0x61, 0x73, 0x74, + 0x2d, 0x31, 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x4e, 0x4f, 0x54, 0x45, 0x3a, 0x20, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x60, 0x69, 0x64, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x5c, 0x6e, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x68, + 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x27, 0x74, 0x72, 0x75, 0x65, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x69, + 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x27, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x27, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x61, 0x7a, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x68, + 0x69, 0x66, 0x74, 0x5f, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x54, 0x68, 0x65, 0x20, 0x60, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x60, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x5c, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, + 0x65, 0x64, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x5c, 0x6e, 0x74, 0x68, 0x65, + 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3a, 0x5c, 0x6e, + 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x5c, 0x6e, 0x7b, 0x5c, 0x6e, 0x20, 0x20, + 0x5c, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5c, 0x22, 0x3a, 0x20, 0x7b, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x22, 0x6b, 0x69, 0x6e, + 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x5c, 0x22, 0x2c, 0x5c, 0x6e, 0x20, 0x20, 0x20, + 0x20, 0x5c, 0x22, 0x69, 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x31, 0x32, 0x33, 0x5c, 0x22, + 0x2c, 0x5c, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x22, 0x68, 0x72, 0x65, 0x66, 0x5c, 0x22, 0x3a, + 0x20, 0x5c, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x31, 0x32, 0x33, 0x5c, 0x22, 0x5c, 0x6e, + 0x20, 0x20, 0x7d, 0x5c, 0x6e, 0x7d, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x57, + 0x68, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x66, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, + 0x6f, 0x20, 0x75, 0x73, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x5c, 0x6e, 0x7b, 0x5c, 0x6e, 0x20, 0x20, 0x5c, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5c, 0x22, 0x3a, 0x20, 0x7b, 0x5c, 0x6e, 0x20, + 0x20, 0x20, 0x20, 0x5c, 0x22, 0x69, 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x31, 0x32, 0x33, + 0x5c, 0x22, 0x2c, 0x5c, 0x6e, 0x20, 0x20, 0x7d, 0x5c, 0x6e, 0x7d, 0x5c, 0x6e, 0x60, 0x60, 0x60, + 0x5c, 0x6e, 0x5c, 0x6e, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x6e, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, + 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x41, 0x6d, 0x61, 0x7a, + 0x6f, 0x6e, 0x20, 0x57, 0x65, 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, + 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, + 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x20, 0x60, 0x61, 0x77, 0x73, 0x2e, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x60, 0x2c, 0x20, 0x60, 0x61, 0x77, + 0x73, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6b, 0x65, 0x79, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x64, 0x6e, 0x73, 0x2e, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x60, 0x5c, 0x6e, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x77, 0x6e, 0x20, 0x41, 0x6d, 0x61, 0x7a, 0x6f, + 0x6e, 0x20, 0x57, 0x65, 0x62, 0x5c, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, + 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x69, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x50, 0x49, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x6d, 0x61, 0x7a, 0x6f, 0x6e, 0x20, 0x57, 0x65, + 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x41, 0x57, 0x53, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, + 0x5f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x57, 0x53, 0x20, 0x69, + 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x6f, 0x6c, 0x65, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x63, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x65, 0x72, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x43, 0x53, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6e, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x4e, + 0x53, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x4e, 0x53, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x69, 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, + 0x73, 0x20, 0x46, 0x49, 0x50, 0x53, 0x20, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x2f, 0x20, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x43, 0x50, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4b, 0x65, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x47, 0x43, 0x50, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x47, 0x43, 0x50, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x5f, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, + 0x43, 0x50, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x73, 0x74, 0x20, 0x62, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x6f, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x2d, 0x6f, 0x6e, + 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, + 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x5f, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x5f, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x64, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x79, 0x6f, 0x5f, 0x6f, 0x69, 0x64, + 0x63, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x42, 0x59, 0x4f, + 0x20, 0x4f, 0x49, 0x44, 0x43, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x42, 0x79, 0x6f, 0x4f, 0x69, 0x64, 0x63, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, + 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x5b, 0x52, 0x46, 0x43, 0x33, 0x33, 0x33, 0x39, 0x5d, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, + 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x29, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x73, 0x65, + 0x72, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x5c, 0x6e, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x2e, 0x20, 0x49, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, + 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x74, 0x63, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x74, 0x63, 0x64, 0x20, 0x69, 0x73, 0x20, + 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, + 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x5c, 0x6e, 0x5b, 0x52, 0x46, 0x43, 0x33, 0x33, 0x33, 0x39, 0x5d, 0x28, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, + 0x74, 0x78, 0x74, 0x29, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5c, 0x6e, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, + 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x68, 0x6f, 0x77, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x66, 0x6c, 0x61, 0x76, + 0x6f, 0x75, 0x72, 0x5f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x76, 0x65, + 0x72, 0x61, 0x6c, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, + 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x79, 0x70, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x79, 0x70, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, + 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x56, 0x50, 0x43, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x77, 0x69, 0x64, 0x65, 0x20, 0x4b, 0x75, 0x62, + 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x71, 0x75, 0x6f, 0x74, + 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x20, + 0x71, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x20, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x46, 0x6c, + 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x28, 0x62, 0x79, 0x20, 0x52, 0x65, 0x64, 0x20, + 0x48, 0x61, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, + 0x61, 0x7a, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x46, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, + 0x6e, 0x5c, 0x6e, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x5c, 0x6e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x6c, 0x79, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x20, 0x61, 0x72, 0x63, 0x68, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, + 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x20, 0x67, + 0x72, 0x61, 0x63, 0x65, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x34, 0x2e, 0x30, 0x2e, 0x30, 0x2d, 0x30, 0x2e, 0x32, + 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x64, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x6f, 0x5c, 0x6e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, + 0x72, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x41, 0x57, 0x53, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x43, 0x50, 0x20, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5c, 0x6e, 0x69, 0x73, 0x20, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x5f, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x41, 0x50, 0x49, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, + 0x77, 0x69, 0x64, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, + 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x60, 0x2d, 0x2d, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x2d, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x2d, 0x6e, 0x6f, + 0x64, 0x65, 0x2d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x60, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2d, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x5c, 0x6e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x79, 0x5c, 0x6e, 0x74, 0x6f, + 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x6f, 0x73, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, + 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, + 0x72, 0x69, 0x74, 0x79, 0x2e, 0x5c, 0x6e, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x5c, 0x22, 0x74, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2e, 0x65, 0x62, 0x73, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x61, 0x77, + 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x7a, 0x6f, 0x6e, 0x65, 0x5c, 0x22, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x20, 0x68, 0x65, 0x72, 0x65, 0x5c, 0x6e, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x70, 0x6c, 0x69, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, + 0x69, 0x74, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x65, + 0x6d, 0x6f, 0x6e, 0x73, 0x65, 0x74, 0x73, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x43, 0x41, 0x20, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x20, 0x70, + 0x6f, 0x64, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x63, + 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x67, 0x5f, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, + 0x69, 0x74, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x2e, 0x5c, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x34, 0x20, + 0x69, 0x73, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x44, 0x45, 0x42, 0x55, 0x47, 0x47, 0x49, 0x4e, 0x47, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x36, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x65, 0x76, 0x65, 0x72, + 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, + 0x61, 0x78, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x43, 0x41, 0x20, 0x77, 0x61, 0x69, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x69, 0x76, 0x65, 0x73, 0x20, 0x70, 0x6f, 0x64, 0x73, 0x20, + 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, + 0x20, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x5c, 0x22, 0x62, 0x65, 0x73, 0x74, 0x2d, 0x65, + 0x66, 0x66, 0x6f, 0x72, 0x74, 0x5c, 0x22, 0x20, 0x70, 0x6f, 0x64, 0x73, 0x2c, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x5c, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x41, + 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x75, 0x6e, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, + 0x70, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x5c, 0x6e, 0x4d, 0x6f, 0x72, 0x65, 0x20, + 0x69, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x2f, 0x62, + 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2d, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x2f, 0x46, 0x41, + 0x51, 0x2e, 0x6d, 0x64, 0x23, 0x68, 0x6f, 0x77, 0x2d, 0x64, 0x6f, 0x65, 0x73, 0x2d, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2d, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x2d, 0x77, 0x6f, 0x72, 0x6b, 0x2d, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x70, 0x6f, 0x64, 0x2d, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x2d, 0x61, 0x6e, 0x64, 0x2d, 0x70, 0x72, 0x65, 0x65, + 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x20, 0x60, 0x2d, 0x2d, 0x73, 0x6b, 0x69, 0x70, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x2d, 0x77, 0x69, 0x74, 0x68, 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2d, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x60, 0x20, 0x43, 0x41, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x6f, + 0x64, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x44, 0x69, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x2e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x61, 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x75, 0x6c, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x52, 0x45, 0x46, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, 0x73, 0x20, 0x49, 0x44, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x73, 0x63, 0x61, + 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x5c, 0x6e, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, + 0x6f, 0x6e, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x75, 0x70, 0x6f, 0x6e, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5c, 0x22, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5c, 0x22, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x72, 0x35, 0x2e, 0x78, + 0x6c, 0x61, 0x72, 0x67, 0x65, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x63, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, + 0x66, 0x72, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x72, 0x35, 0x2e, 0x78, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x60, + 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x20, 0x60, 0x72, 0x35, 0x2e, 0x78, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x60, 0x20, 0x28, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x20, 0x20, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, 0x74, 0x72, 0x61, 0x20, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x20, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x61, + 0x73, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x5b, + 0x52, 0x46, 0x43, 0x33, 0x33, 0x33, 0x39, 0x5d, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, + 0x63, 0x2f, 0x72, 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x29, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, + 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, + 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x5c, 0x6e, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2c, 0x20, + 0x73, 0x65, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, + 0x60, 0x60, 0x68, 0x74, 0x74, 0x70, 0x5c, 0x6e, 0x50, 0x4f, 0x53, 0x54, 0x20, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x2f, + 0x76, 0x31, 0x2f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x5c, 0x6e, 0x60, 0x60, + 0x60, 0x5c, 0x6e, 0x5c, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x5c, 0x6e, + 0x7b, 0x5c, 0x6e, 0x20, 0x20, 0x5c, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x69, 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x64, 0x36, 0x35, 0x36, 0x61, 0x65, 0x63, 0x66, + 0x2d, 0x31, 0x31, 0x61, 0x36, 0x2d, 0x34, 0x37, 0x38, 0x32, 0x2d, 0x61, 0x64, 0x38, 0x36, 0x2d, + 0x38, 0x66, 0x37, 0x32, 0x36, 0x33, 0x38, 0x34, 0x34, 0x39, 0x62, 0x61, 0x5c, 0x22, 0x2c, 0x5c, + 0x6e, 0x20, 0x20, 0x5c, 0x22, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, 0x2c, + 0x5c, 0x6e, 0x20, 0x20, 0x5c, 0x22, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x5c, 0x22, 0x3a, 0x20, 0x5c, 0x22, 0x2e, 0x2e, 0x2e, 0x5c, 0x22, + 0x5c, 0x6e, 0x7d, 0x5c, 0x6e, 0x60, 0x60, 0x60, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5c, + 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x44, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x77, 0x65, + 0x72, 0x65, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x76, 0x65, + 0x72, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, + 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x77, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, + 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x4e, 0x53, 0x52, 0x65, 0x61, 0x64, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4f, 0x49, 0x44, 0x43, 0x52, 0x65, 0x61, 0x64, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x48, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x43, 0x6f, + 0x64, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x76, + 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x27, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6c, 0x73, + 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x4c, 0x53, 0x20, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x44, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x20, + 0x69, 0x74, 0x27, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x78, 0x74, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, + 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x65, + 0x61, 0x63, 0x68, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, + 0x73, 0x61, 0x72, 0x79, 0x20, 0x41, 0x57, 0x53, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x20, 0x6c, 0x69, 0x76, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6e, 0x65, 0x65, + 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, + 0x67, 0x20, 0x5f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x42, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x60, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x69, 0x74, 0x20, 0x61, 0x20, 0x53, 0x52, 0x45, 0x50, 0x20, 0x6e, 0x65, 0x65, 0x64, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x4f, 0x43, 0x4d, + 0x20, 0x41, 0x50, 0x49, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x63, 0x32, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x48, 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x45, 0x63, 0x32, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x74, 0x74, 0x70, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x45, 0x43, 0x32, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, + 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6b, 0x65, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x45, 0x6e, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x61, + 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x68, 0x65, 0x20, + 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x73, 0x20, 0x4b, 0x65, 0x79, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4b, 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6b, 0x65, 0x79, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x6e, 0x5c, 0x6e, 0x75, 0x70, 0x70, 0x65, 0x72, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x5c, 0x6e, 0x75, + 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, + 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x61, 0x6e, 0x20, 0x36, 0x34, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x41, 0x75, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x6e, + 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, + 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, + 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x27, + 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6e, + 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, + 0x73, 0x73, 0x75, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x73, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x6f, + 0x77, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x61, 0x6e, 0x20, 0x49, 0x44, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x75, 0x6c, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x27, 0x73, + 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x5c, 0x6e, 0x6e, + 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x45, 0x78, 0x74, 0x72, 0x61, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x6e, + 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x42, 0x79, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x52, 0x4f, 0x53, + 0x41, 0x20, 0x48, 0x43, 0x50, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6e, + 0x65, 0x65, 0x64, 0x73, 0x5c, 0x6e, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x60, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x61, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, + 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, + 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x2c, 0x20, 0x61, 0x20, 0x5f, 0x68, 0x75, 0x67, 0x65, 0x5f, 0x20, 0x66, 0x6c, 0x61, 0x76, + 0x6f, 0x75, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5c, 0x6e, 0x77, 0x69, 0x74, 0x68, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6e, + 0x66, 0x72, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x30, + 0x30, 0x30, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x27, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x5f, 0x41, 0x6d, 0x61, 0x7a, 0x6f, + 0x6e, 0x20, 0x57, 0x65, 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x20, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x5f, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x43, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x47, 0x43, 0x50, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x75, 0x6d, 0x61, 0x6e, + 0x20, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x20, 0x60, 0x34, 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x4e, 0x4f, 0x54, 0x45, 0x3a, 0x20, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x69, + 0x64, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x6e, 0x61, 0x6d, 0x65, 0x60, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x65, 0x78, + 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x73, 0x61, 0x6d, 0x65, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x5c, + 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x61, 0x20, 0x64, 0x69, + 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x73, 0x5c, 0x6e, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, 0x68, 0x65, + 0x73, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x64, 0x65, 0x6e, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x74, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x46, + 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x75, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x63, 0x70, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, + 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x47, 0x63, 0x70, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x6f, + 0x6f, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x69, 0x66, + 0x20, 0x53, 0x68, 0x69, 0x65, 0x6c, 0x64, 0x65, 0x64, 0x20, 0x56, 0x4d, 0x20, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x20, 0x5c, 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x42, 0x6f, + 0x6f, 0x74, 0x5c, 0x22, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x60, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x74, 0x20, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x5f, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x5f, 0x20, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x5f, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x5f, 0x20, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x46, 0x6f, 0x72, 0x20, 0x5f, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x20, 0x45, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x5f, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, + 0x6f, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x72, + 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, + 0x61, 0x73, 0x5c, 0x6e, 0x60, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x60, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x47, 0x69, + 0x74, 0x48, 0x75, 0x62, 0x20, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x5f, + 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x60, 0x2f, 0x73, 0x65, 0x74, 0x75, 0x70, + 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x60, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x61, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x46, 0x6f, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x5f, + 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x5f, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x20, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x2e, 0x20, 0x43, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x60, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x20, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x62, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x20, 0x74, 0x6f, 0x74, 0x20, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x52, 0x4c, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x5f, 0x20, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x5f, 0x47, 0x69, + 0x74, 0x4c, 0x61, 0x62, 0x5f, 0x20, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x20, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x5f, 0x47, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x5f, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x60, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x60, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x20, 0x5f, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x20, 0x62, 0x79, + 0x20, 0x5f, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, + 0x63, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, + 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x27, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, + 0x73, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, + 0x6c, 0x61, 0x69, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x20, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, + 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x42, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x5f, + 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x42, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x60, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x54, + 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x65, 0x20, 0x52, 0x4f, 0x53, 0x41, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5c, 0x6e, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x68, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, + 0x60, 0x20, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x48, 0x79, 0x70, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x5f, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x2e, 0x5c, 0x6e, 0x5c, + 0x6e, 0x42, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x60, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x60, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, + 0x54, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x62, 0x65, 0x20, 0x52, 0x4f, 0x53, 0x41, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x5c, 0x6e, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x68, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, + 0x74, 0x60, 0x20, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x48, + 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x5c, 0x6e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, + 0x6e, 0x20, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, + 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, + 0x64, 0x61, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x60, 0x6c, 0x64, 0x61, 0x70, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x44, 0x41, 0x50, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, + 0x68, 0x65, 0x6e, 0x20, 0x60, 0x74, 0x72, 0x75, 0x65, 0x60, 0x20, 0x75, 0x6e, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6e, + 0x6f, 0x6e, 0x2d, 0x77, 0x65, 0x62, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, + 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x4c, 0x49, 0x29, 0x20, 0x61, 0x72, + 0x65, 0x20, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x5c, 0x6e, 0x60, 0x57, 0x57, 0x57, 0x2d, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x60, 0x20, 0x63, 0x68, 0x61, + 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x60, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x60, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x60, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x74, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x60, 0x68, 0x74, 0x70, 0x61, 0x73, 0x73, 0x77, 0x64, 0x60, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x48, 0x54, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x60, 0x74, 0x72, 0x75, 0x65, 0x60, + 0x20, 0x75, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x65, 0x62, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x28, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, 0x62, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x29, 0x20, 0x61, 0x72, 0x65, 0x5c, 0x6e, 0x72, 0x65, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x74, 0x6f, 0x20, + 0x6c, 0x6f, 0x67, 0x20, 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x6d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x27, 0x73, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x5c, 0x6e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x65, + 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x60, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x70, 0x6f, 0x70, + 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x5c, 0x6e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x60, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x60, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x60, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x60, 0x20, 0x61, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x5c, 0x6e, + 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x44, 0x41, 0x50, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x48, 0x54, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x44, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, + 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x4d, 0x49, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, + 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6e, 0x66, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, + 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x73, + 0x73, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x49, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x44, 0x4e, 0x53, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x73, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x73, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x6f, 0x61, 0x64, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x20, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x41, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x2e, 0x20, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x20, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x41, 0x4d, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, + 0x20, 0x41, 0x57, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x49, + 0x41, 0x4d, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x52, 0x4e, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x49, 0x41, 0x4d, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x41, 0x52, 0x4e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4b, 0x65, 0x79, + 0x52, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x4b, 0x65, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4b, 0x65, 0x79, 0x52, 0x69, + 0x6e, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4f, 0x43, 0x4d, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x62, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, + 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x5c, + 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x41, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x64, 0x5f, + 0x70, 0x69, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x50, 0x69, 0x64, + 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x20, 0x76, 0x69, 0x61, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x5c, 0x6e, 0x55, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, + 0x69, 0x66, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x50, 0x49, 0x44, 0x73, 0x20, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x43, 0x50, 0x20, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x27, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x68, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x52, 0x4c, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6f, + 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x2e, 0x5c, 0x6e, 0x57, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, + 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x5c, 0x22, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x5c, 0x22, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x41, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, + 0x64, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, + 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x41, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x72, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x41, 0x57, + 0x53, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6c, 0x62, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x67, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x6f, 0x67, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x27, 0x4c, 0x6f, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, + 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, + 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x61, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, + 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x41, 0x57, 0x53, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x41, 0x57, 0x53, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, + 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x5c, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, + 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x2e, 0x5c, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x63, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x29, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, + 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x20, 0x75, + 0x70, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x61, 0x69, 0x6e, + 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x73, 0x65, + 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x74, 0x61, 0x67, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x74, 0x61, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x63, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x27, + 0x74, 0x72, 0x75, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x43, 0x43, 0x53, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x27, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x27, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x75, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x70, 0x75, 0x27, + 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, + 0x6e, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x62, + 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x6f, 0x74, + 0x61, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x68, 0x69, 0x67, 0x68, 0x6d, 0x65, 0x6d, + 0x2d, 0x34, 0x60, 0x2e, 0x5c, 0x6e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x20, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x20, 0x2d, 0x20, + 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x5c, + 0x22, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x5c, 0x22, 0x5c, 0x6e, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x66, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x2e, 0x5c, 0x6e, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x60, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x60, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x5c, 0x22, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x5c, 0x22, 0x20, 0x20, 0x71, 0x75, + 0x6f, 0x74, 0x61, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x69, + 0x65, 0x6e, 0x64, 0x6c, 0x79, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x20, 0x60, 0x72, 0x35, 0x2e, 0x78, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x2d, 0x20, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x60, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x61, 0x74, 0x65, + 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x63, 0x63, 0x65, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, + 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x41, + 0x57, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x62, + 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x6e, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5c, 0x22, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x22, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x5c, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5c, 0x22, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x22, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x38, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x20, 0x6f, 0x6e, 0x20, + 0x61, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x20, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, + 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x60, 0x32, 0x33, 0x60, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x50, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x31, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, + 0x30, 0x2f, 0x31, 0x36, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, + 0x64, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x70, 0x6f, 0x64, + 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x31, 0x30, 0x2e, 0x31, + 0x32, 0x38, 0x2e, 0x30, 0x2e, 0x30, 0x2f, 0x31, 0x34, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x49, 0x50, + 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x31, 0x37, 0x32, 0x2e, 0x33, 0x30, 0x2e, + 0x30, 0x2e, 0x30, 0x2f, 0x31, 0x36, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, 0x6f, 0x75, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x44, 0x20, 0x6e, 0x65, 0x65, + 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x62, + 0x6f, 0x75, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, + 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x57, 0x53, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x70, 0x61, 0x69, + 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, + 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x5c, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, + 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x67, + 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x69, 0x6d, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x77, 0x61, 0x69, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x72, 0x61, 0x69, 0x6e, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, + 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x63, 0x69, 0x62, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x2e, 0x5c, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x20, 0x77, + 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x61, + 0x69, 0x6e, 0x74, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x75, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x61, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, + 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, + 0x6e, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, + 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x75, 0x72, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x52, 0x4f, 0x53, 0x41, 0x20, 0x48, + 0x43, 0x50, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, + 0x65, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, + 0x78, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x52, 0x4f, 0x53, 0x41, 0x20, + 0x48, 0x43, 0x50, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, + 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x64, 0x6f, + 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x72, 0x65, 0x61, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x44, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x69, 0x73, + 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x66, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, + 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, + 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61, + 0x79, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, + 0x75, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4e, 0x65, 0x78, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x72, 0x75, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x49, 0x44, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x69, 0x73, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x73, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, + 0x76, 0x69, 0x61, 0x20, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x66, + 0x72, 0x61, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, + 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, + 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x4e, 0x6f, 0x64, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, + 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x69, + 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x52, + 0x65, 0x64, 0x20, 0x48, 0x61, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x27, 0x73, 0x20, 0x62, 0x79, 0x6f, 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x52, + 0x45, 0x46, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x44, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x66, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, + 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x52, 0x4e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, + 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x2c, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x55, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x4f, 0x69, 0x64, 0x63, + 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x72, 0x20, 0x55, 0x52, 0x4c, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x55, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, + 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x69, 0x64, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, + 0x6f, 0x72, 0x20, 0x55, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20, 0x28, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x29, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x44, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x69, 0x64, + 0x63, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x72, 0x65, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x20, 0x41, 0x52, 0x4e, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x49, 0x44, 0x43, 0x20, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x49, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x55, 0x6e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, + 0x20, 0x4f, 0x69, 0x64, 0x63, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5f, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x44, 0x5f, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, + 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, + 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x44, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x6f, 0x70, 0x65, + 0x6e, 0x69, 0x64, 0x60, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x62, 0x75, 0x6e, + 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x55, 0x52, 0x4c, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x5f, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x44, 0x5f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, + 0x6d, 0x61, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x60, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x60, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x55, 0x52, 0x4c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x44, 0x20, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x73, 0x73, + 0x75, 0x65, 0x72, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x41, 0x4d, 0x52, + 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x63, + 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, + 0x20, 0x41, 0x57, 0x53, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x6c, 0x79, 0x2d, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x49, 0x44, 0x20, 0x74, 0x6f, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x20, 0x6c, 0x69, 0x76, + 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x41, 0x57, 0x53, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x52, 0x45, 0x46, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, + 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x73, + 0x20, 0x49, 0x44, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x27, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x65, 0x73, 0x74, 0x5f, + 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x46, 0x6c, 0x61, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x2d, 0x65, 0x66, + 0x66, 0x6f, 0x72, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, + 0x65, 0x5c, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x52, 0x46, 0x43, 0x33, 0x33, 0x33, 0x39, 0x5d, 0x28, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, + 0x74, 0x78, 0x74, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, + 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x2d, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x69, 0x63, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x77, 0x73, 0x2d, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2d, 0x63, 0x70, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x6f, 0x73, 0x74, + 0x65, 0x64, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, + 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4c, 0x69, 0x6e, 0x6b, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, + 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x52, 0x4e, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x70, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, + 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6e, 0x6b, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, + 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6d, + 0x64, 0x36, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x69, 0x6e, + 0x69, 0x6d, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, + 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, + 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, + 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x73, + 0x61, 0x5f, 0x63, 0x6c, 0x69, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x52, 0x4f, 0x53, 0x41, 0x20, 0x43, + 0x4c, 0x49, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x69, + 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x65, + 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, + 0x20, 0x27, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x50, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x65, 0x6e, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x64, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x64, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, + 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x41, 0x57, 0x53, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x43, 0x50, 0x20, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, + 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x57, 0x53, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x77, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x41, 0x57, 0x53, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x43, 0x50, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x63, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x43, 0x50, 0x20, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x43, 0x6c, + 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x20, 0x77, + 0x61, 0x73, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x5c, + 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x5b, 0x52, 0x46, 0x43, 0x33, 0x33, 0x33, 0x39, 0x5d, 0x28, 0x68, 0x74, 0x74, + 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, 0x74, 0x78, + 0x74, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, + 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x69, + 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x48, 0x69, 0x76, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x68, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, 0x68, 0x69, 0x66, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, + 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x20, 0x77, 0x61, 0x73, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x75, + 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x5b, 0x52, 0x46, 0x43, + 0x33, 0x33, 0x33, 0x39, 0x5d, 0x28, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, + 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x48, 0x79, 0x70, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x5c, 0x6e, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x69, 0x73, 0x20, 0x70, 0x6f, + 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x4f, 0x43, 0x4d, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, + 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x76, 0x69, 0x61, 0x20, + 0x41, 0x50, 0x49, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x20, 0x72, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x20, 0x73, + 0x70, 0x69, 0x6e, 0x73, 0x20, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, 0x72, 0x64, 0x2e, 0x20, 0x50, 0x6f, 0x73, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2f, + 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, + 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x74, + 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x54, 0x54, 0x50, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x48, + 0x54, 0x54, 0x50, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x48, 0x54, 0x54, 0x50, 0x53, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x48, 0x54, 0x54, 0x50, 0x53, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x6f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, + 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x2d, 0x73, 0x65, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x49, 0x44, 0x52, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x5c, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x49, 0x20, 0x6f, 0x66, 0x20, + 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x72, 0x6d, 0x36, 0x34, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x77, 0x68, + 0x69, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x78, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, + 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6d, 0x69, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x6f, 0x6c, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, + 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x6f, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x6f, + 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x6f, 0x6c, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x6f, 0x6f, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x77, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x57, 0x53, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x41, 0x57, 0x53, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, + 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x47, 0x43, 0x50, 0x20, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x43, 0x50, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x73, + 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, + 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x41, 0x57, 0x53, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x49, 0x44, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x69, + 0x74, 0x73, 0x20, 0x60, 0x4e, 0x61, 0x6d, 0x65, 0x60, 0x20, 0x74, 0x61, 0x67, 0x20, 0x6f, 0x6e, + 0x20, 0x41, 0x57, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x64, + 0x5f, 0x68, 0x61, 0x74, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x52, 0x48, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x27, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x27, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, + 0x65, 0x20, 0x6b, 0x75, 0x62, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x55, 0x52, + 0x4c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x68, 0x61, 0x72, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x53, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5c, 0x6e, 0x62, + 0x79, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x4f, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, + 0x65, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x4f, 0x53, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5c, 0x6e, 0x72, 0x6f, 0x6c, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x4f, 0x53, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, + 0x53, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x20, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x74, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x4a, 0x75, 0x6d, 0x70, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x53, 0x54, 0x53, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x70, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x52, 0x4e, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x53, 0x52, 0x45, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, + 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x27, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, + 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x6c, 0x69, 0x63, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x20, 0x64, 0x75, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x50, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x61, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x61, 0x67, 0x73, 0x20, 0x73, + 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x41, 0x57, 0x53, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x69, 0x64, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x43, 0x49, 0x44, 0x52, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, + 0x6f, 0x6e, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x20, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x60, 0x4e, 0x61, 0x6d, 0x65, 0x60, + 0x20, 0x74, 0x61, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x41, 0x57, 0x53, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x68, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x74, + 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x52, 0x48, 0x20, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x20, 0x49, 0x44, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x27, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, + 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, + 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x27, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, + 0x53, 0x79, 0x6e, 0x63, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6b, 0x38, + 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x20, 0x73, 0x65, 0x74, + 0x20, 0x6f, 0x6e, 0x20, 0x61, 0x20, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, + 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x73, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x69, + 0x6e, 0x74, 0x2c, 0x20, 0x69, 0x2e, 0x65, 0x3a, 0x20, 0x4e, 0x6f, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x4e, 0x6f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x2c, 0x20, + 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x4e, 0x6f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x69, + 0x6e, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x20, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x6c, 0x61, 0x69, + 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, + 0x6c, 0x61, 0x69, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, + 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x61, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x55, 0x52, 0x4c, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x52, 0x4c, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x75, 0x64, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x75, + 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x64, 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x5c, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x5c, 0x6e, 0x5c, 0x22, 0x61, 0x75, 0x64, 0x5c, 0x22, + 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x2e, 0x5c, 0x6e, 0x4d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, + 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x49, 0x70, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x74, 0x72, + 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x70, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x65, 0x64, 0x49, 0x70, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x49, 0x70, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x70, + 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x54, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x27, 0x54, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x27, 0x54, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x70, 0x65, 0x63, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x53, 0x70, 0x65, 0x63, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x27, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x6f, 0x72, 0x20, 0x27, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x44, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, + 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x69, + 0x6e, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, + 0x66, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x20, 0x28, 0x66, 0x6f, 0x72, + 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x61, 0x6c, 0x77, + 0x61, 0x79, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x29, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, + 0x65, 0x78, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x63, 0x72, 0x6f, + 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, + 0x74, 0x69, 0x63, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x27, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x27, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x27, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, + 0x64, 0x27, 0x2c, 0x20, 0x27, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x27, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x27, 0x2c, 0x20, 0x5c, 0x6e, 0x27, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x27, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x27, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x20, + 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4f, 0x53, 0x44, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x44, 0x44, 0x4f, 0x4e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x55, 0x73, 0x65, 0x72, + 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x27, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, + 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x41, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x29, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, + 0x20, 0x68, 0x6f, 0x77, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x73, 0x68, + 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x42, + 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x73, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x60, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x60, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x72, 0x20, 0x55, 0x52, 0x4c, 0x20, 0x74, 0x6f, 0x5c, 0x6e, 0x70, 0x72, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x53, 0x65, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x5c, 0x22, 0x4e, 0x6f, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5c, 0x22, 0x20, + 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x69, 0x6e, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x74, 0x2e, 0x5c, 0x6e, 0x5c, 0x6e, 0x55, + 0x6e, 0x69, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x6e, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x79, + 0x27, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x5c, 0x6e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, + 0x64, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x3a, 0x5c, 0x6e, 0x5c, 0x6e, + 0x2d, 0x20, 0x31, 0x20, 0x42, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5c, 0x6e, + 0x2d, 0x20, 0x31, 0x20, 0x4b, 0x42, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x5e, 0x33, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x31, 0x20, 0x4d, 0x42, 0x20, 0x3d, 0x20, 0x31, 0x30, + 0x5e, 0x36, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x31, 0x20, 0x47, 0x42, + 0x20, 0x3d, 0x20, 0x31, 0x30, 0x5e, 0x39, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, + 0x20, 0x31, 0x20, 0x54, 0x42, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x5e, 0x31, 0x32, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x31, 0x20, 0x50, 0x42, 0x20, 0x3d, 0x20, 0x31, 0x30, + 0x5e, 0x31, 0x35, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x5c, 0x6e, 0x2d, 0x20, 0x31, + 0x20, 0x42, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x62, 0x79, 0x74, 0x65, 0x5c, 0x6e, 0x2d, 0x20, 0x31, + 0x20, 0x4b, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x32, 0x5e, 0x31, 0x30, 0x20, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x31, 0x20, 0x4d, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x32, 0x5e, 0x32, + 0x30, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x31, 0x20, 0x47, 0x69, 0x42, + 0x20, 0x3d, 0x20, 0x32, 0x5e, 0x33, 0x30, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, + 0x20, 0x31, 0x20, 0x54, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x32, 0x5e, 0x34, 0x30, 0x20, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5c, 0x6e, 0x2d, 0x20, 0x31, 0x20, 0x50, 0x69, 0x42, 0x20, 0x3d, 0x20, 0x32, + 0x5e, 0x35, 0x30, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, + 0x6e, 0x69, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x75, 0x6e, 0x69, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, + 0x3a, 0x20, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x68, + 0x69, 0x66, 0x74, 0x5f, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x27, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, + 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x47, 0x43, 0x50, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x47, 0x43, 0x50, 0x20, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x73, 0x61, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x4f, 0x53, 0x41, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x52, 0x4f, 0x53, 0x41, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, + 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x62, 0x65, 0x6c, + 0x6f, 0x6e, 0x67, 0x73, 0x2e, 0x5c, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, + 0x73, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x2c, 0x5c, + 0x6e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, + 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x20, 0x73, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, + 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5c, 0x6e, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x79, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, + 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x4c, 0x69, 0x66, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x45, 0x6e, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x4c, 0x69, 0x66, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x5c, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, + 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, 0x72, 0x66, 0x63, + 0x33, 0x33, 0x33, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x5b, 0x52, 0x43, 0x33, 0x33, 0x33, 0x39, 0x5d, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, 0x69, + 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x6f, 0x73, 0x74, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x61, 0x5c, 0x6e, 0x48, 0x43, 0x50, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x73, + 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x48, 0x43, 0x50, 0x20, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x70, 0x65, + 0x72, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x61, 0x77, + 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, + 0x52, 0x49, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x6d, 0x64, 0x36, 0x34, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x49, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x6d, 0x36, 0x34, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, + 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x73, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x5f, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x68, 0x69, + 0x66, 0x74, 0x5f, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, + 0x61, 0x74, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, + 0x54, 0x53, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x54, 0x53, + 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x2c, 0x5c, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x72, 0x66, 0x63, 0x2f, + 0x72, 0x66, 0x63, 0x33, 0x33, 0x33, 0x39, 0x2e, 0x74, 0x78, 0x74, 0x5b, 0x52, 0x43, 0x33, 0x33, + 0x33, 0x39, 0x5d, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x52, 0x4c, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x52, 0x4c, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x68, 0x69, 0x66, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x72, 0x65, + 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x64, 0x5f, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, + 0x77, 0x49, 0x44, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x74, + 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x61, 0x74, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x41, 0x67, 0x72, 0x65, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x41, 0x67, 0x72, 0x65, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x61, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, 0x67, 0x72, + 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x27, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, + 0x41, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x47, 0x61, 0x74, 0x65, 0x41, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x61, 0x74, 0x65, 0x2d, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x74, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x61, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, + 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x47, 0x61, + 0x74, 0x65, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x66, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x6e, 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, + 0x66, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x66, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x61, 0x6e, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, + 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x57, + 0x69, 0x66, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x27, 0x57, 0x69, 0x66, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, + 0x69, 0x73, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, + 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x4f, + 0x43, 0x4d, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x67, 0x63, 0x70, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x47, 0x43, + 0x50, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x47, + 0x63, 0x70, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x43, 0x4d, + 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, + 0x6e, 0x67, 0x73, 0x20, 0x74, 0x6f, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x6e, 0x6b, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x66, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x2f, 0x57, 0x69, 0x66, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x66, 0x47, 0x63, 0x70, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x4f, 0x43, 0x4d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x53, 0x41, 0x73, + 0x2e, 0x20, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x43, 0x50, 0x20, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x49, 0x44, 0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x66, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x64, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x5c, 0x6e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x27, 0x73, 0x20, 0x47, 0x43, 0x50, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, + 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x27, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x50, 0x6f, 0x6f, 0x6c, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, + 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6a, 0x77, 0x6b, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x57, 0x69, 0x66, 0x50, 0x6f, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, + 0x22, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x5c, 0x6e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, + 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, + 0x69, 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x49, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x57, 0x69, 0x66, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e, + 0x65, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6c, + 0x65, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x66, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, + 0x69, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, + 0x66, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x73, 0x64, 0x5f, + 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, 0x66, 0x52, 0x6f, 0x6c, 0x65, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x57, 0x69, 0x66, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x77, 0x69, 0x66, 0x5f, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x27, 0x57, 0x69, 0x66, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x27, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x6f, 0x72, 0x20, 0x27, 0x57, 0x69, 0x66, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6e, 0x6b, 0x27, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6a, + 0x75, 0x73, 0x74, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, + 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5c, 0x6e, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x27, 0x73, 0x20, 0x47, + 0x43, 0x50, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3a, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x3a, 0x20, + 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x22, 0x23, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x2f, 0x57, 0x69, + 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, + 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x6e, + 0x75, 0x6d, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x73, 0x44, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x62, 0x65, 0x20, 0x27, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x27, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, + 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x22, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x72, 0x65, 0x66, 0x22, 0x3a, 0x20, 0x7b, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x53, 0x65, 0x6c, 0x66, + 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x64, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, + 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x60, 0x39, 0x33, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x73, 0x20, 0x60, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6d, 0x67, 0x6d, 0x74, 0x60, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x60, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x53, 0x2d, 0x4d, 0x47, 0x4d, + 0x54, 0x2d, 0x39, 0x33, 0x60, 0x2e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x48, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x7b, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x45, 0x78, 0x74, + 0x72, 0x61, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x22, + 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2c, 0xa, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x65, + 0x61, 0x72, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x22, 0x2c, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, + 0x22, 0x3a, 0x20, 0x22, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x4a, 0x57, 0x54, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, + 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x5d, + 0xa, 0x7d, +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_builder.go b/clustersmgmt/v2alpha1/operator_iam_role_builder.go new file mode 100644 index 00000000..4c905300 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_builder.go @@ -0,0 +1,103 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OperatorIAMRoleBuilder contains the data and logic needed to build 'operator_IAM_role' objects. +// +// Contains the necessary attributes to allow each operator to access the necessary AWS resources +type OperatorIAMRoleBuilder struct { + bitmap_ uint32 + id string + name string + namespace string + roleARN string + serviceAccount string +} + +// NewOperatorIAMRole creates a new builder of 'operator_IAM_role' objects. +func NewOperatorIAMRole() *OperatorIAMRoleBuilder { + return &OperatorIAMRoleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *OperatorIAMRoleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *OperatorIAMRoleBuilder) ID(value string) *OperatorIAMRoleBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *OperatorIAMRoleBuilder) Name(value string) *OperatorIAMRoleBuilder { + b.name = value + b.bitmap_ |= 2 + return b +} + +// Namespace sets the value of the 'namespace' attribute to the given value. +func (b *OperatorIAMRoleBuilder) Namespace(value string) *OperatorIAMRoleBuilder { + b.namespace = value + b.bitmap_ |= 4 + return b +} + +// RoleARN sets the value of the 'role_ARN' attribute to the given value. +func (b *OperatorIAMRoleBuilder) RoleARN(value string) *OperatorIAMRoleBuilder { + b.roleARN = value + b.bitmap_ |= 8 + return b +} + +// ServiceAccount sets the value of the 'service_account' attribute to the given value. +func (b *OperatorIAMRoleBuilder) ServiceAccount(value string) *OperatorIAMRoleBuilder { + b.serviceAccount = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *OperatorIAMRoleBuilder) Copy(object *OperatorIAMRole) *OperatorIAMRoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.name = object.name + b.namespace = object.namespace + b.roleARN = object.roleARN + b.serviceAccount = object.serviceAccount + return b +} + +// Build creates a 'operator_IAM_role' object using the configuration stored in the builder. +func (b *OperatorIAMRoleBuilder) Build() (object *OperatorIAMRole, err error) { + object = new(OperatorIAMRole) + object.bitmap_ = b.bitmap_ + object.id = b.id + object.name = b.name + object.namespace = b.namespace + object.roleARN = b.roleARN + object.serviceAccount = b.serviceAccount + return +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_client.go b/clustersmgmt/v2alpha1/operator_iam_role_client.go new file mode 100644 index 00000000..6bd086b5 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_client.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// OperatorIAMRoleClient is the client of the 'operator_IAM_role' resource. +// +// Manages a list of operator roles for STS clusters. +type OperatorIAMRoleClient struct { + transport http.RoundTripper + path string +} + +// NewOperatorIAMRoleClient creates a new client for the 'operator_IAM_role' +// resource using the given transport to send the requests and receive the +// responses. +func NewOperatorIAMRoleClient(transport http.RoundTripper, path string) *OperatorIAMRoleClient { + return &OperatorIAMRoleClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the operator role. +func (c *OperatorIAMRoleClient) Delete() *OperatorIAMRoleDeleteRequest { + return &OperatorIAMRoleDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// OperatorIAMRoleDeleteRequest is the request for the 'delete' method. +type OperatorIAMRoleDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *OperatorIAMRoleDeleteRequest) Parameter(name string, value interface{}) *OperatorIAMRoleDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OperatorIAMRoleDeleteRequest) Header(name string, value interface{}) *OperatorIAMRoleDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OperatorIAMRoleDeleteRequest) Impersonate(user string) *OperatorIAMRoleDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OperatorIAMRoleDeleteRequest) Send() (result *OperatorIAMRoleDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OperatorIAMRoleDeleteRequest) SendContext(ctx context.Context) (result *OperatorIAMRoleDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OperatorIAMRoleDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// OperatorIAMRoleDeleteResponse is the response for the 'delete' method. +type OperatorIAMRoleDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *OperatorIAMRoleDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OperatorIAMRoleDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OperatorIAMRoleDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_list_builder.go b/clustersmgmt/v2alpha1/operator_iam_role_list_builder.go new file mode 100644 index 00000000..4c15a437 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OperatorIAMRoleListBuilder contains the data and logic needed to build +// 'operator_IAM_role' objects. +type OperatorIAMRoleListBuilder struct { + items []*OperatorIAMRoleBuilder +} + +// NewOperatorIAMRoleList creates a new builder of 'operator_IAM_role' objects. +func NewOperatorIAMRoleList() *OperatorIAMRoleListBuilder { + return new(OperatorIAMRoleListBuilder) +} + +// Items sets the items of the list. +func (b *OperatorIAMRoleListBuilder) Items(values ...*OperatorIAMRoleBuilder) *OperatorIAMRoleListBuilder { + b.items = make([]*OperatorIAMRoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *OperatorIAMRoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *OperatorIAMRoleListBuilder) Copy(list *OperatorIAMRoleList) *OperatorIAMRoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*OperatorIAMRoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewOperatorIAMRole().Copy(v) + } + } + return b +} + +// Build creates a list of 'operator_IAM_role' objects using the +// configuration stored in the builder. +func (b *OperatorIAMRoleListBuilder) Build() (list *OperatorIAMRoleList, err error) { + items := make([]*OperatorIAMRole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(OperatorIAMRoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_list_type_json.go b/clustersmgmt/v2alpha1/operator_iam_role_list_type_json.go new file mode 100644 index 00000000..afc3863c --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOperatorIAMRoleList writes a list of values of the 'operator_IAM_role' type to +// the given writer. +func MarshalOperatorIAMRoleList(list []*OperatorIAMRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOperatorIAMRoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOperatorIAMRoleList writes a list of value of the 'operator_IAM_role' type to +// the given stream. +func writeOperatorIAMRoleList(list []*OperatorIAMRole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeOperatorIAMRole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalOperatorIAMRoleList reads a list of values of the 'operator_IAM_role' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalOperatorIAMRoleList(source interface{}) (items []*OperatorIAMRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readOperatorIAMRoleList(iterator) + err = iterator.Error + return +} + +// readOperatorIAMRoleList reads list of values of the ”operator_IAM_role' type from +// the given iterator. +func readOperatorIAMRoleList(iterator *jsoniter.Iterator) []*OperatorIAMRole { + list := []*OperatorIAMRole{} + for iterator.ReadArray() { + item := readOperatorIAMRole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_resource_json.go b/clustersmgmt/v2alpha1/operator_iam_role_resource_json.go new file mode 100644 index 00000000..9be6f985 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_resource_json.go @@ -0,0 +1,29 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeOperatorIAMRoleDeleteRequest(request *OperatorIAMRoleDeleteRequest, writer io.Writer) error { + return nil +} +func readOperatorIAMRoleDeleteResponse(response *OperatorIAMRoleDeleteResponse, reader io.Reader) error { + return nil +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_type.go b/clustersmgmt/v2alpha1/operator_iam_role_type.go new file mode 100644 index 00000000..f8c94cbf --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_type.go @@ -0,0 +1,238 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OperatorIAMRole represents the values of the 'operator_IAM_role' type. +// +// Contains the necessary attributes to allow each operator to access the necessary AWS resources +type OperatorIAMRole struct { + bitmap_ uint32 + id string + name string + namespace string + roleARN string + serviceAccount string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *OperatorIAMRole) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Randomly-generated ID to identify the operator role +func (o *OperatorIAMRole) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// Randomly-generated ID to identify the operator role +func (o *OperatorIAMRole) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the credentials secret used to access cloud resources +func (o *OperatorIAMRole) Name() string { + if o != nil && o.bitmap_&2 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the credentials secret used to access cloud resources +func (o *OperatorIAMRole) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.name + } + return +} + +// Namespace returns the value of the 'namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Namespace where the credentials secret lives in the cluster +func (o *OperatorIAMRole) Namespace() string { + if o != nil && o.bitmap_&4 != 0 { + return o.namespace + } + return "" +} + +// GetNamespace returns the value of the 'namespace' attribute and +// a flag indicating if the attribute has a value. +// +// Namespace where the credentials secret lives in the cluster +func (o *OperatorIAMRole) GetNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.namespace + } + return +} + +// RoleARN returns the value of the 'role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Role to assume when accessing AWS resources +func (o *OperatorIAMRole) RoleARN() string { + if o != nil && o.bitmap_&8 != 0 { + return o.roleARN + } + return "" +} + +// GetRoleARN returns the value of the 'role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// Role to assume when accessing AWS resources +func (o *OperatorIAMRole) GetRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.roleARN + } + return +} + +// ServiceAccount returns the value of the 'service_account' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Service account name to use when authenticating +func (o *OperatorIAMRole) ServiceAccount() string { + if o != nil && o.bitmap_&16 != 0 { + return o.serviceAccount + } + return "" +} + +// GetServiceAccount returns the value of the 'service_account' attribute and +// a flag indicating if the attribute has a value. +// +// Service account name to use when authenticating +func (o *OperatorIAMRole) GetServiceAccount() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.serviceAccount + } + return +} + +// OperatorIAMRoleListKind is the name of the type used to represent list of objects of +// type 'operator_IAM_role'. +const OperatorIAMRoleListKind = "OperatorIAMRoleList" + +// OperatorIAMRoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'operator_IAM_role'. +const OperatorIAMRoleListLinkKind = "OperatorIAMRoleListLink" + +// OperatorIAMRoleNilKind is the name of the type used to nil lists of objects of +// type 'operator_IAM_role'. +const OperatorIAMRoleListNilKind = "OperatorIAMRoleListNil" + +// OperatorIAMRoleList is a list of values of the 'operator_IAM_role' type. +type OperatorIAMRoleList struct { + href string + link bool + items []*OperatorIAMRole +} + +// Len returns the length of the list. +func (l *OperatorIAMRoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *OperatorIAMRoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *OperatorIAMRoleList) Get(i int) *OperatorIAMRole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *OperatorIAMRoleList) Slice() []*OperatorIAMRole { + var slice []*OperatorIAMRole + if l == nil { + slice = make([]*OperatorIAMRole, 0) + } else { + slice = make([]*OperatorIAMRole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *OperatorIAMRoleList) Each(f func(item *OperatorIAMRole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *OperatorIAMRoleList) Range(f func(index int, item *OperatorIAMRole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/operator_iam_role_type_json.go b/clustersmgmt/v2alpha1/operator_iam_role_type_json.go new file mode 100644 index 00000000..763b4333 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_role_type_json.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOperatorIAMRole writes a value of the 'operator_IAM_role' type to the given writer. +func MarshalOperatorIAMRole(object *OperatorIAMRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOperatorIAMRole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOperatorIAMRole writes a value of the 'operator_IAM_role' type to the given stream. +func writeOperatorIAMRole(object *OperatorIAMRole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("namespace") + stream.WriteString(object.namespace) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("role_arn") + stream.WriteString(object.roleARN) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_account") + stream.WriteString(object.serviceAccount) + } + stream.WriteObjectEnd() +} + +// UnmarshalOperatorIAMRole reads a value of the 'operator_IAM_role' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalOperatorIAMRole(source interface{}) (object *OperatorIAMRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readOperatorIAMRole(iterator) + err = iterator.Error + return +} + +// readOperatorIAMRole reads a value of the 'operator_IAM_role' type from the given iterator. +func readOperatorIAMRole(iterator *jsoniter.Iterator) *OperatorIAMRole { + object := &OperatorIAMRole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 2 + case "namespace": + value := iterator.ReadString() + object.namespace = value + object.bitmap_ |= 4 + case "role_arn": + value := iterator.ReadString() + object.roleARN = value + object.bitmap_ |= 8 + case "service_account": + value := iterator.ReadString() + object.serviceAccount = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/operator_iam_roles_client.go b/clustersmgmt/v2alpha1/operator_iam_roles_client.go new file mode 100644 index 00000000..2c2bb5a5 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_roles_client.go @@ -0,0 +1,459 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// OperatorIAMRolesClient is the client of the 'operator_IAM_roles' resource. +// +// Manages the collection of operator roles. +type OperatorIAMRolesClient struct { + transport http.RoundTripper + path string +} + +// NewOperatorIAMRolesClient creates a new client for the 'operator_IAM_roles' +// resource using the given transport to send the requests and receive the +// responses. +func NewOperatorIAMRolesClient(transport http.RoundTripper, path string) *OperatorIAMRolesClient { + return &OperatorIAMRolesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new operator role to the cluster. +func (c *OperatorIAMRolesClient) Add() *OperatorIAMRolesAddRequest { + return &OperatorIAMRolesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of operator roles. +func (c *OperatorIAMRolesClient) List() *OperatorIAMRolesListRequest { + return &OperatorIAMRolesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// OperatorIAMRole returns the target 'operator_IAM_role' resource for the given identifier. +// +// Returns a reference to the service that manages a specific operator role. +func (c *OperatorIAMRolesClient) OperatorIAMRole(id string) *OperatorIAMRoleClient { + return NewOperatorIAMRoleClient( + c.transport, + path.Join(c.path, id), + ) +} + +// OperatorIAMRolesAddRequest is the request for the 'add' method. +type OperatorIAMRolesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *OperatorIAMRole +} + +// Parameter adds a query parameter. +func (r *OperatorIAMRolesAddRequest) Parameter(name string, value interface{}) *OperatorIAMRolesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OperatorIAMRolesAddRequest) Header(name string, value interface{}) *OperatorIAMRolesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OperatorIAMRolesAddRequest) Impersonate(user string) *OperatorIAMRolesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the operator role. +func (r *OperatorIAMRolesAddRequest) Body(value *OperatorIAMRole) *OperatorIAMRolesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OperatorIAMRolesAddRequest) Send() (result *OperatorIAMRolesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OperatorIAMRolesAddRequest) SendContext(ctx context.Context) (result *OperatorIAMRolesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeOperatorIAMRolesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OperatorIAMRolesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readOperatorIAMRolesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// OperatorIAMRolesAddResponse is the response for the 'add' method. +type OperatorIAMRolesAddResponse struct { + status int + header http.Header + err *errors.Error + body *OperatorIAMRole +} + +// Status returns the response status code. +func (r *OperatorIAMRolesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OperatorIAMRolesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OperatorIAMRolesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the operator role. +func (r *OperatorIAMRolesAddResponse) Body() *OperatorIAMRole { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the operator role. +func (r *OperatorIAMRolesAddResponse) GetBody() (value *OperatorIAMRole, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// OperatorIAMRolesListRequest is the request for the 'list' method. +type OperatorIAMRolesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *OperatorIAMRolesListRequest) Parameter(name string, value interface{}) *OperatorIAMRolesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *OperatorIAMRolesListRequest) Header(name string, value interface{}) *OperatorIAMRolesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *OperatorIAMRolesListRequest) Impersonate(user string) *OperatorIAMRolesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *OperatorIAMRolesListRequest) Page(value int) *OperatorIAMRolesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. +func (r *OperatorIAMRolesListRequest) Size(value int) *OperatorIAMRolesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *OperatorIAMRolesListRequest) Send() (result *OperatorIAMRolesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *OperatorIAMRolesListRequest) SendContext(ctx context.Context) (result *OperatorIAMRolesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &OperatorIAMRolesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readOperatorIAMRolesListResponse(result, reader) + if err != nil { + return + } + return +} + +// OperatorIAMRolesListResponse is the response for the 'list' method. +type OperatorIAMRolesListResponse struct { + status int + header http.Header + err *errors.Error + items *OperatorIAMRoleList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *OperatorIAMRolesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *OperatorIAMRolesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *OperatorIAMRolesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of operator roles. +func (r *OperatorIAMRolesListResponse) Items() *OperatorIAMRoleList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of operator roles. +func (r *OperatorIAMRolesListResponse) GetItems() (value *OperatorIAMRoleList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *OperatorIAMRolesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *OperatorIAMRolesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. +func (r *OperatorIAMRolesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. +func (r *OperatorIAMRolesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *OperatorIAMRolesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *OperatorIAMRolesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/operator_iam_roles_resource_json.go b/clustersmgmt/v2alpha1/operator_iam_roles_resource_json.go new file mode 100644 index 00000000..c36ecc84 --- /dev/null +++ b/clustersmgmt/v2alpha1/operator_iam_roles_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeOperatorIAMRolesAddRequest(request *OperatorIAMRolesAddRequest, writer io.Writer) error { + return MarshalOperatorIAMRole(request.body, writer) +} +func readOperatorIAMRolesAddResponse(response *OperatorIAMRolesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalOperatorIAMRole(reader) + return err +} +func writeOperatorIAMRolesListRequest(request *OperatorIAMRolesListRequest, writer io.Writer) error { + return nil +} +func readOperatorIAMRolesListResponse(response *OperatorIAMRolesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readOperatorIAMRoleList(iterator) + response.items = &OperatorIAMRoleList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/organization_link_builder.go b/clustersmgmt/v2alpha1/organization_link_builder.go new file mode 100644 index 00000000..3901cc2e --- /dev/null +++ b/clustersmgmt/v2alpha1/organization_link_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OrganizationLinkBuilder contains the data and logic needed to build 'organization_link' objects. +// +// Definition of an organization link. +type OrganizationLinkBuilder struct { + bitmap_ uint32 + href string + id string +} + +// NewOrganizationLink creates a new builder of 'organization_link' objects. +func NewOrganizationLink() *OrganizationLinkBuilder { + return &OrganizationLinkBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *OrganizationLinkBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// HREF sets the value of the 'HREF' attribute to the given value. +func (b *OrganizationLinkBuilder) HREF(value string) *OrganizationLinkBuilder { + b.href = value + b.bitmap_ |= 1 + return b +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *OrganizationLinkBuilder) ID(value string) *OrganizationLinkBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *OrganizationLinkBuilder) Copy(object *OrganizationLink) *OrganizationLinkBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.href = object.href + b.id = object.id + return b +} + +// Build creates a 'organization_link' object using the configuration stored in the builder. +func (b *OrganizationLinkBuilder) Build() (object *OrganizationLink, err error) { + object = new(OrganizationLink) + object.bitmap_ = b.bitmap_ + object.href = b.href + object.id = b.id + return +} diff --git a/clustersmgmt/v2alpha1/organization_link_list_builder.go b/clustersmgmt/v2alpha1/organization_link_list_builder.go new file mode 100644 index 00000000..7ddfc637 --- /dev/null +++ b/clustersmgmt/v2alpha1/organization_link_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OrganizationLinkListBuilder contains the data and logic needed to build +// 'organization_link' objects. +type OrganizationLinkListBuilder struct { + items []*OrganizationLinkBuilder +} + +// NewOrganizationLinkList creates a new builder of 'organization_link' objects. +func NewOrganizationLinkList() *OrganizationLinkListBuilder { + return new(OrganizationLinkListBuilder) +} + +// Items sets the items of the list. +func (b *OrganizationLinkListBuilder) Items(values ...*OrganizationLinkBuilder) *OrganizationLinkListBuilder { + b.items = make([]*OrganizationLinkBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *OrganizationLinkListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *OrganizationLinkListBuilder) Copy(list *OrganizationLinkList) *OrganizationLinkListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*OrganizationLinkBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewOrganizationLink().Copy(v) + } + } + return b +} + +// Build creates a list of 'organization_link' objects using the +// configuration stored in the builder. +func (b *OrganizationLinkListBuilder) Build() (list *OrganizationLinkList, err error) { + items := make([]*OrganizationLink, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(OrganizationLinkList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/organization_link_list_type_json.go b/clustersmgmt/v2alpha1/organization_link_list_type_json.go new file mode 100644 index 00000000..4d4d548e --- /dev/null +++ b/clustersmgmt/v2alpha1/organization_link_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOrganizationLinkList writes a list of values of the 'organization_link' type to +// the given writer. +func MarshalOrganizationLinkList(list []*OrganizationLink, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOrganizationLinkList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOrganizationLinkList writes a list of value of the 'organization_link' type to +// the given stream. +func writeOrganizationLinkList(list []*OrganizationLink, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeOrganizationLink(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalOrganizationLinkList reads a list of values of the 'organization_link' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalOrganizationLinkList(source interface{}) (items []*OrganizationLink, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readOrganizationLinkList(iterator) + err = iterator.Error + return +} + +// readOrganizationLinkList reads list of values of the ”organization_link' type from +// the given iterator. +func readOrganizationLinkList(iterator *jsoniter.Iterator) []*OrganizationLink { + list := []*OrganizationLink{} + for iterator.ReadArray() { + item := readOrganizationLink(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/organization_link_type.go b/clustersmgmt/v2alpha1/organization_link_type.go new file mode 100644 index 00000000..01716588 --- /dev/null +++ b/clustersmgmt/v2alpha1/organization_link_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// OrganizationLink represents the values of the 'organization_link' type. +// +// Definition of an organization link. +type OrganizationLink struct { + bitmap_ uint32 + href string + id string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *OrganizationLink) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// HREF returns the value of the 'HREF' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HREF for the Organization, filled in response. +func (o *OrganizationLink) HREF() string { + if o != nil && o.bitmap_&1 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the value of the 'HREF' attribute and +// a flag indicating if the attribute has a value. +// +// HREF for the Organization, filled in response. +func (o *OrganizationLink) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.href + } + return +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The organization's ID. +func (o *OrganizationLink) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// The organization's ID. +func (o *OrganizationLink) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// OrganizationLinkListKind is the name of the type used to represent list of objects of +// type 'organization_link'. +const OrganizationLinkListKind = "OrganizationLinkList" + +// OrganizationLinkListLinkKind is the name of the type used to represent links to list +// of objects of type 'organization_link'. +const OrganizationLinkListLinkKind = "OrganizationLinkListLink" + +// OrganizationLinkNilKind is the name of the type used to nil lists of objects of +// type 'organization_link'. +const OrganizationLinkListNilKind = "OrganizationLinkListNil" + +// OrganizationLinkList is a list of values of the 'organization_link' type. +type OrganizationLinkList struct { + href string + link bool + items []*OrganizationLink +} + +// Len returns the length of the list. +func (l *OrganizationLinkList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *OrganizationLinkList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *OrganizationLinkList) Get(i int) *OrganizationLink { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *OrganizationLinkList) Slice() []*OrganizationLink { + var slice []*OrganizationLink + if l == nil { + slice = make([]*OrganizationLink, 0) + } else { + slice = make([]*OrganizationLink, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *OrganizationLinkList) Each(f func(item *OrganizationLink) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *OrganizationLinkList) Range(f func(index int, item *OrganizationLink) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/organization_link_type_json.go b/clustersmgmt/v2alpha1/organization_link_type_json.go new file mode 100644 index 00000000..b2c19ac1 --- /dev/null +++ b/clustersmgmt/v2alpha1/organization_link_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalOrganizationLink writes a value of the 'organization_link' type to the given writer. +func MarshalOrganizationLink(object *OrganizationLink, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeOrganizationLink(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeOrganizationLink writes a value of the 'organization_link' type to the given stream. +func writeOrganizationLink(object *OrganizationLink, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + } + stream.WriteObjectEnd() +} + +// UnmarshalOrganizationLink reads a value of the 'organization_link' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalOrganizationLink(source interface{}) (object *OrganizationLink, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readOrganizationLink(iterator) + err = iterator.Error + return +} + +// readOrganizationLink reads a value of the 'organization_link' type from the given iterator. +func readOrganizationLink(iterator *jsoniter.Iterator) *OrganizationLink { + object := &OrganizationLink{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "href": + value := iterator.ReadString() + object.href = value + object.bitmap_ |= 1 + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_builder.go b/clustersmgmt/v2alpha1/pending_delete_cluster_builder.go new file mode 100644 index 00000000..e58443db --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_builder.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// PendingDeleteClusterBuilder contains the data and logic needed to build 'pending_delete_cluster' objects. +// +// Represents a pending delete entry for a specific cluster. +type PendingDeleteClusterBuilder struct { + bitmap_ uint32 + id string + href string + cluster *ClusterBuilder + creationTimestamp time.Time + bestEffort bool +} + +// NewPendingDeleteCluster creates a new builder of 'pending_delete_cluster' objects. +func NewPendingDeleteCluster() *PendingDeleteClusterBuilder { + return &PendingDeleteClusterBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *PendingDeleteClusterBuilder) Link(value bool) *PendingDeleteClusterBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *PendingDeleteClusterBuilder) ID(value string) *PendingDeleteClusterBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *PendingDeleteClusterBuilder) HREF(value string) *PendingDeleteClusterBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *PendingDeleteClusterBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// BestEffort sets the value of the 'best_effort' attribute to the given value. +func (b *PendingDeleteClusterBuilder) BestEffort(value bool) *PendingDeleteClusterBuilder { + b.bestEffort = value + b.bitmap_ |= 8 + return b +} + +// Cluster sets the value of the 'cluster' attribute to the given value. +// +// Definition of an _OpenShift_ cluster. +// +// The `cloud_provider` attribute is a reference to the cloud provider. When a +// cluster is retrieved it will be a link to the cloud provider, containing only +// the kind, id and href attributes: +// +// ```json +// +// { +// "cloud_provider": { +// "kind": "CloudProviderLink", +// "id": "123", +// "href": "/api/clusters_mgmt/v1/cloud_providers/123" +// } +// } +// +// ``` +// +// When a cluster is created this is optional, and if used it should contain the +// identifier of the cloud provider to use: +// +// ```json +// +// { +// "cloud_provider": { +// "id": "123", +// } +// } +// +// ``` +// +// If not included, then the cluster will be created using the default cloud +// provider, which is currently Amazon Web Services. +// +// The region attribute is mandatory when a cluster is created. +// +// The `aws.access_key_id`, `aws.secret_access_key` and `dns.base_domain` +// attributes are mandatory when creation a cluster with your own Amazon Web +// Services account. +func (b *PendingDeleteClusterBuilder) Cluster(value *ClusterBuilder) *PendingDeleteClusterBuilder { + b.cluster = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *PendingDeleteClusterBuilder) CreationTimestamp(value time.Time) *PendingDeleteClusterBuilder { + b.creationTimestamp = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *PendingDeleteClusterBuilder) Copy(object *PendingDeleteCluster) *PendingDeleteClusterBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.bestEffort = object.bestEffort + if object.cluster != nil { + b.cluster = NewCluster().Copy(object.cluster) + } else { + b.cluster = nil + } + b.creationTimestamp = object.creationTimestamp + return b +} + +// Build creates a 'pending_delete_cluster' object using the configuration stored in the builder. +func (b *PendingDeleteClusterBuilder) Build() (object *PendingDeleteCluster, err error) { + object = new(PendingDeleteCluster) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.bestEffort = b.bestEffort + if b.cluster != nil { + object.cluster, err = b.cluster.Build() + if err != nil { + return + } + } + object.creationTimestamp = b.creationTimestamp + return +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_client.go b/clustersmgmt/v2alpha1/pending_delete_cluster_client.go new file mode 100644 index 00000000..70c18a85 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_client.go @@ -0,0 +1,461 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// PendingDeleteClusterClient is the client of the 'pending_delete_cluster' resource. +// +// Manages a specific pending delete cluster. +type PendingDeleteClusterClient struct { + transport http.RoundTripper + path string +} + +// NewPendingDeleteClusterClient creates a new client for the 'pending_delete_cluster' +// resource using the given transport to send the requests and receive the +// responses. +func NewPendingDeleteClusterClient(transport http.RoundTripper, path string) *PendingDeleteClusterClient { + return &PendingDeleteClusterClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the pending delete cluster. +func (c *PendingDeleteClusterClient) Get() *PendingDeleteClusterGetRequest { + return &PendingDeleteClusterGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the pending delete cluster entry. +func (c *PendingDeleteClusterClient) Update() *PendingDeleteClusterUpdateRequest { + return &PendingDeleteClusterUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// PendingDeleteClusterPollRequest is the request for the Poll method. +type PendingDeleteClusterPollRequest struct { + request *PendingDeleteClusterGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *PendingDeleteClusterPollRequest) Parameter(name string, value interface{}) *PendingDeleteClusterPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *PendingDeleteClusterPollRequest) Header(name string, value interface{}) *PendingDeleteClusterPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *PendingDeleteClusterPollRequest) Interval(value time.Duration) *PendingDeleteClusterPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *PendingDeleteClusterPollRequest) Status(value int) *PendingDeleteClusterPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *PendingDeleteClusterPollRequest) Predicate(value func(*PendingDeleteClusterGetResponse) bool) *PendingDeleteClusterPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*PendingDeleteClusterGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *PendingDeleteClusterPollRequest) StartContext(ctx context.Context) (response *PendingDeleteClusterPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &PendingDeleteClusterPollResponse{ + response: result.(*PendingDeleteClusterGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *PendingDeleteClusterPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// PendingDeleteClusterPollResponse is the response for the Poll method. +type PendingDeleteClusterPollResponse struct { + response *PendingDeleteClusterGetResponse +} + +// Status returns the response status code. +func (r *PendingDeleteClusterPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *PendingDeleteClusterPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *PendingDeleteClusterPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *PendingDeleteClusterPollResponse) Body() *PendingDeleteCluster { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PendingDeleteClusterPollResponse) GetBody() (value *PendingDeleteCluster, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *PendingDeleteClusterClient) Poll() *PendingDeleteClusterPollRequest { + return &PendingDeleteClusterPollRequest{ + request: c.Get(), + } +} + +// PendingDeleteClusterGetRequest is the request for the 'get' method. +type PendingDeleteClusterGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *PendingDeleteClusterGetRequest) Parameter(name string, value interface{}) *PendingDeleteClusterGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PendingDeleteClusterGetRequest) Header(name string, value interface{}) *PendingDeleteClusterGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PendingDeleteClusterGetRequest) Impersonate(user string) *PendingDeleteClusterGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PendingDeleteClusterGetRequest) Send() (result *PendingDeleteClusterGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PendingDeleteClusterGetRequest) SendContext(ctx context.Context) (result *PendingDeleteClusterGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PendingDeleteClusterGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPendingDeleteClusterGetResponse(result, reader) + if err != nil { + return + } + return +} + +// PendingDeleteClusterGetResponse is the response for the 'get' method. +type PendingDeleteClusterGetResponse struct { + status int + header http.Header + err *errors.Error + body *PendingDeleteCluster +} + +// Status returns the response status code. +func (r *PendingDeleteClusterGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PendingDeleteClusterGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PendingDeleteClusterGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *PendingDeleteClusterGetResponse) Body() *PendingDeleteCluster { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PendingDeleteClusterGetResponse) GetBody() (value *PendingDeleteCluster, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// PendingDeleteClusterUpdateRequest is the request for the 'update' method. +type PendingDeleteClusterUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *PendingDeleteCluster +} + +// Parameter adds a query parameter. +func (r *PendingDeleteClusterUpdateRequest) Parameter(name string, value interface{}) *PendingDeleteClusterUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PendingDeleteClusterUpdateRequest) Header(name string, value interface{}) *PendingDeleteClusterUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PendingDeleteClusterUpdateRequest) Impersonate(user string) *PendingDeleteClusterUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *PendingDeleteClusterUpdateRequest) Body(value *PendingDeleteCluster) *PendingDeleteClusterUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PendingDeleteClusterUpdateRequest) Send() (result *PendingDeleteClusterUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PendingDeleteClusterUpdateRequest) SendContext(ctx context.Context) (result *PendingDeleteClusterUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writePendingDeleteClusterUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PendingDeleteClusterUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPendingDeleteClusterUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// PendingDeleteClusterUpdateResponse is the response for the 'update' method. +type PendingDeleteClusterUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *PendingDeleteCluster +} + +// Status returns the response status code. +func (r *PendingDeleteClusterUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PendingDeleteClusterUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PendingDeleteClusterUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *PendingDeleteClusterUpdateResponse) Body() *PendingDeleteCluster { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PendingDeleteClusterUpdateResponse) GetBody() (value *PendingDeleteCluster, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_list_builder.go b/clustersmgmt/v2alpha1/pending_delete_cluster_list_builder.go new file mode 100644 index 00000000..d5146454 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PendingDeleteClusterListBuilder contains the data and logic needed to build +// 'pending_delete_cluster' objects. +type PendingDeleteClusterListBuilder struct { + items []*PendingDeleteClusterBuilder +} + +// NewPendingDeleteClusterList creates a new builder of 'pending_delete_cluster' objects. +func NewPendingDeleteClusterList() *PendingDeleteClusterListBuilder { + return new(PendingDeleteClusterListBuilder) +} + +// Items sets the items of the list. +func (b *PendingDeleteClusterListBuilder) Items(values ...*PendingDeleteClusterBuilder) *PendingDeleteClusterListBuilder { + b.items = make([]*PendingDeleteClusterBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *PendingDeleteClusterListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *PendingDeleteClusterListBuilder) Copy(list *PendingDeleteClusterList) *PendingDeleteClusterListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*PendingDeleteClusterBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewPendingDeleteCluster().Copy(v) + } + } + return b +} + +// Build creates a list of 'pending_delete_cluster' objects using the +// configuration stored in the builder. +func (b *PendingDeleteClusterListBuilder) Build() (list *PendingDeleteClusterList, err error) { + items := make([]*PendingDeleteCluster, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(PendingDeleteClusterList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_list_type_json.go b/clustersmgmt/v2alpha1/pending_delete_cluster_list_type_json.go new file mode 100644 index 00000000..8952ba97 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPendingDeleteClusterList writes a list of values of the 'pending_delete_cluster' type to +// the given writer. +func MarshalPendingDeleteClusterList(list []*PendingDeleteCluster, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePendingDeleteClusterList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePendingDeleteClusterList writes a list of value of the 'pending_delete_cluster' type to +// the given stream. +func writePendingDeleteClusterList(list []*PendingDeleteCluster, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writePendingDeleteCluster(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalPendingDeleteClusterList reads a list of values of the 'pending_delete_cluster' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalPendingDeleteClusterList(source interface{}) (items []*PendingDeleteCluster, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readPendingDeleteClusterList(iterator) + err = iterator.Error + return +} + +// readPendingDeleteClusterList reads list of values of the ”pending_delete_cluster' type from +// the given iterator. +func readPendingDeleteClusterList(iterator *jsoniter.Iterator) []*PendingDeleteCluster { + list := []*PendingDeleteCluster{} + for iterator.ReadArray() { + item := readPendingDeleteCluster(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_resource_json.go b/clustersmgmt/v2alpha1/pending_delete_cluster_resource_json.go new file mode 100644 index 00000000..e8ea7169 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writePendingDeleteClusterGetRequest(request *PendingDeleteClusterGetRequest, writer io.Writer) error { + return nil +} +func readPendingDeleteClusterGetResponse(response *PendingDeleteClusterGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalPendingDeleteCluster(reader) + return err +} +func writePendingDeleteClusterUpdateRequest(request *PendingDeleteClusterUpdateRequest, writer io.Writer) error { + return MarshalPendingDeleteCluster(request.body, writer) +} +func readPendingDeleteClusterUpdateResponse(response *PendingDeleteClusterUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalPendingDeleteCluster(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_type.go b/clustersmgmt/v2alpha1/pending_delete_cluster_type.go new file mode 100644 index 00000000..961bdb0d --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_type.go @@ -0,0 +1,296 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// PendingDeleteClusterKind is the name of the type used to represent objects +// of type 'pending_delete_cluster'. +const PendingDeleteClusterKind = "PendingDeleteCluster" + +// PendingDeleteClusterLinkKind is the name of the type used to represent links +// to objects of type 'pending_delete_cluster'. +const PendingDeleteClusterLinkKind = "PendingDeleteClusterLink" + +// PendingDeleteClusterNilKind is the name of the type used to nil references +// to objects of type 'pending_delete_cluster'. +const PendingDeleteClusterNilKind = "PendingDeleteClusterNil" + +// PendingDeleteCluster represents the values of the 'pending_delete_cluster' type. +// +// Represents a pending delete entry for a specific cluster. +type PendingDeleteCluster struct { + bitmap_ uint32 + id string + href string + cluster *Cluster + creationTimestamp time.Time + bestEffort bool +} + +// Kind returns the name of the type of the object. +func (o *PendingDeleteCluster) Kind() string { + if o == nil { + return PendingDeleteClusterNilKind + } + if o.bitmap_&1 != 0 { + return PendingDeleteClusterLinkKind + } + return PendingDeleteClusterKind +} + +// Link returns true iif this is a link. +func (o *PendingDeleteCluster) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *PendingDeleteCluster) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *PendingDeleteCluster) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *PendingDeleteCluster) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *PendingDeleteCluster) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *PendingDeleteCluster) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// BestEffort returns the value of the 'best_effort' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Flag indicating if the cluster deletion should be best-effort mode or not. +func (o *PendingDeleteCluster) BestEffort() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.bestEffort + } + return false +} + +// GetBestEffort returns the value of the 'best_effort' attribute and +// a flag indicating if the attribute has a value. +// +// Flag indicating if the cluster deletion should be best-effort mode or not. +func (o *PendingDeleteCluster) GetBestEffort() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.bestEffort + } + return +} + +// Cluster returns the value of the 'cluster' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster is the details of the cluster that is pending deletion. +func (o *PendingDeleteCluster) Cluster() *Cluster { + if o != nil && o.bitmap_&16 != 0 { + return o.cluster + } + return nil +} + +// GetCluster returns the value of the 'cluster' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster is the details of the cluster that is pending deletion. +func (o *PendingDeleteCluster) GetCluster() (value *Cluster, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.cluster + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the cluster was initially created, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *PendingDeleteCluster) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the cluster was initially created, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *PendingDeleteCluster) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// PendingDeleteClusterListKind is the name of the type used to represent list of objects of +// type 'pending_delete_cluster'. +const PendingDeleteClusterListKind = "PendingDeleteClusterList" + +// PendingDeleteClusterListLinkKind is the name of the type used to represent links to list +// of objects of type 'pending_delete_cluster'. +const PendingDeleteClusterListLinkKind = "PendingDeleteClusterListLink" + +// PendingDeleteClusterNilKind is the name of the type used to nil lists of objects of +// type 'pending_delete_cluster'. +const PendingDeleteClusterListNilKind = "PendingDeleteClusterListNil" + +// PendingDeleteClusterList is a list of values of the 'pending_delete_cluster' type. +type PendingDeleteClusterList struct { + href string + link bool + items []*PendingDeleteCluster +} + +// Kind returns the name of the type of the object. +func (l *PendingDeleteClusterList) Kind() string { + if l == nil { + return PendingDeleteClusterListNilKind + } + if l.link { + return PendingDeleteClusterListLinkKind + } + return PendingDeleteClusterListKind +} + +// Link returns true iif this is a link. +func (l *PendingDeleteClusterList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *PendingDeleteClusterList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *PendingDeleteClusterList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *PendingDeleteClusterList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *PendingDeleteClusterList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *PendingDeleteClusterList) Get(i int) *PendingDeleteCluster { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *PendingDeleteClusterList) Slice() []*PendingDeleteCluster { + var slice []*PendingDeleteCluster + if l == nil { + slice = make([]*PendingDeleteCluster, 0) + } else { + slice = make([]*PendingDeleteCluster, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *PendingDeleteClusterList) Each(f func(item *PendingDeleteCluster) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *PendingDeleteClusterList) Range(f func(index int, item *PendingDeleteCluster) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/pending_delete_cluster_type_json.go b/clustersmgmt/v2alpha1/pending_delete_cluster_type_json.go new file mode 100644 index 00000000..69e83363 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_cluster_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPendingDeleteCluster writes a value of the 'pending_delete_cluster' type to the given writer. +func MarshalPendingDeleteCluster(object *PendingDeleteCluster, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePendingDeleteCluster(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePendingDeleteCluster writes a value of the 'pending_delete_cluster' type to the given stream. +func writePendingDeleteCluster(object *PendingDeleteCluster, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(PendingDeleteClusterLinkKind) + } else { + stream.WriteString(PendingDeleteClusterKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("best_effort") + stream.WriteBool(object.bestEffort) + count++ + } + present_ = object.bitmap_&16 != 0 && object.cluster != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster") + writeCluster(object.cluster, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + } + stream.WriteObjectEnd() +} + +// UnmarshalPendingDeleteCluster reads a value of the 'pending_delete_cluster' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalPendingDeleteCluster(source interface{}) (object *PendingDeleteCluster, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readPendingDeleteCluster(iterator) + err = iterator.Error + return +} + +// readPendingDeleteCluster reads a value of the 'pending_delete_cluster' type from the given iterator. +func readPendingDeleteCluster(iterator *jsoniter.Iterator) *PendingDeleteCluster { + object := &PendingDeleteCluster{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == PendingDeleteClusterLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "best_effort": + value := iterator.ReadBool() + object.bestEffort = value + object.bitmap_ |= 8 + case "cluster": + value := readCluster(iterator) + object.cluster = value + object.bitmap_ |= 16 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/pending_delete_clusters_client.go b/clustersmgmt/v2alpha1/pending_delete_clusters_client.go new file mode 100644 index 00000000..f7f4f809 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_clusters_client.go @@ -0,0 +1,347 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// PendingDeleteClustersClient is the client of the 'pending_delete_clusters' resource. +// +// Manages the collection of pending delete clusters. +type PendingDeleteClustersClient struct { + transport http.RoundTripper + path string +} + +// NewPendingDeleteClustersClient creates a new client for the 'pending_delete_clusters' +// resource using the given transport to send the requests and receive the +// responses. +func NewPendingDeleteClustersClient(transport http.RoundTripper, path string) *PendingDeleteClustersClient { + return &PendingDeleteClustersClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of pending delete clusters. +func (c *PendingDeleteClustersClient) List() *PendingDeleteClustersListRequest { + return &PendingDeleteClustersListRequest{ + transport: c.transport, + path: c.path, + } +} + +// PendingDeleteCluster returns the target 'pending_delete_cluster' resource for the given identifier. +// +// Returns a reference to the service that manages an specific pending delete cluster. +func (c *PendingDeleteClustersClient) PendingDeleteCluster(id string) *PendingDeleteClusterClient { + return NewPendingDeleteClusterClient( + c.transport, + path.Join(c.path, id), + ) +} + +// PendingDeleteClustersListRequest is the request for the 'list' method. +type PendingDeleteClustersListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *PendingDeleteClustersListRequest) Parameter(name string, value interface{}) *PendingDeleteClustersListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PendingDeleteClustersListRequest) Header(name string, value interface{}) *PendingDeleteClustersListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PendingDeleteClustersListRequest) Impersonate(user string) *PendingDeleteClustersListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the pending delete cluster instead of +// the names of the columns of a table. For example, in order to sort the pending delete clusters +// descending by creation timestamp (i.e. their deletion time) the value should be: +// +// ```sql +// creation_timestamp desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *PendingDeleteClustersListRequest) Order(value string) *PendingDeleteClustersListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *PendingDeleteClustersListRequest) Page(value int) *PendingDeleteClustersListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the pending delete cluster instead of +// the names of the columns of a table. For example, in order to retrieve all the +// pending delete clusters with creation time later than 2023-03-01T00:00:00Z the following is required: +// +// ```sql +// creation_timestamp > '2023-03-01T00:00:00Z' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// pending delete clusters that the user has permission to see will be returned. +func (r *PendingDeleteClustersListRequest) Search(value string) *PendingDeleteClustersListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *PendingDeleteClustersListRequest) Size(value int) *PendingDeleteClustersListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PendingDeleteClustersListRequest) Send() (result *PendingDeleteClustersListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PendingDeleteClustersListRequest) SendContext(ctx context.Context) (result *PendingDeleteClustersListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PendingDeleteClustersListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPendingDeleteClustersListResponse(result, reader) + if err != nil { + return + } + return +} + +// PendingDeleteClustersListResponse is the response for the 'list' method. +type PendingDeleteClustersListResponse struct { + status int + header http.Header + err *errors.Error + items *PendingDeleteClusterList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *PendingDeleteClustersListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PendingDeleteClustersListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PendingDeleteClustersListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of pending delete clusters. +func (r *PendingDeleteClustersListResponse) Items() *PendingDeleteClusterList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of pending delete clusters. +func (r *PendingDeleteClustersListResponse) GetItems() (value *PendingDeleteClusterList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *PendingDeleteClustersListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *PendingDeleteClustersListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *PendingDeleteClustersListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *PendingDeleteClustersListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *PendingDeleteClustersListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *PendingDeleteClustersListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/pending_delete_clusters_resource_json.go b/clustersmgmt/v2alpha1/pending_delete_clusters_resource_json.go new file mode 100644 index 00000000..2d790de8 --- /dev/null +++ b/clustersmgmt/v2alpha1/pending_delete_clusters_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writePendingDeleteClustersListRequest(request *PendingDeleteClustersListRequest, writer io.Writer) error { + return nil +} +func readPendingDeleteClustersListResponse(response *PendingDeleteClustersListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readPendingDeleteClusterList(iterator) + response.items = &PendingDeleteClusterList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/platform_list_type_json.go b/clustersmgmt/v2alpha1/platform_list_type_json.go new file mode 100644 index 00000000..e064fd53 --- /dev/null +++ b/clustersmgmt/v2alpha1/platform_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPlatformList writes a list of values of the 'platform' type to +// the given writer. +func MarshalPlatformList(list []Platform, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePlatformList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePlatformList writes a list of value of the 'platform' type to +// the given stream. +func writePlatformList(list []Platform, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalPlatformList reads a list of values of the 'platform' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalPlatformList(source interface{}) (items []Platform, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readPlatformList(iterator) + err = iterator.Error + return +} + +// readPlatformList reads list of values of the ”platform' type from +// the given iterator. +func readPlatformList(iterator *jsoniter.Iterator) []Platform { + list := []Platform{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := Platform(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/platform_type.go b/clustersmgmt/v2alpha1/platform_type.go new file mode 100644 index 00000000..c003bdc8 --- /dev/null +++ b/clustersmgmt/v2alpha1/platform_type.go @@ -0,0 +1,36 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Platform represents the values of the 'platform' enumerated type. +type Platform string + +const ( + // + PlatformAws Platform = "aws" + // + PlatformAwsClassic Platform = "aws-classic" + // + PlatformAwsHostedCp Platform = "aws-hosted-cp" + // + PlatformGcp Platform = "gcp" + // + PlatformHostedCluster Platform = "hostedcluster" +) diff --git a/clustersmgmt/v2alpha1/private_link_cluster_configuration_builder.go b/clustersmgmt/v2alpha1/private_link_cluster_configuration_builder.go new file mode 100644 index 00000000..5cd394ec --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_cluster_configuration_builder.go @@ -0,0 +1,79 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkClusterConfigurationBuilder contains the data and logic needed to build 'private_link_cluster_configuration' objects. +// +// Manages the configuration for the Private Links. +type PrivateLinkClusterConfigurationBuilder struct { + bitmap_ uint32 + principals []*PrivateLinkPrincipalBuilder +} + +// NewPrivateLinkClusterConfiguration creates a new builder of 'private_link_cluster_configuration' objects. +func NewPrivateLinkClusterConfiguration() *PrivateLinkClusterConfigurationBuilder { + return &PrivateLinkClusterConfigurationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *PrivateLinkClusterConfigurationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Principals sets the value of the 'principals' attribute to the given values. +func (b *PrivateLinkClusterConfigurationBuilder) Principals(values ...*PrivateLinkPrincipalBuilder) *PrivateLinkClusterConfigurationBuilder { + b.principals = make([]*PrivateLinkPrincipalBuilder, len(values)) + copy(b.principals, values) + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *PrivateLinkClusterConfigurationBuilder) Copy(object *PrivateLinkClusterConfiguration) *PrivateLinkClusterConfigurationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.principals != nil { + b.principals = make([]*PrivateLinkPrincipalBuilder, len(object.principals)) + for i, v := range object.principals { + b.principals[i] = NewPrivateLinkPrincipal().Copy(v) + } + } else { + b.principals = nil + } + return b +} + +// Build creates a 'private_link_cluster_configuration' object using the configuration stored in the builder. +func (b *PrivateLinkClusterConfigurationBuilder) Build() (object *PrivateLinkClusterConfiguration, err error) { + object = new(PrivateLinkClusterConfiguration) + object.bitmap_ = b.bitmap_ + if b.principals != nil { + object.principals = make([]*PrivateLinkPrincipal, len(b.principals)) + for i, v := range b.principals { + object.principals[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/private_link_cluster_configuration_list_builder.go b/clustersmgmt/v2alpha1/private_link_cluster_configuration_list_builder.go new file mode 100644 index 00000000..65cf0d07 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_cluster_configuration_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkClusterConfigurationListBuilder contains the data and logic needed to build +// 'private_link_cluster_configuration' objects. +type PrivateLinkClusterConfigurationListBuilder struct { + items []*PrivateLinkClusterConfigurationBuilder +} + +// NewPrivateLinkClusterConfigurationList creates a new builder of 'private_link_cluster_configuration' objects. +func NewPrivateLinkClusterConfigurationList() *PrivateLinkClusterConfigurationListBuilder { + return new(PrivateLinkClusterConfigurationListBuilder) +} + +// Items sets the items of the list. +func (b *PrivateLinkClusterConfigurationListBuilder) Items(values ...*PrivateLinkClusterConfigurationBuilder) *PrivateLinkClusterConfigurationListBuilder { + b.items = make([]*PrivateLinkClusterConfigurationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *PrivateLinkClusterConfigurationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *PrivateLinkClusterConfigurationListBuilder) Copy(list *PrivateLinkClusterConfigurationList) *PrivateLinkClusterConfigurationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*PrivateLinkClusterConfigurationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewPrivateLinkClusterConfiguration().Copy(v) + } + } + return b +} + +// Build creates a list of 'private_link_cluster_configuration' objects using the +// configuration stored in the builder. +func (b *PrivateLinkClusterConfigurationListBuilder) Build() (list *PrivateLinkClusterConfigurationList, err error) { + items := make([]*PrivateLinkClusterConfiguration, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(PrivateLinkClusterConfigurationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/private_link_cluster_configuration_list_type_json.go b/clustersmgmt/v2alpha1/private_link_cluster_configuration_list_type_json.go new file mode 100644 index 00000000..fb38a765 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_cluster_configuration_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkClusterConfigurationList writes a list of values of the 'private_link_cluster_configuration' type to +// the given writer. +func MarshalPrivateLinkClusterConfigurationList(list []*PrivateLinkClusterConfiguration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkClusterConfigurationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkClusterConfigurationList writes a list of value of the 'private_link_cluster_configuration' type to +// the given stream. +func writePrivateLinkClusterConfigurationList(list []*PrivateLinkClusterConfiguration, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writePrivateLinkClusterConfiguration(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalPrivateLinkClusterConfigurationList reads a list of values of the 'private_link_cluster_configuration' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalPrivateLinkClusterConfigurationList(source interface{}) (items []*PrivateLinkClusterConfiguration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readPrivateLinkClusterConfigurationList(iterator) + err = iterator.Error + return +} + +// readPrivateLinkClusterConfigurationList reads list of values of the ”private_link_cluster_configuration' type from +// the given iterator. +func readPrivateLinkClusterConfigurationList(iterator *jsoniter.Iterator) []*PrivateLinkClusterConfiguration { + list := []*PrivateLinkClusterConfiguration{} + for iterator.ReadArray() { + item := readPrivateLinkClusterConfiguration(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/private_link_cluster_configuration_type.go b/clustersmgmt/v2alpha1/private_link_cluster_configuration_type.go new file mode 100644 index 00000000..30ad8be1 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_cluster_configuration_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkClusterConfiguration represents the values of the 'private_link_cluster_configuration' type. +// +// Manages the configuration for the Private Links. +type PrivateLinkClusterConfiguration struct { + bitmap_ uint32 + principals []*PrivateLinkPrincipal +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *PrivateLinkClusterConfiguration) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Principals returns the value of the 'principals' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of additional principals for the Private Link +func (o *PrivateLinkClusterConfiguration) Principals() []*PrivateLinkPrincipal { + if o != nil && o.bitmap_&1 != 0 { + return o.principals + } + return nil +} + +// GetPrincipals returns the value of the 'principals' attribute and +// a flag indicating if the attribute has a value. +// +// List of additional principals for the Private Link +func (o *PrivateLinkClusterConfiguration) GetPrincipals() (value []*PrivateLinkPrincipal, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.principals + } + return +} + +// PrivateLinkClusterConfigurationListKind is the name of the type used to represent list of objects of +// type 'private_link_cluster_configuration'. +const PrivateLinkClusterConfigurationListKind = "PrivateLinkClusterConfigurationList" + +// PrivateLinkClusterConfigurationListLinkKind is the name of the type used to represent links to list +// of objects of type 'private_link_cluster_configuration'. +const PrivateLinkClusterConfigurationListLinkKind = "PrivateLinkClusterConfigurationListLink" + +// PrivateLinkClusterConfigurationNilKind is the name of the type used to nil lists of objects of +// type 'private_link_cluster_configuration'. +const PrivateLinkClusterConfigurationListNilKind = "PrivateLinkClusterConfigurationListNil" + +// PrivateLinkClusterConfigurationList is a list of values of the 'private_link_cluster_configuration' type. +type PrivateLinkClusterConfigurationList struct { + href string + link bool + items []*PrivateLinkClusterConfiguration +} + +// Len returns the length of the list. +func (l *PrivateLinkClusterConfigurationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *PrivateLinkClusterConfigurationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *PrivateLinkClusterConfigurationList) Get(i int) *PrivateLinkClusterConfiguration { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *PrivateLinkClusterConfigurationList) Slice() []*PrivateLinkClusterConfiguration { + var slice []*PrivateLinkClusterConfiguration + if l == nil { + slice = make([]*PrivateLinkClusterConfiguration, 0) + } else { + slice = make([]*PrivateLinkClusterConfiguration, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *PrivateLinkClusterConfigurationList) Each(f func(item *PrivateLinkClusterConfiguration) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *PrivateLinkClusterConfigurationList) Range(f func(index int, item *PrivateLinkClusterConfiguration) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/private_link_cluster_configuration_type_json.go b/clustersmgmt/v2alpha1/private_link_cluster_configuration_type_json.go new file mode 100644 index 00000000..37515ef7 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_cluster_configuration_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkClusterConfiguration writes a value of the 'private_link_cluster_configuration' type to the given writer. +func MarshalPrivateLinkClusterConfiguration(object *PrivateLinkClusterConfiguration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkClusterConfiguration(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkClusterConfiguration writes a value of the 'private_link_cluster_configuration' type to the given stream. +func writePrivateLinkClusterConfiguration(object *PrivateLinkClusterConfiguration, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.principals != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("principals") + writePrivateLinkPrincipalList(object.principals, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalPrivateLinkClusterConfiguration reads a value of the 'private_link_cluster_configuration' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalPrivateLinkClusterConfiguration(source interface{}) (object *PrivateLinkClusterConfiguration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readPrivateLinkClusterConfiguration(iterator) + err = iterator.Error + return +} + +// readPrivateLinkClusterConfiguration reads a value of the 'private_link_cluster_configuration' type from the given iterator. +func readPrivateLinkClusterConfiguration(iterator *jsoniter.Iterator) *PrivateLinkClusterConfiguration { + object := &PrivateLinkClusterConfiguration{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "principals": + value := readPrivateLinkPrincipalList(iterator) + object.principals = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_builder.go b/clustersmgmt/v2alpha1/private_link_configuration_builder.go new file mode 100644 index 00000000..3655ff8d --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_builder.go @@ -0,0 +1,78 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkConfigurationBuilder contains the data and logic needed to build 'private_link_configuration' objects. +// +// Manages the configuration for the Private Links. +type PrivateLinkConfigurationBuilder struct { + bitmap_ uint32 + principals *PrivateLinkPrincipalsBuilder +} + +// NewPrivateLinkConfiguration creates a new builder of 'private_link_configuration' objects. +func NewPrivateLinkConfiguration() *PrivateLinkConfigurationBuilder { + return &PrivateLinkConfigurationBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *PrivateLinkConfigurationBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Principals sets the value of the 'principals' attribute to the given value. +// +// Contains a list of principals for the Private Link. +func (b *PrivateLinkConfigurationBuilder) Principals(value *PrivateLinkPrincipalsBuilder) *PrivateLinkConfigurationBuilder { + b.principals = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *PrivateLinkConfigurationBuilder) Copy(object *PrivateLinkConfiguration) *PrivateLinkConfigurationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.principals != nil { + b.principals = NewPrivateLinkPrincipals().Copy(object.principals) + } else { + b.principals = nil + } + return b +} + +// Build creates a 'private_link_configuration' object using the configuration stored in the builder. +func (b *PrivateLinkConfigurationBuilder) Build() (object *PrivateLinkConfiguration, err error) { + object = new(PrivateLinkConfiguration) + object.bitmap_ = b.bitmap_ + if b.principals != nil { + object.principals, err = b.principals.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_client.go b/clustersmgmt/v2alpha1/private_link_configuration_client.go new file mode 100644 index 00000000..69e846ad --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_client.go @@ -0,0 +1,316 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// PrivateLinkConfigurationClient is the client of the 'private_link_configuration' resource. +// +// Manages the configuration for the Private Links. +type PrivateLinkConfigurationClient struct { + transport http.RoundTripper + path string +} + +// NewPrivateLinkConfigurationClient creates a new client for the 'private_link_configuration' +// resource using the given transport to send the requests and receive the +// responses. +func NewPrivateLinkConfigurationClient(transport http.RoundTripper, path string) *PrivateLinkConfigurationClient { + return &PrivateLinkConfigurationClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the configuration for the Private Link. +func (c *PrivateLinkConfigurationClient) Get() *PrivateLinkConfigurationGetRequest { + return &PrivateLinkConfigurationGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Principals returns the target 'private_link_principals' resource. +func (c *PrivateLinkConfigurationClient) Principals() *PrivateLinkPrincipalsClient { + return NewPrivateLinkPrincipalsClient( + c.transport, + path.Join(c.path, "principals"), + ) +} + +// PrivateLinkConfigurationPollRequest is the request for the Poll method. +type PrivateLinkConfigurationPollRequest struct { + request *PrivateLinkConfigurationGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *PrivateLinkConfigurationPollRequest) Parameter(name string, value interface{}) *PrivateLinkConfigurationPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *PrivateLinkConfigurationPollRequest) Header(name string, value interface{}) *PrivateLinkConfigurationPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *PrivateLinkConfigurationPollRequest) Interval(value time.Duration) *PrivateLinkConfigurationPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *PrivateLinkConfigurationPollRequest) Status(value int) *PrivateLinkConfigurationPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *PrivateLinkConfigurationPollRequest) Predicate(value func(*PrivateLinkConfigurationGetResponse) bool) *PrivateLinkConfigurationPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*PrivateLinkConfigurationGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *PrivateLinkConfigurationPollRequest) StartContext(ctx context.Context) (response *PrivateLinkConfigurationPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &PrivateLinkConfigurationPollResponse{ + response: result.(*PrivateLinkConfigurationGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *PrivateLinkConfigurationPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// PrivateLinkConfigurationPollResponse is the response for the Poll method. +type PrivateLinkConfigurationPollResponse struct { + response *PrivateLinkConfigurationGetResponse +} + +// Status returns the response status code. +func (r *PrivateLinkConfigurationPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *PrivateLinkConfigurationPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *PrivateLinkConfigurationPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *PrivateLinkConfigurationPollResponse) Body() *PrivateLinkConfiguration { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PrivateLinkConfigurationPollResponse) GetBody() (value *PrivateLinkConfiguration, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *PrivateLinkConfigurationClient) Poll() *PrivateLinkConfigurationPollRequest { + return &PrivateLinkConfigurationPollRequest{ + request: c.Get(), + } +} + +// PrivateLinkConfigurationGetRequest is the request for the 'get' method. +type PrivateLinkConfigurationGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *PrivateLinkConfigurationGetRequest) Parameter(name string, value interface{}) *PrivateLinkConfigurationGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PrivateLinkConfigurationGetRequest) Header(name string, value interface{}) *PrivateLinkConfigurationGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PrivateLinkConfigurationGetRequest) Impersonate(user string) *PrivateLinkConfigurationGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PrivateLinkConfigurationGetRequest) Send() (result *PrivateLinkConfigurationGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PrivateLinkConfigurationGetRequest) SendContext(ctx context.Context) (result *PrivateLinkConfigurationGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PrivateLinkConfigurationGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPrivateLinkConfigurationGetResponse(result, reader) + if err != nil { + return + } + return +} + +// PrivateLinkConfigurationGetResponse is the response for the 'get' method. +type PrivateLinkConfigurationGetResponse struct { + status int + header http.Header + err *errors.Error + body *PrivateLinkConfiguration +} + +// Status returns the response status code. +func (r *PrivateLinkConfigurationGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PrivateLinkConfigurationGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PrivateLinkConfigurationGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *PrivateLinkConfigurationGetResponse) Body() *PrivateLinkConfiguration { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PrivateLinkConfigurationGetResponse) GetBody() (value *PrivateLinkConfiguration, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_list_builder.go b/clustersmgmt/v2alpha1/private_link_configuration_list_builder.go new file mode 100644 index 00000000..912f48a8 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkConfigurationListBuilder contains the data and logic needed to build +// 'private_link_configuration' objects. +type PrivateLinkConfigurationListBuilder struct { + items []*PrivateLinkConfigurationBuilder +} + +// NewPrivateLinkConfigurationList creates a new builder of 'private_link_configuration' objects. +func NewPrivateLinkConfigurationList() *PrivateLinkConfigurationListBuilder { + return new(PrivateLinkConfigurationListBuilder) +} + +// Items sets the items of the list. +func (b *PrivateLinkConfigurationListBuilder) Items(values ...*PrivateLinkConfigurationBuilder) *PrivateLinkConfigurationListBuilder { + b.items = make([]*PrivateLinkConfigurationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *PrivateLinkConfigurationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *PrivateLinkConfigurationListBuilder) Copy(list *PrivateLinkConfigurationList) *PrivateLinkConfigurationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*PrivateLinkConfigurationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewPrivateLinkConfiguration().Copy(v) + } + } + return b +} + +// Build creates a list of 'private_link_configuration' objects using the +// configuration stored in the builder. +func (b *PrivateLinkConfigurationListBuilder) Build() (list *PrivateLinkConfigurationList, err error) { + items := make([]*PrivateLinkConfiguration, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(PrivateLinkConfigurationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_list_type_json.go b/clustersmgmt/v2alpha1/private_link_configuration_list_type_json.go new file mode 100644 index 00000000..fed77bcb --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkConfigurationList writes a list of values of the 'private_link_configuration' type to +// the given writer. +func MarshalPrivateLinkConfigurationList(list []*PrivateLinkConfiguration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkConfigurationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkConfigurationList writes a list of value of the 'private_link_configuration' type to +// the given stream. +func writePrivateLinkConfigurationList(list []*PrivateLinkConfiguration, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writePrivateLinkConfiguration(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalPrivateLinkConfigurationList reads a list of values of the 'private_link_configuration' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalPrivateLinkConfigurationList(source interface{}) (items []*PrivateLinkConfiguration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readPrivateLinkConfigurationList(iterator) + err = iterator.Error + return +} + +// readPrivateLinkConfigurationList reads list of values of the ”private_link_configuration' type from +// the given iterator. +func readPrivateLinkConfigurationList(iterator *jsoniter.Iterator) []*PrivateLinkConfiguration { + list := []*PrivateLinkConfiguration{} + for iterator.ReadArray() { + item := readPrivateLinkConfiguration(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_resource_json.go b/clustersmgmt/v2alpha1/private_link_configuration_resource_json.go new file mode 100644 index 00000000..776a14c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writePrivateLinkConfigurationGetRequest(request *PrivateLinkConfigurationGetRequest, writer io.Writer) error { + return nil +} +func readPrivateLinkConfigurationGetResponse(response *PrivateLinkConfigurationGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalPrivateLinkConfiguration(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_type.go b/clustersmgmt/v2alpha1/private_link_configuration_type.go new file mode 100644 index 00000000..1fa387b3 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkConfiguration represents the values of the 'private_link_configuration' type. +// +// Manages the configuration for the Private Links. +type PrivateLinkConfiguration struct { + bitmap_ uint32 + principals *PrivateLinkPrincipals +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *PrivateLinkConfiguration) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Principals returns the value of the 'principals' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of additional principals for the Private Link +func (o *PrivateLinkConfiguration) Principals() *PrivateLinkPrincipals { + if o != nil && o.bitmap_&1 != 0 { + return o.principals + } + return nil +} + +// GetPrincipals returns the value of the 'principals' attribute and +// a flag indicating if the attribute has a value. +// +// List of additional principals for the Private Link +func (o *PrivateLinkConfiguration) GetPrincipals() (value *PrivateLinkPrincipals, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.principals + } + return +} + +// PrivateLinkConfigurationListKind is the name of the type used to represent list of objects of +// type 'private_link_configuration'. +const PrivateLinkConfigurationListKind = "PrivateLinkConfigurationList" + +// PrivateLinkConfigurationListLinkKind is the name of the type used to represent links to list +// of objects of type 'private_link_configuration'. +const PrivateLinkConfigurationListLinkKind = "PrivateLinkConfigurationListLink" + +// PrivateLinkConfigurationNilKind is the name of the type used to nil lists of objects of +// type 'private_link_configuration'. +const PrivateLinkConfigurationListNilKind = "PrivateLinkConfigurationListNil" + +// PrivateLinkConfigurationList is a list of values of the 'private_link_configuration' type. +type PrivateLinkConfigurationList struct { + href string + link bool + items []*PrivateLinkConfiguration +} + +// Len returns the length of the list. +func (l *PrivateLinkConfigurationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *PrivateLinkConfigurationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *PrivateLinkConfigurationList) Get(i int) *PrivateLinkConfiguration { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *PrivateLinkConfigurationList) Slice() []*PrivateLinkConfiguration { + var slice []*PrivateLinkConfiguration + if l == nil { + slice = make([]*PrivateLinkConfiguration, 0) + } else { + slice = make([]*PrivateLinkConfiguration, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *PrivateLinkConfigurationList) Each(f func(item *PrivateLinkConfiguration) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *PrivateLinkConfigurationList) Range(f func(index int, item *PrivateLinkConfiguration) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/private_link_configuration_type_json.go b/clustersmgmt/v2alpha1/private_link_configuration_type_json.go new file mode 100644 index 00000000..62bd5b8c --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_configuration_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkConfiguration writes a value of the 'private_link_configuration' type to the given writer. +func MarshalPrivateLinkConfiguration(object *PrivateLinkConfiguration, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkConfiguration(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkConfiguration writes a value of the 'private_link_configuration' type to the given stream. +func writePrivateLinkConfiguration(object *PrivateLinkConfiguration, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.principals != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("principals") + writePrivateLinkPrincipals(object.principals, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalPrivateLinkConfiguration reads a value of the 'private_link_configuration' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalPrivateLinkConfiguration(source interface{}) (object *PrivateLinkConfiguration, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readPrivateLinkConfiguration(iterator) + err = iterator.Error + return +} + +// readPrivateLinkConfiguration reads a value of the 'private_link_configuration' type from the given iterator. +func readPrivateLinkConfiguration(iterator *jsoniter.Iterator) *PrivateLinkConfiguration { + object := &PrivateLinkConfiguration{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "principals": + value := readPrivateLinkPrincipals(iterator) + object.principals = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_builder.go b/clustersmgmt/v2alpha1/private_link_principal_builder.go new file mode 100644 index 00000000..9c758fae --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_builder.go @@ -0,0 +1,87 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkPrincipalBuilder contains the data and logic needed to build 'private_link_principal' objects. +type PrivateLinkPrincipalBuilder struct { + bitmap_ uint32 + id string + href string + principal string +} + +// NewPrivateLinkPrincipal creates a new builder of 'private_link_principal' objects. +func NewPrivateLinkPrincipal() *PrivateLinkPrincipalBuilder { + return &PrivateLinkPrincipalBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *PrivateLinkPrincipalBuilder) Link(value bool) *PrivateLinkPrincipalBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *PrivateLinkPrincipalBuilder) ID(value string) *PrivateLinkPrincipalBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *PrivateLinkPrincipalBuilder) HREF(value string) *PrivateLinkPrincipalBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *PrivateLinkPrincipalBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Principal sets the value of the 'principal' attribute to the given value. +func (b *PrivateLinkPrincipalBuilder) Principal(value string) *PrivateLinkPrincipalBuilder { + b.principal = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *PrivateLinkPrincipalBuilder) Copy(object *PrivateLinkPrincipal) *PrivateLinkPrincipalBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.principal = object.principal + return b +} + +// Build creates a 'private_link_principal' object using the configuration stored in the builder. +func (b *PrivateLinkPrincipalBuilder) Build() (object *PrivateLinkPrincipal, err error) { + object = new(PrivateLinkPrincipal) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.principal = b.principal + return +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_client.go b/clustersmgmt/v2alpha1/private_link_principal_client.go new file mode 100644 index 00000000..aa13c5de --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// PrivateLinkPrincipalClient is the client of the 'private_link_principal' resource. +// +// Manages a principal for a Private Link. +type PrivateLinkPrincipalClient struct { + transport http.RoundTripper + path string +} + +// NewPrivateLinkPrincipalClient creates a new client for the 'private_link_principal' +// resource using the given transport to send the requests and receive the +// responses. +func NewPrivateLinkPrincipalClient(transport http.RoundTripper, path string) *PrivateLinkPrincipalClient { + return &PrivateLinkPrincipalClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the principal. +func (c *PrivateLinkPrincipalClient) Delete() *PrivateLinkPrincipalDeleteRequest { + return &PrivateLinkPrincipalDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the principal. +func (c *PrivateLinkPrincipalClient) Get() *PrivateLinkPrincipalGetRequest { + return &PrivateLinkPrincipalGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// PrivateLinkPrincipalPollRequest is the request for the Poll method. +type PrivateLinkPrincipalPollRequest struct { + request *PrivateLinkPrincipalGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *PrivateLinkPrincipalPollRequest) Parameter(name string, value interface{}) *PrivateLinkPrincipalPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *PrivateLinkPrincipalPollRequest) Header(name string, value interface{}) *PrivateLinkPrincipalPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *PrivateLinkPrincipalPollRequest) Interval(value time.Duration) *PrivateLinkPrincipalPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *PrivateLinkPrincipalPollRequest) Status(value int) *PrivateLinkPrincipalPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *PrivateLinkPrincipalPollRequest) Predicate(value func(*PrivateLinkPrincipalGetResponse) bool) *PrivateLinkPrincipalPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*PrivateLinkPrincipalGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *PrivateLinkPrincipalPollRequest) StartContext(ctx context.Context) (response *PrivateLinkPrincipalPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &PrivateLinkPrincipalPollResponse{ + response: result.(*PrivateLinkPrincipalGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *PrivateLinkPrincipalPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// PrivateLinkPrincipalPollResponse is the response for the Poll method. +type PrivateLinkPrincipalPollResponse struct { + response *PrivateLinkPrincipalGetResponse +} + +// Status returns the response status code. +func (r *PrivateLinkPrincipalPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *PrivateLinkPrincipalPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *PrivateLinkPrincipalPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *PrivateLinkPrincipalPollResponse) Body() *PrivateLinkPrincipal { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PrivateLinkPrincipalPollResponse) GetBody() (value *PrivateLinkPrincipal, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *PrivateLinkPrincipalClient) Poll() *PrivateLinkPrincipalPollRequest { + return &PrivateLinkPrincipalPollRequest{ + request: c.Get(), + } +} + +// PrivateLinkPrincipalDeleteRequest is the request for the 'delete' method. +type PrivateLinkPrincipalDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *PrivateLinkPrincipalDeleteRequest) Parameter(name string, value interface{}) *PrivateLinkPrincipalDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PrivateLinkPrincipalDeleteRequest) Header(name string, value interface{}) *PrivateLinkPrincipalDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PrivateLinkPrincipalDeleteRequest) Impersonate(user string) *PrivateLinkPrincipalDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PrivateLinkPrincipalDeleteRequest) Send() (result *PrivateLinkPrincipalDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PrivateLinkPrincipalDeleteRequest) SendContext(ctx context.Context) (result *PrivateLinkPrincipalDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PrivateLinkPrincipalDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// PrivateLinkPrincipalDeleteResponse is the response for the 'delete' method. +type PrivateLinkPrincipalDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *PrivateLinkPrincipalDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PrivateLinkPrincipalDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PrivateLinkPrincipalDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// PrivateLinkPrincipalGetRequest is the request for the 'get' method. +type PrivateLinkPrincipalGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *PrivateLinkPrincipalGetRequest) Parameter(name string, value interface{}) *PrivateLinkPrincipalGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PrivateLinkPrincipalGetRequest) Header(name string, value interface{}) *PrivateLinkPrincipalGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PrivateLinkPrincipalGetRequest) Impersonate(user string) *PrivateLinkPrincipalGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PrivateLinkPrincipalGetRequest) Send() (result *PrivateLinkPrincipalGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PrivateLinkPrincipalGetRequest) SendContext(ctx context.Context) (result *PrivateLinkPrincipalGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PrivateLinkPrincipalGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPrivateLinkPrincipalGetResponse(result, reader) + if err != nil { + return + } + return +} + +// PrivateLinkPrincipalGetResponse is the response for the 'get' method. +type PrivateLinkPrincipalGetResponse struct { + status int + header http.Header + err *errors.Error + body *PrivateLinkPrincipal +} + +// Status returns the response status code. +func (r *PrivateLinkPrincipalGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PrivateLinkPrincipalGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PrivateLinkPrincipalGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *PrivateLinkPrincipalGetResponse) Body() *PrivateLinkPrincipal { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *PrivateLinkPrincipalGetResponse) GetBody() (value *PrivateLinkPrincipal, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_list_builder.go b/clustersmgmt/v2alpha1/private_link_principal_list_builder.go new file mode 100644 index 00000000..551286ca --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkPrincipalListBuilder contains the data and logic needed to build +// 'private_link_principal' objects. +type PrivateLinkPrincipalListBuilder struct { + items []*PrivateLinkPrincipalBuilder +} + +// NewPrivateLinkPrincipalList creates a new builder of 'private_link_principal' objects. +func NewPrivateLinkPrincipalList() *PrivateLinkPrincipalListBuilder { + return new(PrivateLinkPrincipalListBuilder) +} + +// Items sets the items of the list. +func (b *PrivateLinkPrincipalListBuilder) Items(values ...*PrivateLinkPrincipalBuilder) *PrivateLinkPrincipalListBuilder { + b.items = make([]*PrivateLinkPrincipalBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *PrivateLinkPrincipalListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *PrivateLinkPrincipalListBuilder) Copy(list *PrivateLinkPrincipalList) *PrivateLinkPrincipalListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*PrivateLinkPrincipalBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewPrivateLinkPrincipal().Copy(v) + } + } + return b +} + +// Build creates a list of 'private_link_principal' objects using the +// configuration stored in the builder. +func (b *PrivateLinkPrincipalListBuilder) Build() (list *PrivateLinkPrincipalList, err error) { + items := make([]*PrivateLinkPrincipal, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(PrivateLinkPrincipalList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_list_type_json.go b/clustersmgmt/v2alpha1/private_link_principal_list_type_json.go new file mode 100644 index 00000000..74f45aa8 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkPrincipalList writes a list of values of the 'private_link_principal' type to +// the given writer. +func MarshalPrivateLinkPrincipalList(list []*PrivateLinkPrincipal, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkPrincipalList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkPrincipalList writes a list of value of the 'private_link_principal' type to +// the given stream. +func writePrivateLinkPrincipalList(list []*PrivateLinkPrincipal, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writePrivateLinkPrincipal(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalPrivateLinkPrincipalList reads a list of values of the 'private_link_principal' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalPrivateLinkPrincipalList(source interface{}) (items []*PrivateLinkPrincipal, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readPrivateLinkPrincipalList(iterator) + err = iterator.Error + return +} + +// readPrivateLinkPrincipalList reads list of values of the ”private_link_principal' type from +// the given iterator. +func readPrivateLinkPrincipalList(iterator *jsoniter.Iterator) []*PrivateLinkPrincipal { + list := []*PrivateLinkPrincipal{} + for iterator.ReadArray() { + item := readPrivateLinkPrincipal(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_resource_json.go b/clustersmgmt/v2alpha1/private_link_principal_resource_json.go new file mode 100644 index 00000000..e0e8e541 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writePrivateLinkPrincipalDeleteRequest(request *PrivateLinkPrincipalDeleteRequest, writer io.Writer) error { + return nil +} +func readPrivateLinkPrincipalDeleteResponse(response *PrivateLinkPrincipalDeleteResponse, reader io.Reader) error { + return nil +} +func writePrivateLinkPrincipalGetRequest(request *PrivateLinkPrincipalGetRequest, writer io.Writer) error { + return nil +} +func readPrivateLinkPrincipalGetResponse(response *PrivateLinkPrincipalGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalPrivateLinkPrincipal(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_type.go b/clustersmgmt/v2alpha1/private_link_principal_type.go new file mode 100644 index 00000000..36ff7814 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_type.go @@ -0,0 +1,240 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkPrincipalKind is the name of the type used to represent objects +// of type 'private_link_principal'. +const PrivateLinkPrincipalKind = "PrivateLinkPrincipal" + +// PrivateLinkPrincipalLinkKind is the name of the type used to represent links +// to objects of type 'private_link_principal'. +const PrivateLinkPrincipalLinkKind = "PrivateLinkPrincipalLink" + +// PrivateLinkPrincipalNilKind is the name of the type used to nil references +// to objects of type 'private_link_principal'. +const PrivateLinkPrincipalNilKind = "PrivateLinkPrincipalNil" + +// PrivateLinkPrincipal represents the values of the 'private_link_principal' type. +type PrivateLinkPrincipal struct { + bitmap_ uint32 + id string + href string + principal string +} + +// Kind returns the name of the type of the object. +func (o *PrivateLinkPrincipal) Kind() string { + if o == nil { + return PrivateLinkPrincipalNilKind + } + if o.bitmap_&1 != 0 { + return PrivateLinkPrincipalLinkKind + } + return PrivateLinkPrincipalKind +} + +// Link returns true iif this is a link. +func (o *PrivateLinkPrincipal) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *PrivateLinkPrincipal) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *PrivateLinkPrincipal) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *PrivateLinkPrincipal) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *PrivateLinkPrincipal) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *PrivateLinkPrincipal) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Principal returns the value of the 'principal' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN for a principal that is allowed for this Private Link. +func (o *PrivateLinkPrincipal) Principal() string { + if o != nil && o.bitmap_&8 != 0 { + return o.principal + } + return "" +} + +// GetPrincipal returns the value of the 'principal' attribute and +// a flag indicating if the attribute has a value. +// +// ARN for a principal that is allowed for this Private Link. +func (o *PrivateLinkPrincipal) GetPrincipal() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.principal + } + return +} + +// PrivateLinkPrincipalListKind is the name of the type used to represent list of objects of +// type 'private_link_principal'. +const PrivateLinkPrincipalListKind = "PrivateLinkPrincipalList" + +// PrivateLinkPrincipalListLinkKind is the name of the type used to represent links to list +// of objects of type 'private_link_principal'. +const PrivateLinkPrincipalListLinkKind = "PrivateLinkPrincipalListLink" + +// PrivateLinkPrincipalNilKind is the name of the type used to nil lists of objects of +// type 'private_link_principal'. +const PrivateLinkPrincipalListNilKind = "PrivateLinkPrincipalListNil" + +// PrivateLinkPrincipalList is a list of values of the 'private_link_principal' type. +type PrivateLinkPrincipalList struct { + href string + link bool + items []*PrivateLinkPrincipal +} + +// Kind returns the name of the type of the object. +func (l *PrivateLinkPrincipalList) Kind() string { + if l == nil { + return PrivateLinkPrincipalListNilKind + } + if l.link { + return PrivateLinkPrincipalListLinkKind + } + return PrivateLinkPrincipalListKind +} + +// Link returns true iif this is a link. +func (l *PrivateLinkPrincipalList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *PrivateLinkPrincipalList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *PrivateLinkPrincipalList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *PrivateLinkPrincipalList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *PrivateLinkPrincipalList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *PrivateLinkPrincipalList) Get(i int) *PrivateLinkPrincipal { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *PrivateLinkPrincipalList) Slice() []*PrivateLinkPrincipal { + var slice []*PrivateLinkPrincipal + if l == nil { + slice = make([]*PrivateLinkPrincipal, 0) + } else { + slice = make([]*PrivateLinkPrincipal, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *PrivateLinkPrincipalList) Each(f func(item *PrivateLinkPrincipal) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *PrivateLinkPrincipalList) Range(f func(index int, item *PrivateLinkPrincipal) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/private_link_principal_type_json.go b/clustersmgmt/v2alpha1/private_link_principal_type_json.go new file mode 100644 index 00000000..64184138 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principal_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkPrincipal writes a value of the 'private_link_principal' type to the given writer. +func MarshalPrivateLinkPrincipal(object *PrivateLinkPrincipal, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkPrincipal(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkPrincipal writes a value of the 'private_link_principal' type to the given stream. +func writePrivateLinkPrincipal(object *PrivateLinkPrincipal, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(PrivateLinkPrincipalLinkKind) + } else { + stream.WriteString(PrivateLinkPrincipalKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("principal") + stream.WriteString(object.principal) + } + stream.WriteObjectEnd() +} + +// UnmarshalPrivateLinkPrincipal reads a value of the 'private_link_principal' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalPrivateLinkPrincipal(source interface{}) (object *PrivateLinkPrincipal, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readPrivateLinkPrincipal(iterator) + err = iterator.Error + return +} + +// readPrivateLinkPrincipal reads a value of the 'private_link_principal' type from the given iterator. +func readPrivateLinkPrincipal(iterator *jsoniter.Iterator) *PrivateLinkPrincipal { + object := &PrivateLinkPrincipal{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == PrivateLinkPrincipalLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "principal": + value := iterator.ReadString() + object.principal = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_builder.go b/clustersmgmt/v2alpha1/private_link_principals_builder.go new file mode 100644 index 00000000..8ba9c962 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_builder.go @@ -0,0 +1,105 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkPrincipalsBuilder contains the data and logic needed to build 'private_link_principals' objects. +// +// Contains a list of principals for the Private Link. +type PrivateLinkPrincipalsBuilder struct { + bitmap_ uint32 + id string + href string + principals []*PrivateLinkPrincipalBuilder +} + +// NewPrivateLinkPrincipals creates a new builder of 'private_link_principals' objects. +func NewPrivateLinkPrincipals() *PrivateLinkPrincipalsBuilder { + return &PrivateLinkPrincipalsBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *PrivateLinkPrincipalsBuilder) Link(value bool) *PrivateLinkPrincipalsBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *PrivateLinkPrincipalsBuilder) ID(value string) *PrivateLinkPrincipalsBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *PrivateLinkPrincipalsBuilder) HREF(value string) *PrivateLinkPrincipalsBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *PrivateLinkPrincipalsBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Principals sets the value of the 'principals' attribute to the given values. +func (b *PrivateLinkPrincipalsBuilder) Principals(values ...*PrivateLinkPrincipalBuilder) *PrivateLinkPrincipalsBuilder { + b.principals = make([]*PrivateLinkPrincipalBuilder, len(values)) + copy(b.principals, values) + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *PrivateLinkPrincipalsBuilder) Copy(object *PrivateLinkPrincipals) *PrivateLinkPrincipalsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.principals != nil { + b.principals = make([]*PrivateLinkPrincipalBuilder, len(object.principals)) + for i, v := range object.principals { + b.principals[i] = NewPrivateLinkPrincipal().Copy(v) + } + } else { + b.principals = nil + } + return b +} + +// Build creates a 'private_link_principals' object using the configuration stored in the builder. +func (b *PrivateLinkPrincipalsBuilder) Build() (object *PrivateLinkPrincipals, err error) { + object = new(PrivateLinkPrincipals) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.principals != nil { + object.principals = make([]*PrivateLinkPrincipal, len(b.principals)) + for i, v := range b.principals { + object.principals[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_client.go b/clustersmgmt/v2alpha1/private_link_principals_client.go new file mode 100644 index 00000000..574e32b1 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_client.go @@ -0,0 +1,479 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// PrivateLinkPrincipalsClient is the client of the 'private_link_principals' resource. +// +// Contains a list of principals for the Private Link. +type PrivateLinkPrincipalsClient struct { + transport http.RoundTripper + path string +} + +// NewPrivateLinkPrincipalsClient creates a new client for the 'private_link_principals' +// resource using the given transport to send the requests and receive the +// responses. +func NewPrivateLinkPrincipalsClient(transport http.RoundTripper, path string) *PrivateLinkPrincipalsClient { + return &PrivateLinkPrincipalsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new principal for the Private Link. +func (c *PrivateLinkPrincipalsClient) Add() *PrivateLinkPrincipalsAddRequest { + return &PrivateLinkPrincipalsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of principals. +func (c *PrivateLinkPrincipalsClient) List() *PrivateLinkPrincipalsListRequest { + return &PrivateLinkPrincipalsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Principal returns the target 'private_link_principal' resource for the given identifier. +func (c *PrivateLinkPrincipalsClient) Principal(id string) *PrivateLinkPrincipalClient { + return NewPrivateLinkPrincipalClient( + c.transport, + path.Join(c.path, id), + ) +} + +// PrivateLinkPrincipalsAddRequest is the request for the 'add' method. +type PrivateLinkPrincipalsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *PrivateLinkPrincipal +} + +// Parameter adds a query parameter. +func (r *PrivateLinkPrincipalsAddRequest) Parameter(name string, value interface{}) *PrivateLinkPrincipalsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PrivateLinkPrincipalsAddRequest) Header(name string, value interface{}) *PrivateLinkPrincipalsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PrivateLinkPrincipalsAddRequest) Impersonate(user string) *PrivateLinkPrincipalsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Properties of the principal. +func (r *PrivateLinkPrincipalsAddRequest) Body(value *PrivateLinkPrincipal) *PrivateLinkPrincipalsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PrivateLinkPrincipalsAddRequest) Send() (result *PrivateLinkPrincipalsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PrivateLinkPrincipalsAddRequest) SendContext(ctx context.Context) (result *PrivateLinkPrincipalsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writePrivateLinkPrincipalsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PrivateLinkPrincipalsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPrivateLinkPrincipalsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// PrivateLinkPrincipalsAddResponse is the response for the 'add' method. +type PrivateLinkPrincipalsAddResponse struct { + status int + header http.Header + err *errors.Error + body *PrivateLinkPrincipal +} + +// Status returns the response status code. +func (r *PrivateLinkPrincipalsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PrivateLinkPrincipalsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PrivateLinkPrincipalsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Properties of the principal. +func (r *PrivateLinkPrincipalsAddResponse) Body() *PrivateLinkPrincipal { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Properties of the principal. +func (r *PrivateLinkPrincipalsAddResponse) GetBody() (value *PrivateLinkPrincipal, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// PrivateLinkPrincipalsListRequest is the request for the 'list' method. +type PrivateLinkPrincipalsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *PrivateLinkPrincipalsListRequest) Parameter(name string, value interface{}) *PrivateLinkPrincipalsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *PrivateLinkPrincipalsListRequest) Header(name string, value interface{}) *PrivateLinkPrincipalsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *PrivateLinkPrincipalsListRequest) Impersonate(user string) *PrivateLinkPrincipalsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *PrivateLinkPrincipalsListRequest) Page(value int) *PrivateLinkPrincipalsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause +// of an SQL statement, but using the names of the attributes of the role binding +// instead of the names of the columns of a table. For example, in order to +// retrieve role bindings with role_id AuthenticatedUser: +// +// ```sql +// role_id = 'AuthenticatedUser' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// items that the user has permission to see will be returned. +func (r *PrivateLinkPrincipalsListRequest) Search(value string) *PrivateLinkPrincipalsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *PrivateLinkPrincipalsListRequest) Size(value int) *PrivateLinkPrincipalsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *PrivateLinkPrincipalsListRequest) Send() (result *PrivateLinkPrincipalsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *PrivateLinkPrincipalsListRequest) SendContext(ctx context.Context) (result *PrivateLinkPrincipalsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &PrivateLinkPrincipalsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readPrivateLinkPrincipalsListResponse(result, reader) + if err != nil { + return + } + return +} + +// PrivateLinkPrincipalsListResponse is the response for the 'list' method. +type PrivateLinkPrincipalsListResponse struct { + status int + header http.Header + err *errors.Error + items *PrivateLinkPrincipalList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *PrivateLinkPrincipalsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *PrivateLinkPrincipalsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *PrivateLinkPrincipalsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of principals. +func (r *PrivateLinkPrincipalsListResponse) Items() *PrivateLinkPrincipalList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of principals. +func (r *PrivateLinkPrincipalsListResponse) GetItems() (value *PrivateLinkPrincipalList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *PrivateLinkPrincipalsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *PrivateLinkPrincipalsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *PrivateLinkPrincipalsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *PrivateLinkPrincipalsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *PrivateLinkPrincipalsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *PrivateLinkPrincipalsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_list_builder.go b/clustersmgmt/v2alpha1/private_link_principals_list_builder.go new file mode 100644 index 00000000..7b8ddb7b --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkPrincipalsListBuilder contains the data and logic needed to build +// 'private_link_principals' objects. +type PrivateLinkPrincipalsListBuilder struct { + items []*PrivateLinkPrincipalsBuilder +} + +// NewPrivateLinkPrincipalsList creates a new builder of 'private_link_principals' objects. +func NewPrivateLinkPrincipalsList() *PrivateLinkPrincipalsListBuilder { + return new(PrivateLinkPrincipalsListBuilder) +} + +// Items sets the items of the list. +func (b *PrivateLinkPrincipalsListBuilder) Items(values ...*PrivateLinkPrincipalsBuilder) *PrivateLinkPrincipalsListBuilder { + b.items = make([]*PrivateLinkPrincipalsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *PrivateLinkPrincipalsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *PrivateLinkPrincipalsListBuilder) Copy(list *PrivateLinkPrincipalsList) *PrivateLinkPrincipalsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*PrivateLinkPrincipalsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewPrivateLinkPrincipals().Copy(v) + } + } + return b +} + +// Build creates a list of 'private_link_principals' objects using the +// configuration stored in the builder. +func (b *PrivateLinkPrincipalsListBuilder) Build() (list *PrivateLinkPrincipalsList, err error) { + items := make([]*PrivateLinkPrincipals, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(PrivateLinkPrincipalsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_list_type_json.go b/clustersmgmt/v2alpha1/private_link_principals_list_type_json.go new file mode 100644 index 00000000..a84c475c --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkPrincipalsList writes a list of values of the 'private_link_principals' type to +// the given writer. +func MarshalPrivateLinkPrincipalsList(list []*PrivateLinkPrincipals, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkPrincipalsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkPrincipalsList writes a list of value of the 'private_link_principals' type to +// the given stream. +func writePrivateLinkPrincipalsList(list []*PrivateLinkPrincipals, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writePrivateLinkPrincipals(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalPrivateLinkPrincipalsList reads a list of values of the 'private_link_principals' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalPrivateLinkPrincipalsList(source interface{}) (items []*PrivateLinkPrincipals, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readPrivateLinkPrincipalsList(iterator) + err = iterator.Error + return +} + +// readPrivateLinkPrincipalsList reads list of values of the ”private_link_principals' type from +// the given iterator. +func readPrivateLinkPrincipalsList(iterator *jsoniter.Iterator) []*PrivateLinkPrincipals { + list := []*PrivateLinkPrincipals{} + for iterator.ReadArray() { + item := readPrivateLinkPrincipals(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_resource_json.go b/clustersmgmt/v2alpha1/private_link_principals_resource_json.go new file mode 100644 index 00000000..4afaa1ef --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writePrivateLinkPrincipalsAddRequest(request *PrivateLinkPrincipalsAddRequest, writer io.Writer) error { + return MarshalPrivateLinkPrincipal(request.body, writer) +} +func readPrivateLinkPrincipalsAddResponse(response *PrivateLinkPrincipalsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalPrivateLinkPrincipal(reader) + return err +} +func writePrivateLinkPrincipalsListRequest(request *PrivateLinkPrincipalsListRequest, writer io.Writer) error { + return nil +} +func readPrivateLinkPrincipalsListResponse(response *PrivateLinkPrincipalsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readPrivateLinkPrincipalList(iterator) + response.items = &PrivateLinkPrincipalList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_type.go b/clustersmgmt/v2alpha1/private_link_principals_type.go new file mode 100644 index 00000000..27d0d648 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// PrivateLinkPrincipalsKind is the name of the type used to represent objects +// of type 'private_link_principals'. +const PrivateLinkPrincipalsKind = "PrivateLinkPrincipals" + +// PrivateLinkPrincipalsLinkKind is the name of the type used to represent links +// to objects of type 'private_link_principals'. +const PrivateLinkPrincipalsLinkKind = "PrivateLinkPrincipalsLink" + +// PrivateLinkPrincipalsNilKind is the name of the type used to nil references +// to objects of type 'private_link_principals'. +const PrivateLinkPrincipalsNilKind = "PrivateLinkPrincipalsNil" + +// PrivateLinkPrincipals represents the values of the 'private_link_principals' type. +// +// Contains a list of principals for the Private Link. +type PrivateLinkPrincipals struct { + bitmap_ uint32 + id string + href string + principals []*PrivateLinkPrincipal +} + +// Kind returns the name of the type of the object. +func (o *PrivateLinkPrincipals) Kind() string { + if o == nil { + return PrivateLinkPrincipalsNilKind + } + if o.bitmap_&1 != 0 { + return PrivateLinkPrincipalsLinkKind + } + return PrivateLinkPrincipalsKind +} + +// Link returns true iif this is a link. +func (o *PrivateLinkPrincipals) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *PrivateLinkPrincipals) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *PrivateLinkPrincipals) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *PrivateLinkPrincipals) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *PrivateLinkPrincipals) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *PrivateLinkPrincipals) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Principals returns the value of the 'principals' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of additional principals for the Private Link +func (o *PrivateLinkPrincipals) Principals() []*PrivateLinkPrincipal { + if o != nil && o.bitmap_&8 != 0 { + return o.principals + } + return nil +} + +// GetPrincipals returns the value of the 'principals' attribute and +// a flag indicating if the attribute has a value. +// +// List of additional principals for the Private Link +func (o *PrivateLinkPrincipals) GetPrincipals() (value []*PrivateLinkPrincipal, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.principals + } + return +} + +// PrivateLinkPrincipalsListKind is the name of the type used to represent list of objects of +// type 'private_link_principals'. +const PrivateLinkPrincipalsListKind = "PrivateLinkPrincipalsList" + +// PrivateLinkPrincipalsListLinkKind is the name of the type used to represent links to list +// of objects of type 'private_link_principals'. +const PrivateLinkPrincipalsListLinkKind = "PrivateLinkPrincipalsListLink" + +// PrivateLinkPrincipalsNilKind is the name of the type used to nil lists of objects of +// type 'private_link_principals'. +const PrivateLinkPrincipalsListNilKind = "PrivateLinkPrincipalsListNil" + +// PrivateLinkPrincipalsList is a list of values of the 'private_link_principals' type. +type PrivateLinkPrincipalsList struct { + href string + link bool + items []*PrivateLinkPrincipals +} + +// Kind returns the name of the type of the object. +func (l *PrivateLinkPrincipalsList) Kind() string { + if l == nil { + return PrivateLinkPrincipalsListNilKind + } + if l.link { + return PrivateLinkPrincipalsListLinkKind + } + return PrivateLinkPrincipalsListKind +} + +// Link returns true iif this is a link. +func (l *PrivateLinkPrincipalsList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *PrivateLinkPrincipalsList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *PrivateLinkPrincipalsList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *PrivateLinkPrincipalsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *PrivateLinkPrincipalsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *PrivateLinkPrincipalsList) Get(i int) *PrivateLinkPrincipals { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *PrivateLinkPrincipalsList) Slice() []*PrivateLinkPrincipals { + var slice []*PrivateLinkPrincipals + if l == nil { + slice = make([]*PrivateLinkPrincipals, 0) + } else { + slice = make([]*PrivateLinkPrincipals, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *PrivateLinkPrincipalsList) Each(f func(item *PrivateLinkPrincipals) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *PrivateLinkPrincipalsList) Range(f func(index int, item *PrivateLinkPrincipals) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/private_link_principals_type_json.go b/clustersmgmt/v2alpha1/private_link_principals_type_json.go new file mode 100644 index 00000000..f32c5ab3 --- /dev/null +++ b/clustersmgmt/v2alpha1/private_link_principals_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalPrivateLinkPrincipals writes a value of the 'private_link_principals' type to the given writer. +func MarshalPrivateLinkPrincipals(object *PrivateLinkPrincipals, writer io.Writer) error { + stream := helpers.NewStream(writer) + writePrivateLinkPrincipals(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writePrivateLinkPrincipals writes a value of the 'private_link_principals' type to the given stream. +func writePrivateLinkPrincipals(object *PrivateLinkPrincipals, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(PrivateLinkPrincipalsLinkKind) + } else { + stream.WriteString(PrivateLinkPrincipalsKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.principals != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("principals") + writePrivateLinkPrincipalList(object.principals, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalPrivateLinkPrincipals reads a value of the 'private_link_principals' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalPrivateLinkPrincipals(source interface{}) (object *PrivateLinkPrincipals, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readPrivateLinkPrincipals(iterator) + err = iterator.Error + return +} + +// readPrivateLinkPrincipals reads a value of the 'private_link_principals' type from the given iterator. +func readPrivateLinkPrincipals(iterator *jsoniter.Iterator) *PrivateLinkPrincipals { + object := &PrivateLinkPrincipals{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == PrivateLinkPrincipalsLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "principals": + value := readPrivateLinkPrincipalList(iterator) + object.principals = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/processor_type_list_type_json.go b/clustersmgmt/v2alpha1/processor_type_list_type_json.go new file mode 100644 index 00000000..d2c2ae5a --- /dev/null +++ b/clustersmgmt/v2alpha1/processor_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProcessorTypeList writes a list of values of the 'processor_type' type to +// the given writer. +func MarshalProcessorTypeList(list []ProcessorType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProcessorTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProcessorTypeList writes a list of value of the 'processor_type' type to +// the given stream. +func writeProcessorTypeList(list []ProcessorType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalProcessorTypeList reads a list of values of the 'processor_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProcessorTypeList(source interface{}) (items []ProcessorType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProcessorTypeList(iterator) + err = iterator.Error + return +} + +// readProcessorTypeList reads list of values of the ”processor_type' type from +// the given iterator. +func readProcessorTypeList(iterator *jsoniter.Iterator) []ProcessorType { + list := []ProcessorType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ProcessorType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/processor_type_type.go b/clustersmgmt/v2alpha1/processor_type_type.go new file mode 100644 index 00000000..b9cfb341 --- /dev/null +++ b/clustersmgmt/v2alpha1/processor_type_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProcessorType represents the values of the 'processor_type' enumerated type. +type ProcessorType string + +const ( + // Amd64 + ProcessorTypeAMD64 ProcessorType = "amd64" + // Arm64 + ProcessorTypeARM64 ProcessorType = "arm64" +) diff --git a/clustersmgmt/v2alpha1/product_builder.go b/clustersmgmt/v2alpha1/product_builder.go new file mode 100644 index 00000000..8fb659dd --- /dev/null +++ b/clustersmgmt/v2alpha1/product_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProductBuilder contains the data and logic needed to build 'product' objects. +// +// Representation of an product that can be selected as a cluster type. +type ProductBuilder struct { + bitmap_ uint32 + id string + href string + name string +} + +// NewProduct creates a new builder of 'product' objects. +func NewProduct() *ProductBuilder { + return &ProductBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ProductBuilder) Link(value bool) *ProductBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ProductBuilder) ID(value string) *ProductBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ProductBuilder) HREF(value string) *ProductBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ProductBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *ProductBuilder) Name(value string) *ProductBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ProductBuilder) Copy(object *Product) *ProductBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.name = object.name + return b +} + +// Build creates a 'product' object using the configuration stored in the builder. +func (b *ProductBuilder) Build() (object *Product, err error) { + object = new(Product) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.name = b.name + return +} diff --git a/clustersmgmt/v2alpha1/product_client.go b/clustersmgmt/v2alpha1/product_client.go new file mode 100644 index 00000000..55caa353 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_client.go @@ -0,0 +1,324 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProductClient is the client of the 'product' resource. +// +// Manages a specific product. +type ProductClient struct { + transport http.RoundTripper + path string +} + +// NewProductClient creates a new client for the 'product' +// resource using the given transport to send the requests and receive the +// responses. +func NewProductClient(transport http.RoundTripper, path string) *ProductClient { + return &ProductClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the product. +func (c *ProductClient) Get() *ProductGetRequest { + return &ProductGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// MinimalVersions returns the target 'product_minimal_versions' resource. +func (c *ProductClient) MinimalVersions() *ProductMinimalVersionsClient { + return NewProductMinimalVersionsClient( + c.transport, + path.Join(c.path, "minimal_versions"), + ) +} + +// TechnologyPreviews returns the target 'product_technology_previews' resource. +func (c *ProductClient) TechnologyPreviews() *ProductTechnologyPreviewsClient { + return NewProductTechnologyPreviewsClient( + c.transport, + path.Join(c.path, "technology_previews"), + ) +} + +// ProductPollRequest is the request for the Poll method. +type ProductPollRequest struct { + request *ProductGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ProductPollRequest) Parameter(name string, value interface{}) *ProductPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ProductPollRequest) Header(name string, value interface{}) *ProductPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ProductPollRequest) Interval(value time.Duration) *ProductPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ProductPollRequest) Status(value int) *ProductPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ProductPollRequest) Predicate(value func(*ProductGetResponse) bool) *ProductPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ProductGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ProductPollRequest) StartContext(ctx context.Context) (response *ProductPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ProductPollResponse{ + response: result.(*ProductGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ProductPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ProductPollResponse is the response for the Poll method. +type ProductPollResponse struct { + response *ProductGetResponse +} + +// Status returns the response status code. +func (r *ProductPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ProductPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ProductPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ProductPollResponse) Body() *Product { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProductPollResponse) GetBody() (value *Product, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ProductClient) Poll() *ProductPollRequest { + return &ProductPollRequest{ + request: c.Get(), + } +} + +// ProductGetRequest is the request for the 'get' method. +type ProductGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ProductGetRequest) Parameter(name string, value interface{}) *ProductGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProductGetRequest) Header(name string, value interface{}) *ProductGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProductGetRequest) Impersonate(user string) *ProductGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProductGetRequest) Send() (result *ProductGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProductGetRequest) SendContext(ctx context.Context) (result *ProductGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProductGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProductGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ProductGetResponse is the response for the 'get' method. +type ProductGetResponse struct { + status int + header http.Header + err *errors.Error + body *Product +} + +// Status returns the response status code. +func (r *ProductGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProductGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProductGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ProductGetResponse) Body() *Product { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProductGetResponse) GetBody() (value *Product, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/product_list_builder.go b/clustersmgmt/v2alpha1/product_list_builder.go new file mode 100644 index 00000000..063eef21 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProductListBuilder contains the data and logic needed to build +// 'product' objects. +type ProductListBuilder struct { + items []*ProductBuilder +} + +// NewProductList creates a new builder of 'product' objects. +func NewProductList() *ProductListBuilder { + return new(ProductListBuilder) +} + +// Items sets the items of the list. +func (b *ProductListBuilder) Items(values ...*ProductBuilder) *ProductListBuilder { + b.items = make([]*ProductBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ProductListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ProductListBuilder) Copy(list *ProductList) *ProductListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ProductBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewProduct().Copy(v) + } + } + return b +} + +// Build creates a list of 'product' objects using the +// configuration stored in the builder. +func (b *ProductListBuilder) Build() (list *ProductList, err error) { + items := make([]*Product, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ProductList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/product_list_type_json.go b/clustersmgmt/v2alpha1/product_list_type_json.go new file mode 100644 index 00000000..8e4b7668 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProductList writes a list of values of the 'product' type to +// the given writer. +func MarshalProductList(list []*Product, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProductList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProductList writes a list of value of the 'product' type to +// the given stream. +func writeProductList(list []*Product, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeProduct(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalProductList reads a list of values of the 'product' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProductList(source interface{}) (items []*Product, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProductList(iterator) + err = iterator.Error + return +} + +// readProductList reads list of values of the ”product' type from +// the given iterator. +func readProductList(iterator *jsoniter.Iterator) []*Product { + list := []*Product{} + for iterator.ReadArray() { + item := readProduct(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_builder.go b/clustersmgmt/v2alpha1/product_minimal_version_builder.go new file mode 100644 index 00000000..94f13ee7 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_builder.go @@ -0,0 +1,103 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ProductMinimalVersionBuilder contains the data and logic needed to build 'product_minimal_version' objects. +// +// Representation of a product minimal version. +type ProductMinimalVersionBuilder struct { + bitmap_ uint32 + id string + href string + rosaCli string + startDate time.Time +} + +// NewProductMinimalVersion creates a new builder of 'product_minimal_version' objects. +func NewProductMinimalVersion() *ProductMinimalVersionBuilder { + return &ProductMinimalVersionBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ProductMinimalVersionBuilder) Link(value bool) *ProductMinimalVersionBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ProductMinimalVersionBuilder) ID(value string) *ProductMinimalVersionBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ProductMinimalVersionBuilder) HREF(value string) *ProductMinimalVersionBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ProductMinimalVersionBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// RosaCli sets the value of the 'rosa_cli' attribute to the given value. +func (b *ProductMinimalVersionBuilder) RosaCli(value string) *ProductMinimalVersionBuilder { + b.rosaCli = value + b.bitmap_ |= 8 + return b +} + +// StartDate sets the value of the 'start_date' attribute to the given value. +func (b *ProductMinimalVersionBuilder) StartDate(value time.Time) *ProductMinimalVersionBuilder { + b.startDate = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ProductMinimalVersionBuilder) Copy(object *ProductMinimalVersion) *ProductMinimalVersionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.rosaCli = object.rosaCli + b.startDate = object.startDate + return b +} + +// Build creates a 'product_minimal_version' object using the configuration stored in the builder. +func (b *ProductMinimalVersionBuilder) Build() (object *ProductMinimalVersion, err error) { + object = new(ProductMinimalVersion) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.rosaCli = b.rosaCli + object.startDate = b.startDate + return +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_client.go b/clustersmgmt/v2alpha1/product_minimal_version_client.go new file mode 100644 index 00000000..bc66b1a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProductMinimalVersionClient is the client of the 'product_minimal_version' resource. +// +// Manages a specific product minimal version. +type ProductMinimalVersionClient struct { + transport http.RoundTripper + path string +} + +// NewProductMinimalVersionClient creates a new client for the 'product_minimal_version' +// resource using the given transport to send the requests and receive the +// responses. +func NewProductMinimalVersionClient(transport http.RoundTripper, path string) *ProductMinimalVersionClient { + return &ProductMinimalVersionClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the product minimal version. +func (c *ProductMinimalVersionClient) Get() *ProductMinimalVersionGetRequest { + return &ProductMinimalVersionGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// ProductMinimalVersionPollRequest is the request for the Poll method. +type ProductMinimalVersionPollRequest struct { + request *ProductMinimalVersionGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ProductMinimalVersionPollRequest) Parameter(name string, value interface{}) *ProductMinimalVersionPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ProductMinimalVersionPollRequest) Header(name string, value interface{}) *ProductMinimalVersionPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ProductMinimalVersionPollRequest) Interval(value time.Duration) *ProductMinimalVersionPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ProductMinimalVersionPollRequest) Status(value int) *ProductMinimalVersionPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ProductMinimalVersionPollRequest) Predicate(value func(*ProductMinimalVersionGetResponse) bool) *ProductMinimalVersionPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ProductMinimalVersionGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ProductMinimalVersionPollRequest) StartContext(ctx context.Context) (response *ProductMinimalVersionPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ProductMinimalVersionPollResponse{ + response: result.(*ProductMinimalVersionGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ProductMinimalVersionPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ProductMinimalVersionPollResponse is the response for the Poll method. +type ProductMinimalVersionPollResponse struct { + response *ProductMinimalVersionGetResponse +} + +// Status returns the response status code. +func (r *ProductMinimalVersionPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ProductMinimalVersionPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ProductMinimalVersionPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ProductMinimalVersionPollResponse) Body() *ProductMinimalVersion { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProductMinimalVersionPollResponse) GetBody() (value *ProductMinimalVersion, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ProductMinimalVersionClient) Poll() *ProductMinimalVersionPollRequest { + return &ProductMinimalVersionPollRequest{ + request: c.Get(), + } +} + +// ProductMinimalVersionGetRequest is the request for the 'get' method. +type ProductMinimalVersionGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ProductMinimalVersionGetRequest) Parameter(name string, value interface{}) *ProductMinimalVersionGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProductMinimalVersionGetRequest) Header(name string, value interface{}) *ProductMinimalVersionGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProductMinimalVersionGetRequest) Impersonate(user string) *ProductMinimalVersionGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProductMinimalVersionGetRequest) Send() (result *ProductMinimalVersionGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProductMinimalVersionGetRequest) SendContext(ctx context.Context) (result *ProductMinimalVersionGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProductMinimalVersionGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProductMinimalVersionGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ProductMinimalVersionGetResponse is the response for the 'get' method. +type ProductMinimalVersionGetResponse struct { + status int + header http.Header + err *errors.Error + body *ProductMinimalVersion +} + +// Status returns the response status code. +func (r *ProductMinimalVersionGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProductMinimalVersionGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProductMinimalVersionGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ProductMinimalVersionGetResponse) Body() *ProductMinimalVersion { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProductMinimalVersionGetResponse) GetBody() (value *ProductMinimalVersion, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_list_builder.go b/clustersmgmt/v2alpha1/product_minimal_version_list_builder.go new file mode 100644 index 00000000..10db1821 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProductMinimalVersionListBuilder contains the data and logic needed to build +// 'product_minimal_version' objects. +type ProductMinimalVersionListBuilder struct { + items []*ProductMinimalVersionBuilder +} + +// NewProductMinimalVersionList creates a new builder of 'product_minimal_version' objects. +func NewProductMinimalVersionList() *ProductMinimalVersionListBuilder { + return new(ProductMinimalVersionListBuilder) +} + +// Items sets the items of the list. +func (b *ProductMinimalVersionListBuilder) Items(values ...*ProductMinimalVersionBuilder) *ProductMinimalVersionListBuilder { + b.items = make([]*ProductMinimalVersionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ProductMinimalVersionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ProductMinimalVersionListBuilder) Copy(list *ProductMinimalVersionList) *ProductMinimalVersionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ProductMinimalVersionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewProductMinimalVersion().Copy(v) + } + } + return b +} + +// Build creates a list of 'product_minimal_version' objects using the +// configuration stored in the builder. +func (b *ProductMinimalVersionListBuilder) Build() (list *ProductMinimalVersionList, err error) { + items := make([]*ProductMinimalVersion, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ProductMinimalVersionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_list_type_json.go b/clustersmgmt/v2alpha1/product_minimal_version_list_type_json.go new file mode 100644 index 00000000..a78aef63 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProductMinimalVersionList writes a list of values of the 'product_minimal_version' type to +// the given writer. +func MarshalProductMinimalVersionList(list []*ProductMinimalVersion, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProductMinimalVersionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProductMinimalVersionList writes a list of value of the 'product_minimal_version' type to +// the given stream. +func writeProductMinimalVersionList(list []*ProductMinimalVersion, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeProductMinimalVersion(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalProductMinimalVersionList reads a list of values of the 'product_minimal_version' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProductMinimalVersionList(source interface{}) (items []*ProductMinimalVersion, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProductMinimalVersionList(iterator) + err = iterator.Error + return +} + +// readProductMinimalVersionList reads list of values of the ”product_minimal_version' type from +// the given iterator. +func readProductMinimalVersionList(iterator *jsoniter.Iterator) []*ProductMinimalVersion { + list := []*ProductMinimalVersion{} + for iterator.ReadArray() { + item := readProductMinimalVersion(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_resource_json.go b/clustersmgmt/v2alpha1/product_minimal_version_resource_json.go new file mode 100644 index 00000000..96100ed6 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeProductMinimalVersionGetRequest(request *ProductMinimalVersionGetRequest, writer io.Writer) error { + return nil +} +func readProductMinimalVersionGetResponse(response *ProductMinimalVersionGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalProductMinimalVersion(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_type.go b/clustersmgmt/v2alpha1/product_minimal_version_type.go new file mode 100644 index 00000000..39bd5b31 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_type.go @@ -0,0 +1,270 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ProductMinimalVersionKind is the name of the type used to represent objects +// of type 'product_minimal_version'. +const ProductMinimalVersionKind = "ProductMinimalVersion" + +// ProductMinimalVersionLinkKind is the name of the type used to represent links +// to objects of type 'product_minimal_version'. +const ProductMinimalVersionLinkKind = "ProductMinimalVersionLink" + +// ProductMinimalVersionNilKind is the name of the type used to nil references +// to objects of type 'product_minimal_version'. +const ProductMinimalVersionNilKind = "ProductMinimalVersionNil" + +// ProductMinimalVersion represents the values of the 'product_minimal_version' type. +// +// Representation of a product minimal version. +type ProductMinimalVersion struct { + bitmap_ uint32 + id string + href string + rosaCli string + startDate time.Time +} + +// Kind returns the name of the type of the object. +func (o *ProductMinimalVersion) Kind() string { + if o == nil { + return ProductMinimalVersionNilKind + } + if o.bitmap_&1 != 0 { + return ProductMinimalVersionLinkKind + } + return ProductMinimalVersionKind +} + +// Link returns true iif this is a link. +func (o *ProductMinimalVersion) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ProductMinimalVersion) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ProductMinimalVersion) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ProductMinimalVersion) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ProductMinimalVersion) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ProductMinimalVersion) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// RosaCli returns the value of the 'rosa_cli' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The ROSA CLI minimal version. +func (o *ProductMinimalVersion) RosaCli() string { + if o != nil && o.bitmap_&8 != 0 { + return o.rosaCli + } + return "" +} + +// GetRosaCli returns the value of the 'rosa_cli' attribute and +// a flag indicating if the attribute has a value. +// +// The ROSA CLI minimal version. +func (o *ProductMinimalVersion) GetRosaCli() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.rosaCli + } + return +} + +// StartDate returns the value of the 'start_date' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The start date for this minimal version. +func (o *ProductMinimalVersion) StartDate() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.startDate + } + return time.Time{} +} + +// GetStartDate returns the value of the 'start_date' attribute and +// a flag indicating if the attribute has a value. +// +// The start date for this minimal version. +func (o *ProductMinimalVersion) GetStartDate() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.startDate + } + return +} + +// ProductMinimalVersionListKind is the name of the type used to represent list of objects of +// type 'product_minimal_version'. +const ProductMinimalVersionListKind = "ProductMinimalVersionList" + +// ProductMinimalVersionListLinkKind is the name of the type used to represent links to list +// of objects of type 'product_minimal_version'. +const ProductMinimalVersionListLinkKind = "ProductMinimalVersionListLink" + +// ProductMinimalVersionNilKind is the name of the type used to nil lists of objects of +// type 'product_minimal_version'. +const ProductMinimalVersionListNilKind = "ProductMinimalVersionListNil" + +// ProductMinimalVersionList is a list of values of the 'product_minimal_version' type. +type ProductMinimalVersionList struct { + href string + link bool + items []*ProductMinimalVersion +} + +// Kind returns the name of the type of the object. +func (l *ProductMinimalVersionList) Kind() string { + if l == nil { + return ProductMinimalVersionListNilKind + } + if l.link { + return ProductMinimalVersionListLinkKind + } + return ProductMinimalVersionListKind +} + +// Link returns true iif this is a link. +func (l *ProductMinimalVersionList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ProductMinimalVersionList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ProductMinimalVersionList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ProductMinimalVersionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ProductMinimalVersionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ProductMinimalVersionList) Get(i int) *ProductMinimalVersion { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ProductMinimalVersionList) Slice() []*ProductMinimalVersion { + var slice []*ProductMinimalVersion + if l == nil { + slice = make([]*ProductMinimalVersion, 0) + } else { + slice = make([]*ProductMinimalVersion, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ProductMinimalVersionList) Each(f func(item *ProductMinimalVersion) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ProductMinimalVersionList) Range(f func(index int, item *ProductMinimalVersion) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/product_minimal_version_type_json.go b/clustersmgmt/v2alpha1/product_minimal_version_type_json.go new file mode 100644 index 00000000..121d16a1 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_version_type_json.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProductMinimalVersion writes a value of the 'product_minimal_version' type to the given writer. +func MarshalProductMinimalVersion(object *ProductMinimalVersion, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProductMinimalVersion(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProductMinimalVersion writes a value of the 'product_minimal_version' type to the given stream. +func writeProductMinimalVersion(object *ProductMinimalVersion, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ProductMinimalVersionLinkKind) + } else { + stream.WriteString(ProductMinimalVersionKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("rosa_cli") + stream.WriteString(object.rosaCli) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("start_date") + stream.WriteString((object.startDate).Format(time.RFC3339)) + } + stream.WriteObjectEnd() +} + +// UnmarshalProductMinimalVersion reads a value of the 'product_minimal_version' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalProductMinimalVersion(source interface{}) (object *ProductMinimalVersion, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readProductMinimalVersion(iterator) + err = iterator.Error + return +} + +// readProductMinimalVersion reads a value of the 'product_minimal_version' type from the given iterator. +func readProductMinimalVersion(iterator *jsoniter.Iterator) *ProductMinimalVersion { + object := &ProductMinimalVersion{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ProductMinimalVersionLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "rosa_cli": + value := iterator.ReadString() + object.rosaCli = value + object.bitmap_ |= 8 + case "start_date": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.startDate = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/product_minimal_versions_client.go b/clustersmgmt/v2alpha1/product_minimal_versions_client.go new file mode 100644 index 00000000..038eed72 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_versions_client.go @@ -0,0 +1,347 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProductMinimalVersionsClient is the client of the 'product_minimal_versions' resource. +// +// Manages the collection of product minimal versions. +type ProductMinimalVersionsClient struct { + transport http.RoundTripper + path string +} + +// NewProductMinimalVersionsClient creates a new client for the 'product_minimal_versions' +// resource using the given transport to send the requests and receive the +// responses. +func NewProductMinimalVersionsClient(transport http.RoundTripper, path string) *ProductMinimalVersionsClient { + return &ProductMinimalVersionsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of product minimal versions. +func (c *ProductMinimalVersionsClient) List() *ProductMinimalVersionsListRequest { + return &ProductMinimalVersionsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// MinimalVersion returns the target 'product_minimal_version' resource for the given identifier. +// +// Returns a reference to the service that manages a specific product product minimal version. +func (c *ProductMinimalVersionsClient) MinimalVersion(id string) *ProductMinimalVersionClient { + return NewProductMinimalVersionClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ProductMinimalVersionsListRequest is the request for the 'list' method. +type ProductMinimalVersionsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *ProductMinimalVersionsListRequest) Parameter(name string, value interface{}) *ProductMinimalVersionsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProductMinimalVersionsListRequest) Header(name string, value interface{}) *ProductMinimalVersionsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProductMinimalVersionsListRequest) Impersonate(user string) *ProductMinimalVersionsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the product instead of +// the names of the columns of a table. For example, in order to sort the products +// descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *ProductMinimalVersionsListRequest) Order(value string) *ProductMinimalVersionsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductMinimalVersionsListRequest) Page(value int) *ProductMinimalVersionsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the product instead of +// the names of the columns of a table. For example, in order to retrieve all the +// products with a name starting with `my` the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the products +// that the user has permission to see will be returned. +func (r *ProductMinimalVersionsListRequest) Search(value string) *ProductMinimalVersionsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductMinimalVersionsListRequest) Size(value int) *ProductMinimalVersionsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProductMinimalVersionsListRequest) Send() (result *ProductMinimalVersionsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProductMinimalVersionsListRequest) SendContext(ctx context.Context) (result *ProductMinimalVersionsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProductMinimalVersionsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProductMinimalVersionsListResponse(result, reader) + if err != nil { + return + } + return +} + +// ProductMinimalVersionsListResponse is the response for the 'list' method. +type ProductMinimalVersionsListResponse struct { + status int + header http.Header + err *errors.Error + items *ProductMinimalVersionList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ProductMinimalVersionsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProductMinimalVersionsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProductMinimalVersionsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of product minimal versions. +func (r *ProductMinimalVersionsListResponse) Items() *ProductMinimalVersionList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of product minimal versions. +func (r *ProductMinimalVersionsListResponse) GetItems() (value *ProductMinimalVersionList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductMinimalVersionsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductMinimalVersionsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductMinimalVersionsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductMinimalVersionsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ProductMinimalVersionsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ProductMinimalVersionsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/product_minimal_versions_resource_json.go b/clustersmgmt/v2alpha1/product_minimal_versions_resource_json.go new file mode 100644 index 00000000..a1a96de4 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_minimal_versions_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeProductMinimalVersionsListRequest(request *ProductMinimalVersionsListRequest, writer io.Writer) error { + return nil +} +func readProductMinimalVersionsListResponse(response *ProductMinimalVersionsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readProductMinimalVersionList(iterator) + response.items = &ProductMinimalVersionList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/product_resource_json.go b/clustersmgmt/v2alpha1/product_resource_json.go new file mode 100644 index 00000000..a28161fc --- /dev/null +++ b/clustersmgmt/v2alpha1/product_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeProductGetRequest(request *ProductGetRequest, writer io.Writer) error { + return nil +} +func readProductGetResponse(response *ProductGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalProduct(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_builder.go b/clustersmgmt/v2alpha1/product_technology_preview_builder.go new file mode 100644 index 00000000..b12135bb --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_builder.go @@ -0,0 +1,113 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ProductTechnologyPreviewBuilder contains the data and logic needed to build 'product_technology_preview' objects. +// +// Representation of a product technology preview. +type ProductTechnologyPreviewBuilder struct { + bitmap_ uint32 + id string + href string + additionalText string + endDate time.Time + startDate time.Time +} + +// NewProductTechnologyPreview creates a new builder of 'product_technology_preview' objects. +func NewProductTechnologyPreview() *ProductTechnologyPreviewBuilder { + return &ProductTechnologyPreviewBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ProductTechnologyPreviewBuilder) Link(value bool) *ProductTechnologyPreviewBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ProductTechnologyPreviewBuilder) ID(value string) *ProductTechnologyPreviewBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ProductTechnologyPreviewBuilder) HREF(value string) *ProductTechnologyPreviewBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ProductTechnologyPreviewBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AdditionalText sets the value of the 'additional_text' attribute to the given value. +func (b *ProductTechnologyPreviewBuilder) AdditionalText(value string) *ProductTechnologyPreviewBuilder { + b.additionalText = value + b.bitmap_ |= 8 + return b +} + +// EndDate sets the value of the 'end_date' attribute to the given value. +func (b *ProductTechnologyPreviewBuilder) EndDate(value time.Time) *ProductTechnologyPreviewBuilder { + b.endDate = value + b.bitmap_ |= 16 + return b +} + +// StartDate sets the value of the 'start_date' attribute to the given value. +func (b *ProductTechnologyPreviewBuilder) StartDate(value time.Time) *ProductTechnologyPreviewBuilder { + b.startDate = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ProductTechnologyPreviewBuilder) Copy(object *ProductTechnologyPreview) *ProductTechnologyPreviewBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.additionalText = object.additionalText + b.endDate = object.endDate + b.startDate = object.startDate + return b +} + +// Build creates a 'product_technology_preview' object using the configuration stored in the builder. +func (b *ProductTechnologyPreviewBuilder) Build() (object *ProductTechnologyPreview, err error) { + object = new(ProductTechnologyPreview) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.additionalText = b.additionalText + object.endDate = b.endDate + object.startDate = b.startDate + return +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_client.go b/clustersmgmt/v2alpha1/product_technology_preview_client.go new file mode 100644 index 00000000..a0abe1fa --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProductTechnologyPreviewClient is the client of the 'product_technology_preview' resource. +// +// Manages a specific product technology preview. +type ProductTechnologyPreviewClient struct { + transport http.RoundTripper + path string +} + +// NewProductTechnologyPreviewClient creates a new client for the 'product_technology_preview' +// resource using the given transport to send the requests and receive the +// responses. +func NewProductTechnologyPreviewClient(transport http.RoundTripper, path string) *ProductTechnologyPreviewClient { + return &ProductTechnologyPreviewClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the product technology preview. +func (c *ProductTechnologyPreviewClient) Get() *ProductTechnologyPreviewGetRequest { + return &ProductTechnologyPreviewGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// ProductTechnologyPreviewPollRequest is the request for the Poll method. +type ProductTechnologyPreviewPollRequest struct { + request *ProductTechnologyPreviewGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ProductTechnologyPreviewPollRequest) Parameter(name string, value interface{}) *ProductTechnologyPreviewPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ProductTechnologyPreviewPollRequest) Header(name string, value interface{}) *ProductTechnologyPreviewPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ProductTechnologyPreviewPollRequest) Interval(value time.Duration) *ProductTechnologyPreviewPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ProductTechnologyPreviewPollRequest) Status(value int) *ProductTechnologyPreviewPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ProductTechnologyPreviewPollRequest) Predicate(value func(*ProductTechnologyPreviewGetResponse) bool) *ProductTechnologyPreviewPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ProductTechnologyPreviewGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ProductTechnologyPreviewPollRequest) StartContext(ctx context.Context) (response *ProductTechnologyPreviewPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ProductTechnologyPreviewPollResponse{ + response: result.(*ProductTechnologyPreviewGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ProductTechnologyPreviewPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ProductTechnologyPreviewPollResponse is the response for the Poll method. +type ProductTechnologyPreviewPollResponse struct { + response *ProductTechnologyPreviewGetResponse +} + +// Status returns the response status code. +func (r *ProductTechnologyPreviewPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ProductTechnologyPreviewPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ProductTechnologyPreviewPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ProductTechnologyPreviewPollResponse) Body() *ProductTechnologyPreview { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProductTechnologyPreviewPollResponse) GetBody() (value *ProductTechnologyPreview, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ProductTechnologyPreviewClient) Poll() *ProductTechnologyPreviewPollRequest { + return &ProductTechnologyPreviewPollRequest{ + request: c.Get(), + } +} + +// ProductTechnologyPreviewGetRequest is the request for the 'get' method. +type ProductTechnologyPreviewGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ProductTechnologyPreviewGetRequest) Parameter(name string, value interface{}) *ProductTechnologyPreviewGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProductTechnologyPreviewGetRequest) Header(name string, value interface{}) *ProductTechnologyPreviewGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProductTechnologyPreviewGetRequest) Impersonate(user string) *ProductTechnologyPreviewGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProductTechnologyPreviewGetRequest) Send() (result *ProductTechnologyPreviewGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProductTechnologyPreviewGetRequest) SendContext(ctx context.Context) (result *ProductTechnologyPreviewGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProductTechnologyPreviewGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProductTechnologyPreviewGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ProductTechnologyPreviewGetResponse is the response for the 'get' method. +type ProductTechnologyPreviewGetResponse struct { + status int + header http.Header + err *errors.Error + body *ProductTechnologyPreview +} + +// Status returns the response status code. +func (r *ProductTechnologyPreviewGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProductTechnologyPreviewGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProductTechnologyPreviewGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ProductTechnologyPreviewGetResponse) Body() *ProductTechnologyPreview { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProductTechnologyPreviewGetResponse) GetBody() (value *ProductTechnologyPreview, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_list_builder.go b/clustersmgmt/v2alpha1/product_technology_preview_list_builder.go new file mode 100644 index 00000000..1feb1ced --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProductTechnologyPreviewListBuilder contains the data and logic needed to build +// 'product_technology_preview' objects. +type ProductTechnologyPreviewListBuilder struct { + items []*ProductTechnologyPreviewBuilder +} + +// NewProductTechnologyPreviewList creates a new builder of 'product_technology_preview' objects. +func NewProductTechnologyPreviewList() *ProductTechnologyPreviewListBuilder { + return new(ProductTechnologyPreviewListBuilder) +} + +// Items sets the items of the list. +func (b *ProductTechnologyPreviewListBuilder) Items(values ...*ProductTechnologyPreviewBuilder) *ProductTechnologyPreviewListBuilder { + b.items = make([]*ProductTechnologyPreviewBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ProductTechnologyPreviewListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ProductTechnologyPreviewListBuilder) Copy(list *ProductTechnologyPreviewList) *ProductTechnologyPreviewListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ProductTechnologyPreviewBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewProductTechnologyPreview().Copy(v) + } + } + return b +} + +// Build creates a list of 'product_technology_preview' objects using the +// configuration stored in the builder. +func (b *ProductTechnologyPreviewListBuilder) Build() (list *ProductTechnologyPreviewList, err error) { + items := make([]*ProductTechnologyPreview, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ProductTechnologyPreviewList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_list_type_json.go b/clustersmgmt/v2alpha1/product_technology_preview_list_type_json.go new file mode 100644 index 00000000..bad09dce --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProductTechnologyPreviewList writes a list of values of the 'product_technology_preview' type to +// the given writer. +func MarshalProductTechnologyPreviewList(list []*ProductTechnologyPreview, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProductTechnologyPreviewList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProductTechnologyPreviewList writes a list of value of the 'product_technology_preview' type to +// the given stream. +func writeProductTechnologyPreviewList(list []*ProductTechnologyPreview, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeProductTechnologyPreview(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalProductTechnologyPreviewList reads a list of values of the 'product_technology_preview' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProductTechnologyPreviewList(source interface{}) (items []*ProductTechnologyPreview, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProductTechnologyPreviewList(iterator) + err = iterator.Error + return +} + +// readProductTechnologyPreviewList reads list of values of the ”product_technology_preview' type from +// the given iterator. +func readProductTechnologyPreviewList(iterator *jsoniter.Iterator) []*ProductTechnologyPreview { + list := []*ProductTechnologyPreview{} + for iterator.ReadArray() { + item := readProductTechnologyPreview(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_resource_json.go b/clustersmgmt/v2alpha1/product_technology_preview_resource_json.go new file mode 100644 index 00000000..8f3c72c4 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeProductTechnologyPreviewGetRequest(request *ProductTechnologyPreviewGetRequest, writer io.Writer) error { + return nil +} +func readProductTechnologyPreviewGetResponse(response *ProductTechnologyPreviewGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalProductTechnologyPreview(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_type.go b/clustersmgmt/v2alpha1/product_technology_preview_type.go new file mode 100644 index 00000000..90c128ad --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_type.go @@ -0,0 +1,294 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ProductTechnologyPreviewKind is the name of the type used to represent objects +// of type 'product_technology_preview'. +const ProductTechnologyPreviewKind = "ProductTechnologyPreview" + +// ProductTechnologyPreviewLinkKind is the name of the type used to represent links +// to objects of type 'product_technology_preview'. +const ProductTechnologyPreviewLinkKind = "ProductTechnologyPreviewLink" + +// ProductTechnologyPreviewNilKind is the name of the type used to nil references +// to objects of type 'product_technology_preview'. +const ProductTechnologyPreviewNilKind = "ProductTechnologyPreviewNil" + +// ProductTechnologyPreview represents the values of the 'product_technology_preview' type. +// +// Representation of a product technology preview. +type ProductTechnologyPreview struct { + bitmap_ uint32 + id string + href string + additionalText string + endDate time.Time + startDate time.Time +} + +// Kind returns the name of the type of the object. +func (o *ProductTechnologyPreview) Kind() string { + if o == nil { + return ProductTechnologyPreviewNilKind + } + if o.bitmap_&1 != 0 { + return ProductTechnologyPreviewLinkKind + } + return ProductTechnologyPreviewKind +} + +// Link returns true iif this is a link. +func (o *ProductTechnologyPreview) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ProductTechnologyPreview) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ProductTechnologyPreview) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ProductTechnologyPreview) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ProductTechnologyPreview) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ProductTechnologyPreview) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AdditionalText returns the value of the 'additional_text' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Message associated with this technology preview. +func (o *ProductTechnologyPreview) AdditionalText() string { + if o != nil && o.bitmap_&8 != 0 { + return o.additionalText + } + return "" +} + +// GetAdditionalText returns the value of the 'additional_text' attribute and +// a flag indicating if the attribute has a value. +// +// Message associated with this technology preview. +func (o *ProductTechnologyPreview) GetAdditionalText() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.additionalText + } + return +} + +// EndDate returns the value of the 'end_date' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The end date for this technology preview. +func (o *ProductTechnologyPreview) EndDate() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.endDate + } + return time.Time{} +} + +// GetEndDate returns the value of the 'end_date' attribute and +// a flag indicating if the attribute has a value. +// +// The end date for this technology preview. +func (o *ProductTechnologyPreview) GetEndDate() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.endDate + } + return +} + +// StartDate returns the value of the 'start_date' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The start date for this technology preview. +func (o *ProductTechnologyPreview) StartDate() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.startDate + } + return time.Time{} +} + +// GetStartDate returns the value of the 'start_date' attribute and +// a flag indicating if the attribute has a value. +// +// The start date for this technology preview. +func (o *ProductTechnologyPreview) GetStartDate() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.startDate + } + return +} + +// ProductTechnologyPreviewListKind is the name of the type used to represent list of objects of +// type 'product_technology_preview'. +const ProductTechnologyPreviewListKind = "ProductTechnologyPreviewList" + +// ProductTechnologyPreviewListLinkKind is the name of the type used to represent links to list +// of objects of type 'product_technology_preview'. +const ProductTechnologyPreviewListLinkKind = "ProductTechnologyPreviewListLink" + +// ProductTechnologyPreviewNilKind is the name of the type used to nil lists of objects of +// type 'product_technology_preview'. +const ProductTechnologyPreviewListNilKind = "ProductTechnologyPreviewListNil" + +// ProductTechnologyPreviewList is a list of values of the 'product_technology_preview' type. +type ProductTechnologyPreviewList struct { + href string + link bool + items []*ProductTechnologyPreview +} + +// Kind returns the name of the type of the object. +func (l *ProductTechnologyPreviewList) Kind() string { + if l == nil { + return ProductTechnologyPreviewListNilKind + } + if l.link { + return ProductTechnologyPreviewListLinkKind + } + return ProductTechnologyPreviewListKind +} + +// Link returns true iif this is a link. +func (l *ProductTechnologyPreviewList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ProductTechnologyPreviewList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ProductTechnologyPreviewList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ProductTechnologyPreviewList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ProductTechnologyPreviewList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ProductTechnologyPreviewList) Get(i int) *ProductTechnologyPreview { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ProductTechnologyPreviewList) Slice() []*ProductTechnologyPreview { + var slice []*ProductTechnologyPreview + if l == nil { + slice = make([]*ProductTechnologyPreview, 0) + } else { + slice = make([]*ProductTechnologyPreview, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ProductTechnologyPreviewList) Each(f func(item *ProductTechnologyPreview) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ProductTechnologyPreviewList) Range(f func(index int, item *ProductTechnologyPreview) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/product_technology_preview_type_json.go b/clustersmgmt/v2alpha1/product_technology_preview_type_json.go new file mode 100644 index 00000000..ced0174d --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_preview_type_json.go @@ -0,0 +1,155 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProductTechnologyPreview writes a value of the 'product_technology_preview' type to the given writer. +func MarshalProductTechnologyPreview(object *ProductTechnologyPreview, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProductTechnologyPreview(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProductTechnologyPreview writes a value of the 'product_technology_preview' type to the given stream. +func writeProductTechnologyPreview(object *ProductTechnologyPreview, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ProductTechnologyPreviewLinkKind) + } else { + stream.WriteString(ProductTechnologyPreviewKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("additional_text") + stream.WriteString(object.additionalText) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("end_date") + stream.WriteString((object.endDate).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("start_date") + stream.WriteString((object.startDate).Format(time.RFC3339)) + } + stream.WriteObjectEnd() +} + +// UnmarshalProductTechnologyPreview reads a value of the 'product_technology_preview' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalProductTechnologyPreview(source interface{}) (object *ProductTechnologyPreview, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readProductTechnologyPreview(iterator) + err = iterator.Error + return +} + +// readProductTechnologyPreview reads a value of the 'product_technology_preview' type from the given iterator. +func readProductTechnologyPreview(iterator *jsoniter.Iterator) *ProductTechnologyPreview { + object := &ProductTechnologyPreview{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ProductTechnologyPreviewLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "additional_text": + value := iterator.ReadString() + object.additionalText = value + object.bitmap_ |= 8 + case "end_date": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.endDate = value + object.bitmap_ |= 16 + case "start_date": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.startDate = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/product_technology_previews_client.go b/clustersmgmt/v2alpha1/product_technology_previews_client.go new file mode 100644 index 00000000..d81bcde0 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_previews_client.go @@ -0,0 +1,347 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProductTechnologyPreviewsClient is the client of the 'product_technology_previews' resource. +// +// Manages the collection of product technology previews. +type ProductTechnologyPreviewsClient struct { + transport http.RoundTripper + path string +} + +// NewProductTechnologyPreviewsClient creates a new client for the 'product_technology_previews' +// resource using the given transport to send the requests and receive the +// responses. +func NewProductTechnologyPreviewsClient(transport http.RoundTripper, path string) *ProductTechnologyPreviewsClient { + return &ProductTechnologyPreviewsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of product technology previews. +func (c *ProductTechnologyPreviewsClient) List() *ProductTechnologyPreviewsListRequest { + return &ProductTechnologyPreviewsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// TechnologyPreview returns the target 'product_technology_preview' resource for the given identifier. +// +// Returns a reference to the service that manages a specific product technology preview. +func (c *ProductTechnologyPreviewsClient) TechnologyPreview(id string) *ProductTechnologyPreviewClient { + return NewProductTechnologyPreviewClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ProductTechnologyPreviewsListRequest is the request for the 'list' method. +type ProductTechnologyPreviewsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *ProductTechnologyPreviewsListRequest) Parameter(name string, value interface{}) *ProductTechnologyPreviewsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProductTechnologyPreviewsListRequest) Header(name string, value interface{}) *ProductTechnologyPreviewsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProductTechnologyPreviewsListRequest) Impersonate(user string) *ProductTechnologyPreviewsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the product instead of +// the names of the columns of a table. For example, in order to sort the products +// descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *ProductTechnologyPreviewsListRequest) Order(value string) *ProductTechnologyPreviewsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductTechnologyPreviewsListRequest) Page(value int) *ProductTechnologyPreviewsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the product instead of +// the names of the columns of a table. For example, in order to retrieve all the +// products with a name starting with `my` the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the products +// that the user has permission to see will be returned. +func (r *ProductTechnologyPreviewsListRequest) Search(value string) *ProductTechnologyPreviewsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductTechnologyPreviewsListRequest) Size(value int) *ProductTechnologyPreviewsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProductTechnologyPreviewsListRequest) Send() (result *ProductTechnologyPreviewsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProductTechnologyPreviewsListRequest) SendContext(ctx context.Context) (result *ProductTechnologyPreviewsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProductTechnologyPreviewsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProductTechnologyPreviewsListResponse(result, reader) + if err != nil { + return + } + return +} + +// ProductTechnologyPreviewsListResponse is the response for the 'list' method. +type ProductTechnologyPreviewsListResponse struct { + status int + header http.Header + err *errors.Error + items *ProductTechnologyPreviewList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ProductTechnologyPreviewsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProductTechnologyPreviewsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProductTechnologyPreviewsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of product technology previews. +func (r *ProductTechnologyPreviewsListResponse) Items() *ProductTechnologyPreviewList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of product technology previews. +func (r *ProductTechnologyPreviewsListResponse) GetItems() (value *ProductTechnologyPreviewList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductTechnologyPreviewsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductTechnologyPreviewsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductTechnologyPreviewsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductTechnologyPreviewsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ProductTechnologyPreviewsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ProductTechnologyPreviewsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/product_technology_previews_resource_json.go b/clustersmgmt/v2alpha1/product_technology_previews_resource_json.go new file mode 100644 index 00000000..4468ce04 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_technology_previews_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeProductTechnologyPreviewsListRequest(request *ProductTechnologyPreviewsListRequest, writer io.Writer) error { + return nil +} +func readProductTechnologyPreviewsListResponse(response *ProductTechnologyPreviewsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readProductTechnologyPreviewList(iterator) + response.items = &ProductTechnologyPreviewList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/product_type.go b/clustersmgmt/v2alpha1/product_type.go new file mode 100644 index 00000000..6270ac27 --- /dev/null +++ b/clustersmgmt/v2alpha1/product_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProductKind is the name of the type used to represent objects +// of type 'product'. +const ProductKind = "Product" + +// ProductLinkKind is the name of the type used to represent links +// to objects of type 'product'. +const ProductLinkKind = "ProductLink" + +// ProductNilKind is the name of the type used to nil references +// to objects of type 'product'. +const ProductNilKind = "ProductNil" + +// Product represents the values of the 'product' type. +// +// Representation of an product that can be selected as a cluster type. +type Product struct { + bitmap_ uint32 + id string + href string + name string +} + +// Kind returns the name of the type of the object. +func (o *Product) Kind() string { + if o == nil { + return ProductNilKind + } + if o.bitmap_&1 != 0 { + return ProductLinkKind + } + return ProductKind +} + +// Link returns true iif this is a link. +func (o *Product) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Product) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Product) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Product) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Product) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Product) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the product. +func (o *Product) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the product. +func (o *Product) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// ProductListKind is the name of the type used to represent list of objects of +// type 'product'. +const ProductListKind = "ProductList" + +// ProductListLinkKind is the name of the type used to represent links to list +// of objects of type 'product'. +const ProductListLinkKind = "ProductListLink" + +// ProductNilKind is the name of the type used to nil lists of objects of +// type 'product'. +const ProductListNilKind = "ProductListNil" + +// ProductList is a list of values of the 'product' type. +type ProductList struct { + href string + link bool + items []*Product +} + +// Kind returns the name of the type of the object. +func (l *ProductList) Kind() string { + if l == nil { + return ProductListNilKind + } + if l.link { + return ProductListLinkKind + } + return ProductListKind +} + +// Link returns true iif this is a link. +func (l *ProductList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ProductList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ProductList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ProductList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ProductList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ProductList) Get(i int) *Product { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ProductList) Slice() []*Product { + var slice []*Product + if l == nil { + slice = make([]*Product, 0) + } else { + slice = make([]*Product, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ProductList) Each(f func(item *Product) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ProductList) Range(f func(index int, item *Product) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/product_type_json.go b/clustersmgmt/v2alpha1/product_type_json.go new file mode 100644 index 00000000..130e655a --- /dev/null +++ b/clustersmgmt/v2alpha1/product_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProduct writes a value of the 'product' type to the given writer. +func MarshalProduct(object *Product, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProduct(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProduct writes a value of the 'product' type to the given stream. +func writeProduct(object *Product, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ProductLinkKind) + } else { + stream.WriteString(ProductKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + } + stream.WriteObjectEnd() +} + +// UnmarshalProduct reads a value of the 'product' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalProduct(source interface{}) (object *Product, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readProduct(iterator) + err = iterator.Error + return +} + +// readProduct reads a value of the 'product' type from the given iterator. +func readProduct(iterator *jsoniter.Iterator) *Product { + object := &Product{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ProductLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/products_client.go b/clustersmgmt/v2alpha1/products_client.go new file mode 100644 index 00000000..4600c34b --- /dev/null +++ b/clustersmgmt/v2alpha1/products_client.go @@ -0,0 +1,347 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProductsClient is the client of the 'products' resource. +// +// Manages the collection of products. +type ProductsClient struct { + transport http.RoundTripper + path string +} + +// NewProductsClient creates a new client for the 'products' +// resource using the given transport to send the requests and receive the +// responses. +func NewProductsClient(transport http.RoundTripper, path string) *ProductsClient { + return &ProductsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of products. +func (c *ProductsClient) List() *ProductsListRequest { + return &ProductsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Product returns the target 'product' resource for the given identifier. +// +// Returns a reference to the service that manages a specific product. +func (c *ProductsClient) Product(id string) *ProductClient { + return NewProductClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ProductsListRequest is the request for the 'list' method. +type ProductsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *ProductsListRequest) Parameter(name string, value interface{}) *ProductsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProductsListRequest) Header(name string, value interface{}) *ProductsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProductsListRequest) Impersonate(user string) *ProductsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the product instead of +// the names of the columns of a table. For example, in order to sort the products +// descending by name the value should be: +// +// ```sql +// name desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *ProductsListRequest) Order(value string) *ProductsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductsListRequest) Page(value int) *ProductsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the product instead of +// the names of the columns of a table. For example, in order to retrieve all the +// products with a name starting with `my` the value should be: +// +// ```sql +// name like 'my%' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the products +// that the user has permission to see will be returned. +func (r *ProductsListRequest) Search(value string) *ProductsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductsListRequest) Size(value int) *ProductsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProductsListRequest) Send() (result *ProductsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProductsListRequest) SendContext(ctx context.Context) (result *ProductsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProductsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProductsListResponse(result, reader) + if err != nil { + return + } + return +} + +// ProductsListResponse is the response for the 'list' method. +type ProductsListResponse struct { + status int + header http.Header + err *errors.Error + items *ProductList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ProductsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProductsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProductsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of products. +func (r *ProductsListResponse) Items() *ProductList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of products. +func (r *ProductsListResponse) GetItems() (value *ProductList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProductsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProductsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ProductsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *ProductsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/products_resource_json.go b/clustersmgmt/v2alpha1/products_resource_json.go new file mode 100644 index 00000000..4c9355b6 --- /dev/null +++ b/clustersmgmt/v2alpha1/products_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeProductsListRequest(request *ProductsListRequest, writer io.Writer) error { + return nil +} +func readProductsListResponse(response *ProductsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readProductList(iterator) + response.items = &ProductList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/provision_shard_builder.go b/clustersmgmt/v2alpha1/provision_shard_builder.go new file mode 100644 index 00000000..d5677481 --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_builder.go @@ -0,0 +1,293 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ProvisionShardBuilder contains the data and logic needed to build 'provision_shard' objects. +// +// Contains the properties of the provision shard, including AWS and GCP related configurations +type ProvisionShardBuilder struct { + bitmap_ uint32 + id string + href string + awsAccountOperatorConfig *ServerConfigBuilder + awsBaseDomain string + gcpBaseDomain string + gcpProjectOperator *ServerConfigBuilder + cloudProvider *CloudProviderBuilder + creationTimestamp time.Time + hiveConfig *ServerConfigBuilder + hypershiftConfig *ServerConfigBuilder + lastUpdateTimestamp time.Time + managementCluster string + region *CloudRegionBuilder + status string +} + +// NewProvisionShard creates a new builder of 'provision_shard' objects. +func NewProvisionShard() *ProvisionShardBuilder { + return &ProvisionShardBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ProvisionShardBuilder) Link(value bool) *ProvisionShardBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ProvisionShardBuilder) ID(value string) *ProvisionShardBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ProvisionShardBuilder) HREF(value string) *ProvisionShardBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ProvisionShardBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AWSAccountOperatorConfig sets the value of the 'AWS_account_operator_config' attribute to the given value. +// +// Representation of a server config +func (b *ProvisionShardBuilder) AWSAccountOperatorConfig(value *ServerConfigBuilder) *ProvisionShardBuilder { + b.awsAccountOperatorConfig = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// AWSBaseDomain sets the value of the 'AWS_base_domain' attribute to the given value. +func (b *ProvisionShardBuilder) AWSBaseDomain(value string) *ProvisionShardBuilder { + b.awsBaseDomain = value + b.bitmap_ |= 16 + return b +} + +// GCPBaseDomain sets the value of the 'GCP_base_domain' attribute to the given value. +func (b *ProvisionShardBuilder) GCPBaseDomain(value string) *ProvisionShardBuilder { + b.gcpBaseDomain = value + b.bitmap_ |= 32 + return b +} + +// GCPProjectOperator sets the value of the 'GCP_project_operator' attribute to the given value. +// +// Representation of a server config +func (b *ProvisionShardBuilder) GCPProjectOperator(value *ServerConfigBuilder) *ProvisionShardBuilder { + b.gcpProjectOperator = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// CloudProvider sets the value of the 'cloud_provider' attribute to the given value. +// +// Cloud provider. +func (b *ProvisionShardBuilder) CloudProvider(value *CloudProviderBuilder) *ProvisionShardBuilder { + b.cloudProvider = value + if value != nil { + b.bitmap_ |= 128 + } else { + b.bitmap_ &^= 128 + } + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *ProvisionShardBuilder) CreationTimestamp(value time.Time) *ProvisionShardBuilder { + b.creationTimestamp = value + b.bitmap_ |= 256 + return b +} + +// HiveConfig sets the value of the 'hive_config' attribute to the given value. +// +// Representation of a server config +func (b *ProvisionShardBuilder) HiveConfig(value *ServerConfigBuilder) *ProvisionShardBuilder { + b.hiveConfig = value + if value != nil { + b.bitmap_ |= 512 + } else { + b.bitmap_ &^= 512 + } + return b +} + +// HypershiftConfig sets the value of the 'hypershift_config' attribute to the given value. +// +// Representation of a server config +func (b *ProvisionShardBuilder) HypershiftConfig(value *ServerConfigBuilder) *ProvisionShardBuilder { + b.hypershiftConfig = value + if value != nil { + b.bitmap_ |= 1024 + } else { + b.bitmap_ &^= 1024 + } + return b +} + +// LastUpdateTimestamp sets the value of the 'last_update_timestamp' attribute to the given value. +func (b *ProvisionShardBuilder) LastUpdateTimestamp(value time.Time) *ProvisionShardBuilder { + b.lastUpdateTimestamp = value + b.bitmap_ |= 2048 + return b +} + +// ManagementCluster sets the value of the 'management_cluster' attribute to the given value. +func (b *ProvisionShardBuilder) ManagementCluster(value string) *ProvisionShardBuilder { + b.managementCluster = value + b.bitmap_ |= 4096 + return b +} + +// Region sets the value of the 'region' attribute to the given value. +// +// Description of a region of a cloud provider. +func (b *ProvisionShardBuilder) Region(value *CloudRegionBuilder) *ProvisionShardBuilder { + b.region = value + if value != nil { + b.bitmap_ |= 8192 + } else { + b.bitmap_ &^= 8192 + } + return b +} + +// Status sets the value of the 'status' attribute to the given value. +func (b *ProvisionShardBuilder) Status(value string) *ProvisionShardBuilder { + b.status = value + b.bitmap_ |= 16384 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ProvisionShardBuilder) Copy(object *ProvisionShard) *ProvisionShardBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.awsAccountOperatorConfig != nil { + b.awsAccountOperatorConfig = NewServerConfig().Copy(object.awsAccountOperatorConfig) + } else { + b.awsAccountOperatorConfig = nil + } + b.awsBaseDomain = object.awsBaseDomain + b.gcpBaseDomain = object.gcpBaseDomain + if object.gcpProjectOperator != nil { + b.gcpProjectOperator = NewServerConfig().Copy(object.gcpProjectOperator) + } else { + b.gcpProjectOperator = nil + } + if object.cloudProvider != nil { + b.cloudProvider = NewCloudProvider().Copy(object.cloudProvider) + } else { + b.cloudProvider = nil + } + b.creationTimestamp = object.creationTimestamp + if object.hiveConfig != nil { + b.hiveConfig = NewServerConfig().Copy(object.hiveConfig) + } else { + b.hiveConfig = nil + } + if object.hypershiftConfig != nil { + b.hypershiftConfig = NewServerConfig().Copy(object.hypershiftConfig) + } else { + b.hypershiftConfig = nil + } + b.lastUpdateTimestamp = object.lastUpdateTimestamp + b.managementCluster = object.managementCluster + if object.region != nil { + b.region = NewCloudRegion().Copy(object.region) + } else { + b.region = nil + } + b.status = object.status + return b +} + +// Build creates a 'provision_shard' object using the configuration stored in the builder. +func (b *ProvisionShardBuilder) Build() (object *ProvisionShard, err error) { + object = new(ProvisionShard) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.awsAccountOperatorConfig != nil { + object.awsAccountOperatorConfig, err = b.awsAccountOperatorConfig.Build() + if err != nil { + return + } + } + object.awsBaseDomain = b.awsBaseDomain + object.gcpBaseDomain = b.gcpBaseDomain + if b.gcpProjectOperator != nil { + object.gcpProjectOperator, err = b.gcpProjectOperator.Build() + if err != nil { + return + } + } + if b.cloudProvider != nil { + object.cloudProvider, err = b.cloudProvider.Build() + if err != nil { + return + } + } + object.creationTimestamp = b.creationTimestamp + if b.hiveConfig != nil { + object.hiveConfig, err = b.hiveConfig.Build() + if err != nil { + return + } + } + if b.hypershiftConfig != nil { + object.hypershiftConfig, err = b.hypershiftConfig.Build() + if err != nil { + return + } + } + object.lastUpdateTimestamp = b.lastUpdateTimestamp + object.managementCluster = b.managementCluster + if b.region != nil { + object.region, err = b.region.Build() + if err != nil { + return + } + } + object.status = b.status + return +} diff --git a/clustersmgmt/v2alpha1/provision_shard_client.go b/clustersmgmt/v2alpha1/provision_shard_client.go new file mode 100644 index 00000000..eb96b3ae --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProvisionShardClient is the client of the 'provision_shard' resource. +// +// Manages provision shard. +type ProvisionShardClient struct { + transport http.RoundTripper + path string +} + +// NewProvisionShardClient creates a new client for the 'provision_shard' +// resource using the given transport to send the requests and receive the +// responses. +func NewProvisionShardClient(transport http.RoundTripper, path string) *ProvisionShardClient { + return &ProvisionShardClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Delete the provision shard. +func (c *ProvisionShardClient) Delete() *ProvisionShardDeleteRequest { + return &ProvisionShardDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the provision shard. +func (c *ProvisionShardClient) Get() *ProvisionShardGetRequest { + return &ProvisionShardGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the details of the provision shard. +func (c *ProvisionShardClient) Update() *ProvisionShardUpdateRequest { + return &ProvisionShardUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// ProvisionShardPollRequest is the request for the Poll method. +type ProvisionShardPollRequest struct { + request *ProvisionShardGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ProvisionShardPollRequest) Parameter(name string, value interface{}) *ProvisionShardPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ProvisionShardPollRequest) Header(name string, value interface{}) *ProvisionShardPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ProvisionShardPollRequest) Interval(value time.Duration) *ProvisionShardPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ProvisionShardPollRequest) Status(value int) *ProvisionShardPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ProvisionShardPollRequest) Predicate(value func(*ProvisionShardGetResponse) bool) *ProvisionShardPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ProvisionShardGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ProvisionShardPollRequest) StartContext(ctx context.Context) (response *ProvisionShardPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ProvisionShardPollResponse{ + response: result.(*ProvisionShardGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ProvisionShardPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ProvisionShardPollResponse is the response for the Poll method. +type ProvisionShardPollResponse struct { + response *ProvisionShardGetResponse +} + +// Status returns the response status code. +func (r *ProvisionShardPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ProvisionShardPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ProvisionShardPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *ProvisionShardPollResponse) Body() *ProvisionShard { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProvisionShardPollResponse) GetBody() (value *ProvisionShard, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ProvisionShardClient) Poll() *ProvisionShardPollRequest { + return &ProvisionShardPollRequest{ + request: c.Get(), + } +} + +// ProvisionShardDeleteRequest is the request for the 'delete' method. +type ProvisionShardDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ProvisionShardDeleteRequest) Parameter(name string, value interface{}) *ProvisionShardDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProvisionShardDeleteRequest) Header(name string, value interface{}) *ProvisionShardDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProvisionShardDeleteRequest) Impersonate(user string) *ProvisionShardDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProvisionShardDeleteRequest) Send() (result *ProvisionShardDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProvisionShardDeleteRequest) SendContext(ctx context.Context) (result *ProvisionShardDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProvisionShardDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// ProvisionShardDeleteResponse is the response for the 'delete' method. +type ProvisionShardDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *ProvisionShardDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProvisionShardDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProvisionShardDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// ProvisionShardGetRequest is the request for the 'get' method. +type ProvisionShardGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ProvisionShardGetRequest) Parameter(name string, value interface{}) *ProvisionShardGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProvisionShardGetRequest) Header(name string, value interface{}) *ProvisionShardGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProvisionShardGetRequest) Impersonate(user string) *ProvisionShardGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProvisionShardGetRequest) Send() (result *ProvisionShardGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProvisionShardGetRequest) SendContext(ctx context.Context) (result *ProvisionShardGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProvisionShardGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProvisionShardGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ProvisionShardGetResponse is the response for the 'get' method. +type ProvisionShardGetResponse struct { + status int + header http.Header + err *errors.Error + body *ProvisionShard +} + +// Status returns the response status code. +func (r *ProvisionShardGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProvisionShardGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProvisionShardGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ProvisionShardGetResponse) Body() *ProvisionShard { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProvisionShardGetResponse) GetBody() (value *ProvisionShard, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ProvisionShardUpdateRequest is the request for the 'update' method. +type ProvisionShardUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ProvisionShard +} + +// Parameter adds a query parameter. +func (r *ProvisionShardUpdateRequest) Parameter(name string, value interface{}) *ProvisionShardUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProvisionShardUpdateRequest) Header(name string, value interface{}) *ProvisionShardUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProvisionShardUpdateRequest) Impersonate(user string) *ProvisionShardUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *ProvisionShardUpdateRequest) Body(value *ProvisionShard) *ProvisionShardUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProvisionShardUpdateRequest) Send() (result *ProvisionShardUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProvisionShardUpdateRequest) SendContext(ctx context.Context) (result *ProvisionShardUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeProvisionShardUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProvisionShardUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProvisionShardUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// ProvisionShardUpdateResponse is the response for the 'update' method. +type ProvisionShardUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *ProvisionShard +} + +// Status returns the response status code. +func (r *ProvisionShardUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProvisionShardUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProvisionShardUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *ProvisionShardUpdateResponse) Body() *ProvisionShard { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *ProvisionShardUpdateResponse) GetBody() (value *ProvisionShard, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/provision_shard_list_builder.go b/clustersmgmt/v2alpha1/provision_shard_list_builder.go new file mode 100644 index 00000000..4f4e31a2 --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProvisionShardListBuilder contains the data and logic needed to build +// 'provision_shard' objects. +type ProvisionShardListBuilder struct { + items []*ProvisionShardBuilder +} + +// NewProvisionShardList creates a new builder of 'provision_shard' objects. +func NewProvisionShardList() *ProvisionShardListBuilder { + return new(ProvisionShardListBuilder) +} + +// Items sets the items of the list. +func (b *ProvisionShardListBuilder) Items(values ...*ProvisionShardBuilder) *ProvisionShardListBuilder { + b.items = make([]*ProvisionShardBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ProvisionShardListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ProvisionShardListBuilder) Copy(list *ProvisionShardList) *ProvisionShardListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ProvisionShardBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewProvisionShard().Copy(v) + } + } + return b +} + +// Build creates a list of 'provision_shard' objects using the +// configuration stored in the builder. +func (b *ProvisionShardListBuilder) Build() (list *ProvisionShardList, err error) { + items := make([]*ProvisionShard, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ProvisionShardList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/provision_shard_list_type_json.go b/clustersmgmt/v2alpha1/provision_shard_list_type_json.go new file mode 100644 index 00000000..7ba62dc8 --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProvisionShardList writes a list of values of the 'provision_shard' type to +// the given writer. +func MarshalProvisionShardList(list []*ProvisionShard, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProvisionShardList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProvisionShardList writes a list of value of the 'provision_shard' type to +// the given stream. +func writeProvisionShardList(list []*ProvisionShard, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeProvisionShard(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalProvisionShardList reads a list of values of the 'provision_shard' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProvisionShardList(source interface{}) (items []*ProvisionShard, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProvisionShardList(iterator) + err = iterator.Error + return +} + +// readProvisionShardList reads list of values of the ”provision_shard' type from +// the given iterator. +func readProvisionShardList(iterator *jsoniter.Iterator) []*ProvisionShard { + list := []*ProvisionShard{} + for iterator.ReadArray() { + item := readProvisionShard(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/provision_shard_resource_json.go b/clustersmgmt/v2alpha1/provision_shard_resource_json.go new file mode 100644 index 00000000..db6af13b --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeProvisionShardDeleteRequest(request *ProvisionShardDeleteRequest, writer io.Writer) error { + return nil +} +func readProvisionShardDeleteResponse(response *ProvisionShardDeleteResponse, reader io.Reader) error { + return nil +} +func writeProvisionShardGetRequest(request *ProvisionShardGetRequest, writer io.Writer) error { + return nil +} +func readProvisionShardGetResponse(response *ProvisionShardGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalProvisionShard(reader) + return err +} +func writeProvisionShardUpdateRequest(request *ProvisionShardUpdateRequest, writer io.Writer) error { + return MarshalProvisionShard(request.body, writer) +} +func readProvisionShardUpdateResponse(response *ProvisionShardUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalProvisionShard(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/provision_shard_topology_list_type_json.go b/clustersmgmt/v2alpha1/provision_shard_topology_list_type_json.go new file mode 100644 index 00000000..e18e858f --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_topology_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProvisionShardTopologyList writes a list of values of the 'provision_shard_topology' type to +// the given writer. +func MarshalProvisionShardTopologyList(list []ProvisionShardTopology, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProvisionShardTopologyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProvisionShardTopologyList writes a list of value of the 'provision_shard_topology' type to +// the given stream. +func writeProvisionShardTopologyList(list []ProvisionShardTopology, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalProvisionShardTopologyList reads a list of values of the 'provision_shard_topology' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProvisionShardTopologyList(source interface{}) (items []ProvisionShardTopology, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProvisionShardTopologyList(iterator) + err = iterator.Error + return +} + +// readProvisionShardTopologyList reads list of values of the ”provision_shard_topology' type from +// the given iterator. +func readProvisionShardTopologyList(iterator *jsoniter.Iterator) []ProvisionShardTopology { + list := []ProvisionShardTopology{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ProvisionShardTopology(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/provision_shard_topology_type.go b/clustersmgmt/v2alpha1/provision_shard_topology_type.go new file mode 100644 index 00000000..0e31d467 --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_topology_type.go @@ -0,0 +1,28 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProvisionShardTopology represents the values of the 'provision_shard_topology' enumerated type. +type ProvisionShardTopology string + +const ( + // Provision shard for hosted clusters is configured in a "dedicated" topology. + ProvisionShardTopologyDedicated ProvisionShardTopology = "dedicated" +) diff --git a/clustersmgmt/v2alpha1/provision_shard_type.go b/clustersmgmt/v2alpha1/provision_shard_type.go new file mode 100644 index 00000000..0e6c060d --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_type.go @@ -0,0 +1,516 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// ProvisionShardKind is the name of the type used to represent objects +// of type 'provision_shard'. +const ProvisionShardKind = "ProvisionShard" + +// ProvisionShardLinkKind is the name of the type used to represent links +// to objects of type 'provision_shard'. +const ProvisionShardLinkKind = "ProvisionShardLink" + +// ProvisionShardNilKind is the name of the type used to nil references +// to objects of type 'provision_shard'. +const ProvisionShardNilKind = "ProvisionShardNil" + +// ProvisionShard represents the values of the 'provision_shard' type. +// +// Contains the properties of the provision shard, including AWS and GCP related configurations +type ProvisionShard struct { + bitmap_ uint32 + id string + href string + awsAccountOperatorConfig *ServerConfig + awsBaseDomain string + gcpBaseDomain string + gcpProjectOperator *ServerConfig + cloudProvider *CloudProvider + creationTimestamp time.Time + hiveConfig *ServerConfig + hypershiftConfig *ServerConfig + lastUpdateTimestamp time.Time + managementCluster string + region *CloudRegion + status string +} + +// Kind returns the name of the type of the object. +func (o *ProvisionShard) Kind() string { + if o == nil { + return ProvisionShardNilKind + } + if o.bitmap_&1 != 0 { + return ProvisionShardLinkKind + } + return ProvisionShardKind +} + +// Link returns true iif this is a link. +func (o *ProvisionShard) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ProvisionShard) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ProvisionShard) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ProvisionShard) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ProvisionShard) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ProvisionShard) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AWSAccountOperatorConfig returns the value of the 'AWS_account_operator_config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the configuration for the AWS account operator. +func (o *ProvisionShard) AWSAccountOperatorConfig() *ServerConfig { + if o != nil && o.bitmap_&8 != 0 { + return o.awsAccountOperatorConfig + } + return nil +} + +// GetAWSAccountOperatorConfig returns the value of the 'AWS_account_operator_config' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the configuration for the AWS account operator. +func (o *ProvisionShard) GetAWSAccountOperatorConfig() (value *ServerConfig, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.awsAccountOperatorConfig + } + return +} + +// AWSBaseDomain returns the value of the 'AWS_base_domain' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the AWS base domain. +func (o *ProvisionShard) AWSBaseDomain() string { + if o != nil && o.bitmap_&16 != 0 { + return o.awsBaseDomain + } + return "" +} + +// GetAWSBaseDomain returns the value of the 'AWS_base_domain' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the AWS base domain. +func (o *ProvisionShard) GetAWSBaseDomain() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.awsBaseDomain + } + return +} + +// GCPBaseDomain returns the value of the 'GCP_base_domain' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the GCP base domain. +func (o *ProvisionShard) GCPBaseDomain() string { + if o != nil && o.bitmap_&32 != 0 { + return o.gcpBaseDomain + } + return "" +} + +// GetGCPBaseDomain returns the value of the 'GCP_base_domain' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the GCP base domain. +func (o *ProvisionShard) GetGCPBaseDomain() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.gcpBaseDomain + } + return +} + +// GCPProjectOperator returns the value of the 'GCP_project_operator' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the configuration for the GCP project operator. +func (o *ProvisionShard) GCPProjectOperator() *ServerConfig { + if o != nil && o.bitmap_&64 != 0 { + return o.gcpProjectOperator + } + return nil +} + +// GetGCPProjectOperator returns the value of the 'GCP_project_operator' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the configuration for the GCP project operator. +func (o *ProvisionShard) GetGCPProjectOperator() (value *ServerConfig, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.gcpProjectOperator + } + return +} + +// CloudProvider returns the value of the 'cloud_provider' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the cloud provider name. +func (o *ProvisionShard) CloudProvider() *CloudProvider { + if o != nil && o.bitmap_&128 != 0 { + return o.cloudProvider + } + return nil +} + +// GetCloudProvider returns the value of the 'cloud_provider' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the cloud provider name. +func (o *ProvisionShard) GetCloudProvider() (value *CloudProvider, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.cloudProvider + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the provision shard was initially created, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *ProvisionShard) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&256 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the provision shard was initially created, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *ProvisionShard) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// HiveConfig returns the value of the 'hive_config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the configuration for Hive. +func (o *ProvisionShard) HiveConfig() *ServerConfig { + if o != nil && o.bitmap_&512 != 0 { + return o.hiveConfig + } + return nil +} + +// GetHiveConfig returns the value of the 'hive_config' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the configuration for Hive. +func (o *ProvisionShard) GetHiveConfig() (value *ServerConfig, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.hiveConfig + } + return +} + +// HypershiftConfig returns the value of the 'hypershift_config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the configuration for Hypershift. +func (o *ProvisionShard) HypershiftConfig() *ServerConfig { + if o != nil && o.bitmap_&1024 != 0 { + return o.hypershiftConfig + } + return nil +} + +// GetHypershiftConfig returns the value of the 'hypershift_config' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the configuration for Hypershift. +func (o *ProvisionShard) GetHypershiftConfig() (value *ServerConfig, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.hypershiftConfig + } + return +} + +// LastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Date and time when the provision shard was last updated, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *ProvisionShard) LastUpdateTimestamp() time.Time { + if o != nil && o.bitmap_&2048 != 0 { + return o.lastUpdateTimestamp + } + return time.Time{} +} + +// GetLastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// Date and time when the provision shard was last updated, using the +// format defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). +func (o *ProvisionShard) GetLastUpdateTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.lastUpdateTimestamp + } + return +} + +// ManagementCluster returns the value of the 'management_cluster' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the name of the management cluster for Hypershift clusters that are assigned to this shard. +// This field is populated by OCM, and must not be overwritten via API. +func (o *ProvisionShard) ManagementCluster() string { + if o != nil && o.bitmap_&4096 != 0 { + return o.managementCluster + } + return "" +} + +// GetManagementCluster returns the value of the 'management_cluster' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the name of the management cluster for Hypershift clusters that are assigned to this shard. +// This field is populated by OCM, and must not be overwritten via API. +func (o *ProvisionShard) GetManagementCluster() (value string, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.managementCluster + } + return +} + +// Region returns the value of the 'region' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Contains the cloud-provider region in which the provisioner spins up the cluster. +func (o *ProvisionShard) Region() *CloudRegion { + if o != nil && o.bitmap_&8192 != 0 { + return o.region + } + return nil +} + +// GetRegion returns the value of the 'region' attribute and +// a flag indicating if the attribute has a value. +// +// Contains the cloud-provider region in which the provisioner spins up the cluster. +func (o *ProvisionShard) GetRegion() (value *CloudRegion, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.region + } + return +} + +// Status returns the value of the 'status' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Status of the provision shard. Possible values: active/maintenance/offline. +func (o *ProvisionShard) Status() string { + if o != nil && o.bitmap_&16384 != 0 { + return o.status + } + return "" +} + +// GetStatus returns the value of the 'status' attribute and +// a flag indicating if the attribute has a value. +// +// Status of the provision shard. Possible values: active/maintenance/offline. +func (o *ProvisionShard) GetStatus() (value string, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.status + } + return +} + +// ProvisionShardListKind is the name of the type used to represent list of objects of +// type 'provision_shard'. +const ProvisionShardListKind = "ProvisionShardList" + +// ProvisionShardListLinkKind is the name of the type used to represent links to list +// of objects of type 'provision_shard'. +const ProvisionShardListLinkKind = "ProvisionShardListLink" + +// ProvisionShardNilKind is the name of the type used to nil lists of objects of +// type 'provision_shard'. +const ProvisionShardListNilKind = "ProvisionShardListNil" + +// ProvisionShardList is a list of values of the 'provision_shard' type. +type ProvisionShardList struct { + href string + link bool + items []*ProvisionShard +} + +// Kind returns the name of the type of the object. +func (l *ProvisionShardList) Kind() string { + if l == nil { + return ProvisionShardListNilKind + } + if l.link { + return ProvisionShardListLinkKind + } + return ProvisionShardListKind +} + +// Link returns true iif this is a link. +func (l *ProvisionShardList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ProvisionShardList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ProvisionShardList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ProvisionShardList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ProvisionShardList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ProvisionShardList) Get(i int) *ProvisionShard { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ProvisionShardList) Slice() []*ProvisionShard { + var slice []*ProvisionShard + if l == nil { + slice = make([]*ProvisionShard, 0) + } else { + slice = make([]*ProvisionShard, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ProvisionShardList) Each(f func(item *ProvisionShard) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ProvisionShardList) Range(f func(index int, item *ProvisionShard) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/provision_shard_type_json.go b/clustersmgmt/v2alpha1/provision_shard_type_json.go new file mode 100644 index 00000000..8fc08164 --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shard_type_json.go @@ -0,0 +1,272 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProvisionShard writes a value of the 'provision_shard' type to the given writer. +func MarshalProvisionShard(object *ProvisionShard, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProvisionShard(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProvisionShard writes a value of the 'provision_shard' type to the given stream. +func writeProvisionShard(object *ProvisionShard, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ProvisionShardLinkKind) + } else { + stream.WriteString(ProvisionShardKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.awsAccountOperatorConfig != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws_account_operator_config") + writeServerConfig(object.awsAccountOperatorConfig, stream) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws_base_domain") + stream.WriteString(object.awsBaseDomain) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp_base_domain") + stream.WriteString(object.gcpBaseDomain) + count++ + } + present_ = object.bitmap_&64 != 0 && object.gcpProjectOperator != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp_project_operator") + writeServerConfig(object.gcpProjectOperator, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.cloudProvider != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cloud_provider") + writeCloudProvider(object.cloudProvider, stream) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&512 != 0 && object.hiveConfig != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hive_config") + writeServerConfig(object.hiveConfig, stream) + count++ + } + present_ = object.bitmap_&1024 != 0 && object.hypershiftConfig != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hypershift_config") + writeServerConfig(object.hypershiftConfig, stream) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_update_timestamp") + stream.WriteString((object.lastUpdateTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&4096 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("management_cluster") + stream.WriteString(object.managementCluster) + count++ + } + present_ = object.bitmap_&8192 != 0 && object.region != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("region") + writeCloudRegion(object.region, stream) + count++ + } + present_ = object.bitmap_&16384 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("status") + stream.WriteString(object.status) + } + stream.WriteObjectEnd() +} + +// UnmarshalProvisionShard reads a value of the 'provision_shard' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalProvisionShard(source interface{}) (object *ProvisionShard, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readProvisionShard(iterator) + err = iterator.Error + return +} + +// readProvisionShard reads a value of the 'provision_shard' type from the given iterator. +func readProvisionShard(iterator *jsoniter.Iterator) *ProvisionShard { + object := &ProvisionShard{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ProvisionShardLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "aws_account_operator_config": + value := readServerConfig(iterator) + object.awsAccountOperatorConfig = value + object.bitmap_ |= 8 + case "aws_base_domain": + value := iterator.ReadString() + object.awsBaseDomain = value + object.bitmap_ |= 16 + case "gcp_base_domain": + value := iterator.ReadString() + object.gcpBaseDomain = value + object.bitmap_ |= 32 + case "gcp_project_operator": + value := readServerConfig(iterator) + object.gcpProjectOperator = value + object.bitmap_ |= 64 + case "cloud_provider": + value := readCloudProvider(iterator) + object.cloudProvider = value + object.bitmap_ |= 128 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 256 + case "hive_config": + value := readServerConfig(iterator) + object.hiveConfig = value + object.bitmap_ |= 512 + case "hypershift_config": + value := readServerConfig(iterator) + object.hypershiftConfig = value + object.bitmap_ |= 1024 + case "last_update_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUpdateTimestamp = value + object.bitmap_ |= 2048 + case "management_cluster": + value := iterator.ReadString() + object.managementCluster = value + object.bitmap_ |= 4096 + case "region": + value := readCloudRegion(iterator) + object.region = value + object.bitmap_ |= 8192 + case "status": + value := iterator.ReadString() + object.status = value + object.bitmap_ |= 16384 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/provision_shards_client.go b/clustersmgmt/v2alpha1/provision_shards_client.go new file mode 100644 index 00000000..4bc791bf --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shards_client.go @@ -0,0 +1,480 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ProvisionShardsClient is the client of the 'provision_shards' resource. +// +// Manages the collection of provision shards. +type ProvisionShardsClient struct { + transport http.RoundTripper + path string +} + +// NewProvisionShardsClient creates a new client for the 'provision_shards' +// resource using the given transport to send the requests and receive the +// responses. +func NewProvisionShardsClient(transport http.RoundTripper, path string) *ProvisionShardsClient { + return &ProvisionShardsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a provision shard. +func (c *ProvisionShardsClient) Add() *ProvisionShardsAddRequest { + return &ProvisionShardsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +func (c *ProvisionShardsClient) List() *ProvisionShardsListRequest { + return &ProvisionShardsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// ProvisionShard returns the target 'provision_shard' resource for the given identifier. +// +// Reference to the resource that manages a specific provision shard. +func (c *ProvisionShardsClient) ProvisionShard(id string) *ProvisionShardClient { + return NewProvisionShardClient( + c.transport, + path.Join(c.path, id), + ) +} + +// ProvisionShardsAddRequest is the request for the 'add' method. +type ProvisionShardsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *ProvisionShard +} + +// Parameter adds a query parameter. +func (r *ProvisionShardsAddRequest) Parameter(name string, value interface{}) *ProvisionShardsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProvisionShardsAddRequest) Header(name string, value interface{}) *ProvisionShardsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProvisionShardsAddRequest) Impersonate(user string) *ProvisionShardsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the provision shard. +func (r *ProvisionShardsAddRequest) Body(value *ProvisionShard) *ProvisionShardsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProvisionShardsAddRequest) Send() (result *ProvisionShardsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProvisionShardsAddRequest) SendContext(ctx context.Context) (result *ProvisionShardsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeProvisionShardsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProvisionShardsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProvisionShardsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// ProvisionShardsAddResponse is the response for the 'add' method. +type ProvisionShardsAddResponse struct { + status int + header http.Header + err *errors.Error + body *ProvisionShard +} + +// Status returns the response status code. +func (r *ProvisionShardsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProvisionShardsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProvisionShardsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the provision shard. +func (r *ProvisionShardsAddResponse) Body() *ProvisionShard { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the provision shard. +func (r *ProvisionShardsAddResponse) GetBody() (value *ProvisionShard, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// ProvisionShardsListRequest is the request for the 'list' method. +type ProvisionShardsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *ProvisionShardsListRequest) Parameter(name string, value interface{}) *ProvisionShardsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ProvisionShardsListRequest) Header(name string, value interface{}) *ProvisionShardsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ProvisionShardsListRequest) Impersonate(user string) *ProvisionShardsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProvisionShardsListRequest) Page(value int) *ProvisionShardsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to retrieve all the +// clusters with a name starting with `my` in the `us-east-1` region the value +// should be: +// +// ```sql +// name like 'my%' and region.id = 'us-east-1' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// provision shards that the user has permission to see will be returned. +func (r *ProvisionShardsListRequest) Search(value string) *ProvisionShardsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProvisionShardsListRequest) Size(value int) *ProvisionShardsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ProvisionShardsListRequest) Send() (result *ProvisionShardsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ProvisionShardsListRequest) SendContext(ctx context.Context) (result *ProvisionShardsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ProvisionShardsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readProvisionShardsListResponse(result, reader) + if err != nil { + return + } + return +} + +// ProvisionShardsListResponse is the response for the 'list' method. +type ProvisionShardsListResponse struct { + status int + header http.Header + err *errors.Error + items *ProvisionShardList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *ProvisionShardsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ProvisionShardsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ProvisionShardsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved a list of provision shards. +func (r *ProvisionShardsListResponse) Items() *ProvisionShardList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved a list of provision shards. +func (r *ProvisionShardsListResponse) GetItems() (value *ProvisionShardList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProvisionShardsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *ProvisionShardsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProvisionShardsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *ProvisionShardsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *ProvisionShardsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *ProvisionShardsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/provision_shards_resource_json.go b/clustersmgmt/v2alpha1/provision_shards_resource_json.go new file mode 100644 index 00000000..d192b703 --- /dev/null +++ b/clustersmgmt/v2alpha1/provision_shards_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeProvisionShardsAddRequest(request *ProvisionShardsAddRequest, writer io.Writer) error { + return MarshalProvisionShard(request.body, writer) +} +func readProvisionShardsAddResponse(response *ProvisionShardsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalProvisionShard(reader) + return err +} +func writeProvisionShardsListRequest(request *ProvisionShardsListRequest, writer io.Writer) error { + return nil +} +func readProvisionShardsListResponse(response *ProvisionShardsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readProvisionShardList(iterator) + response.items = &ProvisionShardList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/proxy_builder.go b/clustersmgmt/v2alpha1/proxy_builder.go new file mode 100644 index 00000000..6080539a --- /dev/null +++ b/clustersmgmt/v2alpha1/proxy_builder.go @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProxyBuilder contains the data and logic needed to build 'proxy' objects. +// +// Proxy configuration of a cluster. +type ProxyBuilder struct { + bitmap_ uint32 + httpProxy string + httpsProxy string + noProxy string +} + +// NewProxy creates a new builder of 'proxy' objects. +func NewProxy() *ProxyBuilder { + return &ProxyBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ProxyBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// HTTPProxy sets the value of the 'HTTP_proxy' attribute to the given value. +func (b *ProxyBuilder) HTTPProxy(value string) *ProxyBuilder { + b.httpProxy = value + b.bitmap_ |= 1 + return b +} + +// HTTPSProxy sets the value of the 'HTTPS_proxy' attribute to the given value. +func (b *ProxyBuilder) HTTPSProxy(value string) *ProxyBuilder { + b.httpsProxy = value + b.bitmap_ |= 2 + return b +} + +// NoProxy sets the value of the 'no_proxy' attribute to the given value. +func (b *ProxyBuilder) NoProxy(value string) *ProxyBuilder { + b.noProxy = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ProxyBuilder) Copy(object *Proxy) *ProxyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.httpProxy = object.httpProxy + b.httpsProxy = object.httpsProxy + b.noProxy = object.noProxy + return b +} + +// Build creates a 'proxy' object using the configuration stored in the builder. +func (b *ProxyBuilder) Build() (object *Proxy, err error) { + object = new(Proxy) + object.bitmap_ = b.bitmap_ + object.httpProxy = b.httpProxy + object.httpsProxy = b.httpsProxy + object.noProxy = b.noProxy + return +} diff --git a/clustersmgmt/v2alpha1/proxy_list_builder.go b/clustersmgmt/v2alpha1/proxy_list_builder.go new file mode 100644 index 00000000..38b07c16 --- /dev/null +++ b/clustersmgmt/v2alpha1/proxy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ProxyListBuilder contains the data and logic needed to build +// 'proxy' objects. +type ProxyListBuilder struct { + items []*ProxyBuilder +} + +// NewProxyList creates a new builder of 'proxy' objects. +func NewProxyList() *ProxyListBuilder { + return new(ProxyListBuilder) +} + +// Items sets the items of the list. +func (b *ProxyListBuilder) Items(values ...*ProxyBuilder) *ProxyListBuilder { + b.items = make([]*ProxyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ProxyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ProxyListBuilder) Copy(list *ProxyList) *ProxyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ProxyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewProxy().Copy(v) + } + } + return b +} + +// Build creates a list of 'proxy' objects using the +// configuration stored in the builder. +func (b *ProxyListBuilder) Build() (list *ProxyList, err error) { + items := make([]*Proxy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ProxyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/proxy_list_type_json.go b/clustersmgmt/v2alpha1/proxy_list_type_json.go new file mode 100644 index 00000000..ba9996e3 --- /dev/null +++ b/clustersmgmt/v2alpha1/proxy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProxyList writes a list of values of the 'proxy' type to +// the given writer. +func MarshalProxyList(list []*Proxy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProxyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProxyList writes a list of value of the 'proxy' type to +// the given stream. +func writeProxyList(list []*Proxy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeProxy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalProxyList reads a list of values of the 'proxy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalProxyList(source interface{}) (items []*Proxy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readProxyList(iterator) + err = iterator.Error + return +} + +// readProxyList reads list of values of the ”proxy' type from +// the given iterator. +func readProxyList(iterator *jsoniter.Iterator) []*Proxy { + list := []*Proxy{} + for iterator.ReadArray() { + item := readProxy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/proxy_type.go b/clustersmgmt/v2alpha1/proxy_type.go new file mode 100644 index 00000000..edee1345 --- /dev/null +++ b/clustersmgmt/v2alpha1/proxy_type.go @@ -0,0 +1,192 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Proxy represents the values of the 'proxy' type. +// +// Proxy configuration of a cluster. +type Proxy struct { + bitmap_ uint32 + httpProxy string + httpsProxy string + noProxy string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Proxy) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// HTTPProxy returns the value of the 'HTTP_proxy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HTTPProxy is the URL of the proxy for HTTP requests. +func (o *Proxy) HTTPProxy() string { + if o != nil && o.bitmap_&1 != 0 { + return o.httpProxy + } + return "" +} + +// GetHTTPProxy returns the value of the 'HTTP_proxy' attribute and +// a flag indicating if the attribute has a value. +// +// HTTPProxy is the URL of the proxy for HTTP requests. +func (o *Proxy) GetHTTPProxy() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.httpProxy + } + return +} + +// HTTPSProxy returns the value of the 'HTTPS_proxy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HTTPSProxy is the URL of the proxy for HTTPS requests. +func (o *Proxy) HTTPSProxy() string { + if o != nil && o.bitmap_&2 != 0 { + return o.httpsProxy + } + return "" +} + +// GetHTTPSProxy returns the value of the 'HTTPS_proxy' attribute and +// a flag indicating if the attribute has a value. +// +// HTTPSProxy is the URL of the proxy for HTTPS requests. +func (o *Proxy) GetHTTPSProxy() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.httpsProxy + } + return +} + +// NoProxy returns the value of the 'no_proxy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// NoProxy is a comma-separated list of domains and CIDRs for which +// the proxy should not be used +func (o *Proxy) NoProxy() string { + if o != nil && o.bitmap_&4 != 0 { + return o.noProxy + } + return "" +} + +// GetNoProxy returns the value of the 'no_proxy' attribute and +// a flag indicating if the attribute has a value. +// +// NoProxy is a comma-separated list of domains and CIDRs for which +// the proxy should not be used +func (o *Proxy) GetNoProxy() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.noProxy + } + return +} + +// ProxyListKind is the name of the type used to represent list of objects of +// type 'proxy'. +const ProxyListKind = "ProxyList" + +// ProxyListLinkKind is the name of the type used to represent links to list +// of objects of type 'proxy'. +const ProxyListLinkKind = "ProxyListLink" + +// ProxyNilKind is the name of the type used to nil lists of objects of +// type 'proxy'. +const ProxyListNilKind = "ProxyListNil" + +// ProxyList is a list of values of the 'proxy' type. +type ProxyList struct { + href string + link bool + items []*Proxy +} + +// Len returns the length of the list. +func (l *ProxyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ProxyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ProxyList) Get(i int) *Proxy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ProxyList) Slice() []*Proxy { + var slice []*Proxy + if l == nil { + slice = make([]*Proxy, 0) + } else { + slice = make([]*Proxy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ProxyList) Each(f func(item *Proxy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ProxyList) Range(f func(index int, item *Proxy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/proxy_type_json.go b/clustersmgmt/v2alpha1/proxy_type_json.go new file mode 100644 index 00000000..1183f3f2 --- /dev/null +++ b/clustersmgmt/v2alpha1/proxy_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalProxy writes a value of the 'proxy' type to the given writer. +func MarshalProxy(object *Proxy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeProxy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeProxy writes a value of the 'proxy' type to the given stream. +func writeProxy(object *Proxy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("http_proxy") + stream.WriteString(object.httpProxy) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("https_proxy") + stream.WriteString(object.httpsProxy) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("no_proxy") + stream.WriteString(object.noProxy) + } + stream.WriteObjectEnd() +} + +// UnmarshalProxy reads a value of the 'proxy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalProxy(source interface{}) (object *Proxy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readProxy(iterator) + err = iterator.Error + return +} + +// readProxy reads a value of the 'proxy' type from the given iterator. +func readProxy(iterator *jsoniter.Iterator) *Proxy { + object := &Proxy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "http_proxy": + value := iterator.ReadString() + object.httpProxy = value + object.bitmap_ |= 1 + case "https_proxy": + value := iterator.ReadString() + object.httpsProxy = value + object.bitmap_ |= 2 + case "no_proxy": + value := iterator.ReadString() + object.noProxy = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/release_image_details_builder.go b/clustersmgmt/v2alpha1/release_image_details_builder.go new file mode 100644 index 00000000..0f2d769f --- /dev/null +++ b/clustersmgmt/v2alpha1/release_image_details_builder.go @@ -0,0 +1,80 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ReleaseImageDetailsBuilder contains the data and logic needed to build 'release_image_details' objects. +type ReleaseImageDetailsBuilder struct { + bitmap_ uint32 + availableUpgrades []string + releaseImage string +} + +// NewReleaseImageDetails creates a new builder of 'release_image_details' objects. +func NewReleaseImageDetails() *ReleaseImageDetailsBuilder { + return &ReleaseImageDetailsBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ReleaseImageDetailsBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AvailableUpgrades sets the value of the 'available_upgrades' attribute to the given values. +func (b *ReleaseImageDetailsBuilder) AvailableUpgrades(values ...string) *ReleaseImageDetailsBuilder { + b.availableUpgrades = make([]string, len(values)) + copy(b.availableUpgrades, values) + b.bitmap_ |= 1 + return b +} + +// ReleaseImage sets the value of the 'release_image' attribute to the given value. +func (b *ReleaseImageDetailsBuilder) ReleaseImage(value string) *ReleaseImageDetailsBuilder { + b.releaseImage = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ReleaseImageDetailsBuilder) Copy(object *ReleaseImageDetails) *ReleaseImageDetailsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.availableUpgrades != nil { + b.availableUpgrades = make([]string, len(object.availableUpgrades)) + copy(b.availableUpgrades, object.availableUpgrades) + } else { + b.availableUpgrades = nil + } + b.releaseImage = object.releaseImage + return b +} + +// Build creates a 'release_image_details' object using the configuration stored in the builder. +func (b *ReleaseImageDetailsBuilder) Build() (object *ReleaseImageDetails, err error) { + object = new(ReleaseImageDetails) + object.bitmap_ = b.bitmap_ + if b.availableUpgrades != nil { + object.availableUpgrades = make([]string, len(b.availableUpgrades)) + copy(object.availableUpgrades, b.availableUpgrades) + } + object.releaseImage = b.releaseImage + return +} diff --git a/clustersmgmt/v2alpha1/release_image_details_list_builder.go b/clustersmgmt/v2alpha1/release_image_details_list_builder.go new file mode 100644 index 00000000..b61e762e --- /dev/null +++ b/clustersmgmt/v2alpha1/release_image_details_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ReleaseImageDetailsListBuilder contains the data and logic needed to build +// 'release_image_details' objects. +type ReleaseImageDetailsListBuilder struct { + items []*ReleaseImageDetailsBuilder +} + +// NewReleaseImageDetailsList creates a new builder of 'release_image_details' objects. +func NewReleaseImageDetailsList() *ReleaseImageDetailsListBuilder { + return new(ReleaseImageDetailsListBuilder) +} + +// Items sets the items of the list. +func (b *ReleaseImageDetailsListBuilder) Items(values ...*ReleaseImageDetailsBuilder) *ReleaseImageDetailsListBuilder { + b.items = make([]*ReleaseImageDetailsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ReleaseImageDetailsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ReleaseImageDetailsListBuilder) Copy(list *ReleaseImageDetailsList) *ReleaseImageDetailsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ReleaseImageDetailsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewReleaseImageDetails().Copy(v) + } + } + return b +} + +// Build creates a list of 'release_image_details' objects using the +// configuration stored in the builder. +func (b *ReleaseImageDetailsListBuilder) Build() (list *ReleaseImageDetailsList, err error) { + items := make([]*ReleaseImageDetails, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ReleaseImageDetailsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/release_image_details_list_type_json.go b/clustersmgmt/v2alpha1/release_image_details_list_type_json.go new file mode 100644 index 00000000..279b418d --- /dev/null +++ b/clustersmgmt/v2alpha1/release_image_details_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalReleaseImageDetailsList writes a list of values of the 'release_image_details' type to +// the given writer. +func MarshalReleaseImageDetailsList(list []*ReleaseImageDetails, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeReleaseImageDetailsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeReleaseImageDetailsList writes a list of value of the 'release_image_details' type to +// the given stream. +func writeReleaseImageDetailsList(list []*ReleaseImageDetails, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeReleaseImageDetails(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalReleaseImageDetailsList reads a list of values of the 'release_image_details' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalReleaseImageDetailsList(source interface{}) (items []*ReleaseImageDetails, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readReleaseImageDetailsList(iterator) + err = iterator.Error + return +} + +// readReleaseImageDetailsList reads list of values of the ”release_image_details' type from +// the given iterator. +func readReleaseImageDetailsList(iterator *jsoniter.Iterator) []*ReleaseImageDetails { + list := []*ReleaseImageDetails{} + for iterator.ReadArray() { + item := readReleaseImageDetails(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/release_image_details_type.go b/clustersmgmt/v2alpha1/release_image_details_type.go new file mode 100644 index 00000000..9e321ca4 --- /dev/null +++ b/clustersmgmt/v2alpha1/release_image_details_type.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ReleaseImageDetails represents the values of the 'release_image_details' type. +type ReleaseImageDetails struct { + bitmap_ uint32 + availableUpgrades []string + releaseImage string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ReleaseImageDetails) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AvailableUpgrades returns the value of the 'available_upgrades' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AvailableUpgrades is the list of versions this version can be upgraded to. +func (o *ReleaseImageDetails) AvailableUpgrades() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.availableUpgrades + } + return nil +} + +// GetAvailableUpgrades returns the value of the 'available_upgrades' attribute and +// a flag indicating if the attribute has a value. +// +// AvailableUpgrades is the list of versions this version can be upgraded to. +func (o *ReleaseImageDetails) GetAvailableUpgrades() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.availableUpgrades + } + return +} + +// ReleaseImage returns the value of the 'release_image' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ReleaseImage contains the URI of Openshift release image. +func (o *ReleaseImageDetails) ReleaseImage() string { + if o != nil && o.bitmap_&2 != 0 { + return o.releaseImage + } + return "" +} + +// GetReleaseImage returns the value of the 'release_image' attribute and +// a flag indicating if the attribute has a value. +// +// ReleaseImage contains the URI of Openshift release image. +func (o *ReleaseImageDetails) GetReleaseImage() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.releaseImage + } + return +} + +// ReleaseImageDetailsListKind is the name of the type used to represent list of objects of +// type 'release_image_details'. +const ReleaseImageDetailsListKind = "ReleaseImageDetailsList" + +// ReleaseImageDetailsListLinkKind is the name of the type used to represent links to list +// of objects of type 'release_image_details'. +const ReleaseImageDetailsListLinkKind = "ReleaseImageDetailsListLink" + +// ReleaseImageDetailsNilKind is the name of the type used to nil lists of objects of +// type 'release_image_details'. +const ReleaseImageDetailsListNilKind = "ReleaseImageDetailsListNil" + +// ReleaseImageDetailsList is a list of values of the 'release_image_details' type. +type ReleaseImageDetailsList struct { + href string + link bool + items []*ReleaseImageDetails +} + +// Len returns the length of the list. +func (l *ReleaseImageDetailsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ReleaseImageDetailsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ReleaseImageDetailsList) Get(i int) *ReleaseImageDetails { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ReleaseImageDetailsList) Slice() []*ReleaseImageDetails { + var slice []*ReleaseImageDetails + if l == nil { + slice = make([]*ReleaseImageDetails, 0) + } else { + slice = make([]*ReleaseImageDetails, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ReleaseImageDetailsList) Each(f func(item *ReleaseImageDetails) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ReleaseImageDetailsList) Range(f func(index int, item *ReleaseImageDetails) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/release_image_details_type_json.go b/clustersmgmt/v2alpha1/release_image_details_type_json.go new file mode 100644 index 00000000..57195104 --- /dev/null +++ b/clustersmgmt/v2alpha1/release_image_details_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalReleaseImageDetails writes a value of the 'release_image_details' type to the given writer. +func MarshalReleaseImageDetails(object *ReleaseImageDetails, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeReleaseImageDetails(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeReleaseImageDetails writes a value of the 'release_image_details' type to the given stream. +func writeReleaseImageDetails(object *ReleaseImageDetails, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.availableUpgrades != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("available_upgrades") + writeStringList(object.availableUpgrades, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("release_image") + stream.WriteString(object.releaseImage) + } + stream.WriteObjectEnd() +} + +// UnmarshalReleaseImageDetails reads a value of the 'release_image_details' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalReleaseImageDetails(source interface{}) (object *ReleaseImageDetails, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readReleaseImageDetails(iterator) + err = iterator.Error + return +} + +// readReleaseImageDetails reads a value of the 'release_image_details' type from the given iterator. +func readReleaseImageDetails(iterator *jsoniter.Iterator) *ReleaseImageDetails { + object := &ReleaseImageDetails{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "available_upgrades": + value := readStringList(iterator) + object.availableUpgrades = value + object.bitmap_ |= 1 + case "release_image": + value := iterator.ReadString() + object.releaseImage = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/release_images_builder.go b/clustersmgmt/v2alpha1/release_images_builder.go new file mode 100644 index 00000000..c0a46ea6 --- /dev/null +++ b/clustersmgmt/v2alpha1/release_images_builder.go @@ -0,0 +1,97 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ReleaseImagesBuilder contains the data and logic needed to build 'release_images' objects. +type ReleaseImagesBuilder struct { + bitmap_ uint32 + arm64 *ReleaseImageDetailsBuilder + multi *ReleaseImageDetailsBuilder +} + +// NewReleaseImages creates a new builder of 'release_images' objects. +func NewReleaseImages() *ReleaseImagesBuilder { + return &ReleaseImagesBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ReleaseImagesBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ARM64 sets the value of the 'ARM64' attribute to the given value. +func (b *ReleaseImagesBuilder) ARM64(value *ReleaseImageDetailsBuilder) *ReleaseImagesBuilder { + b.arm64 = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// Multi sets the value of the 'multi' attribute to the given value. +func (b *ReleaseImagesBuilder) Multi(value *ReleaseImageDetailsBuilder) *ReleaseImagesBuilder { + b.multi = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ReleaseImagesBuilder) Copy(object *ReleaseImages) *ReleaseImagesBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.arm64 != nil { + b.arm64 = NewReleaseImageDetails().Copy(object.arm64) + } else { + b.arm64 = nil + } + if object.multi != nil { + b.multi = NewReleaseImageDetails().Copy(object.multi) + } else { + b.multi = nil + } + return b +} + +// Build creates a 'release_images' object using the configuration stored in the builder. +func (b *ReleaseImagesBuilder) Build() (object *ReleaseImages, err error) { + object = new(ReleaseImages) + object.bitmap_ = b.bitmap_ + if b.arm64 != nil { + object.arm64, err = b.arm64.Build() + if err != nil { + return + } + } + if b.multi != nil { + object.multi, err = b.multi.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/release_images_list_builder.go b/clustersmgmt/v2alpha1/release_images_list_builder.go new file mode 100644 index 00000000..0cefd36e --- /dev/null +++ b/clustersmgmt/v2alpha1/release_images_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ReleaseImagesListBuilder contains the data and logic needed to build +// 'release_images' objects. +type ReleaseImagesListBuilder struct { + items []*ReleaseImagesBuilder +} + +// NewReleaseImagesList creates a new builder of 'release_images' objects. +func NewReleaseImagesList() *ReleaseImagesListBuilder { + return new(ReleaseImagesListBuilder) +} + +// Items sets the items of the list. +func (b *ReleaseImagesListBuilder) Items(values ...*ReleaseImagesBuilder) *ReleaseImagesListBuilder { + b.items = make([]*ReleaseImagesBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ReleaseImagesListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ReleaseImagesListBuilder) Copy(list *ReleaseImagesList) *ReleaseImagesListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ReleaseImagesBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewReleaseImages().Copy(v) + } + } + return b +} + +// Build creates a list of 'release_images' objects using the +// configuration stored in the builder. +func (b *ReleaseImagesListBuilder) Build() (list *ReleaseImagesList, err error) { + items := make([]*ReleaseImages, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ReleaseImagesList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/release_images_list_type_json.go b/clustersmgmt/v2alpha1/release_images_list_type_json.go new file mode 100644 index 00000000..a8181cac --- /dev/null +++ b/clustersmgmt/v2alpha1/release_images_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalReleaseImagesList writes a list of values of the 'release_images' type to +// the given writer. +func MarshalReleaseImagesList(list []*ReleaseImages, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeReleaseImagesList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeReleaseImagesList writes a list of value of the 'release_images' type to +// the given stream. +func writeReleaseImagesList(list []*ReleaseImages, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeReleaseImages(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalReleaseImagesList reads a list of values of the 'release_images' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalReleaseImagesList(source interface{}) (items []*ReleaseImages, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readReleaseImagesList(iterator) + err = iterator.Error + return +} + +// readReleaseImagesList reads list of values of the ”release_images' type from +// the given iterator. +func readReleaseImagesList(iterator *jsoniter.Iterator) []*ReleaseImages { + list := []*ReleaseImages{} + for iterator.ReadArray() { + item := readReleaseImages(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/release_images_type.go b/clustersmgmt/v2alpha1/release_images_type.go new file mode 100644 index 00000000..dfbe7038 --- /dev/null +++ b/clustersmgmt/v2alpha1/release_images_type.go @@ -0,0 +1,164 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ReleaseImages represents the values of the 'release_images' type. +type ReleaseImages struct { + bitmap_ uint32 + arm64 *ReleaseImageDetails + multi *ReleaseImageDetails +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ReleaseImages) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ARM64 returns the value of the 'ARM64' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Arm64 will contain the reference for the arm64 image which will be used for cluster deployments +func (o *ReleaseImages) ARM64() *ReleaseImageDetails { + if o != nil && o.bitmap_&1 != 0 { + return o.arm64 + } + return nil +} + +// GetARM64 returns the value of the 'ARM64' attribute and +// a flag indicating if the attribute has a value. +// +// Arm64 will contain the reference for the arm64 image which will be used for cluster deployments +func (o *ReleaseImages) GetARM64() (value *ReleaseImageDetails, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.arm64 + } + return +} + +// Multi returns the value of the 'multi' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Multi will contain the reference for the multi image which will be used for cluster deployments +func (o *ReleaseImages) Multi() *ReleaseImageDetails { + if o != nil && o.bitmap_&2 != 0 { + return o.multi + } + return nil +} + +// GetMulti returns the value of the 'multi' attribute and +// a flag indicating if the attribute has a value. +// +// Multi will contain the reference for the multi image which will be used for cluster deployments +func (o *ReleaseImages) GetMulti() (value *ReleaseImageDetails, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.multi + } + return +} + +// ReleaseImagesListKind is the name of the type used to represent list of objects of +// type 'release_images'. +const ReleaseImagesListKind = "ReleaseImagesList" + +// ReleaseImagesListLinkKind is the name of the type used to represent links to list +// of objects of type 'release_images'. +const ReleaseImagesListLinkKind = "ReleaseImagesListLink" + +// ReleaseImagesNilKind is the name of the type used to nil lists of objects of +// type 'release_images'. +const ReleaseImagesListNilKind = "ReleaseImagesListNil" + +// ReleaseImagesList is a list of values of the 'release_images' type. +type ReleaseImagesList struct { + href string + link bool + items []*ReleaseImages +} + +// Len returns the length of the list. +func (l *ReleaseImagesList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ReleaseImagesList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ReleaseImagesList) Get(i int) *ReleaseImages { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ReleaseImagesList) Slice() []*ReleaseImages { + var slice []*ReleaseImages + if l == nil { + slice = make([]*ReleaseImages, 0) + } else { + slice = make([]*ReleaseImages, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ReleaseImagesList) Each(f func(item *ReleaseImages) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ReleaseImagesList) Range(f func(index int, item *ReleaseImages) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/release_images_type_json.go b/clustersmgmt/v2alpha1/release_images_type_json.go new file mode 100644 index 00000000..4ebe7a3c --- /dev/null +++ b/clustersmgmt/v2alpha1/release_images_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalReleaseImages writes a value of the 'release_images' type to the given writer. +func MarshalReleaseImages(object *ReleaseImages, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeReleaseImages(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeReleaseImages writes a value of the 'release_images' type to the given stream. +func writeReleaseImages(object *ReleaseImages, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.arm64 != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("arm64") + writeReleaseImageDetails(object.arm64, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.multi != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("multi") + writeReleaseImageDetails(object.multi, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalReleaseImages reads a value of the 'release_images' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalReleaseImages(source interface{}) (object *ReleaseImages, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readReleaseImages(iterator) + err = iterator.Error + return +} + +// readReleaseImages reads a value of the 'release_images' type from the given iterator. +func readReleaseImages(iterator *jsoniter.Iterator) *ReleaseImages { + object := &ReleaseImages{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "arm64": + value := readReleaseImageDetails(iterator) + object.arm64 = value + object.bitmap_ |= 1 + case "multi": + value := readReleaseImageDetails(iterator) + object.multi = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/resource_range_builder.go b/clustersmgmt/v2alpha1/resource_range_builder.go new file mode 100644 index 00000000..9d904bdf --- /dev/null +++ b/clustersmgmt/v2alpha1/resource_range_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ResourceRangeBuilder contains the data and logic needed to build 'resource_range' objects. +type ResourceRangeBuilder struct { + bitmap_ uint32 + max int + min int +} + +// NewResourceRange creates a new builder of 'resource_range' objects. +func NewResourceRange() *ResourceRangeBuilder { + return &ResourceRangeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ResourceRangeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Max sets the value of the 'max' attribute to the given value. +func (b *ResourceRangeBuilder) Max(value int) *ResourceRangeBuilder { + b.max = value + b.bitmap_ |= 1 + return b +} + +// Min sets the value of the 'min' attribute to the given value. +func (b *ResourceRangeBuilder) Min(value int) *ResourceRangeBuilder { + b.min = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ResourceRangeBuilder) Copy(object *ResourceRange) *ResourceRangeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.max = object.max + b.min = object.min + return b +} + +// Build creates a 'resource_range' object using the configuration stored in the builder. +func (b *ResourceRangeBuilder) Build() (object *ResourceRange, err error) { + object = new(ResourceRange) + object.bitmap_ = b.bitmap_ + object.max = b.max + object.min = b.min + return +} diff --git a/clustersmgmt/v2alpha1/resource_range_list_builder.go b/clustersmgmt/v2alpha1/resource_range_list_builder.go new file mode 100644 index 00000000..9e580e26 --- /dev/null +++ b/clustersmgmt/v2alpha1/resource_range_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ResourceRangeListBuilder contains the data and logic needed to build +// 'resource_range' objects. +type ResourceRangeListBuilder struct { + items []*ResourceRangeBuilder +} + +// NewResourceRangeList creates a new builder of 'resource_range' objects. +func NewResourceRangeList() *ResourceRangeListBuilder { + return new(ResourceRangeListBuilder) +} + +// Items sets the items of the list. +func (b *ResourceRangeListBuilder) Items(values ...*ResourceRangeBuilder) *ResourceRangeListBuilder { + b.items = make([]*ResourceRangeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ResourceRangeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ResourceRangeListBuilder) Copy(list *ResourceRangeList) *ResourceRangeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ResourceRangeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewResourceRange().Copy(v) + } + } + return b +} + +// Build creates a list of 'resource_range' objects using the +// configuration stored in the builder. +func (b *ResourceRangeListBuilder) Build() (list *ResourceRangeList, err error) { + items := make([]*ResourceRange, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ResourceRangeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/resource_range_list_type_json.go b/clustersmgmt/v2alpha1/resource_range_list_type_json.go new file mode 100644 index 00000000..bf7a1d4a --- /dev/null +++ b/clustersmgmt/v2alpha1/resource_range_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalResourceRangeList writes a list of values of the 'resource_range' type to +// the given writer. +func MarshalResourceRangeList(list []*ResourceRange, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeResourceRangeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeResourceRangeList writes a list of value of the 'resource_range' type to +// the given stream. +func writeResourceRangeList(list []*ResourceRange, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeResourceRange(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalResourceRangeList reads a list of values of the 'resource_range' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalResourceRangeList(source interface{}) (items []*ResourceRange, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readResourceRangeList(iterator) + err = iterator.Error + return +} + +// readResourceRangeList reads list of values of the ”resource_range' type from +// the given iterator. +func readResourceRangeList(iterator *jsoniter.Iterator) []*ResourceRange { + list := []*ResourceRange{} + for iterator.ReadArray() { + item := readResourceRange(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/resource_range_type.go b/clustersmgmt/v2alpha1/resource_range_type.go new file mode 100644 index 00000000..a57f1cb9 --- /dev/null +++ b/clustersmgmt/v2alpha1/resource_range_type.go @@ -0,0 +1,156 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ResourceRange represents the values of the 'resource_range' type. +type ResourceRange struct { + bitmap_ uint32 + max int + min int +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ResourceRange) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Max returns the value of the 'max' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *ResourceRange) Max() int { + if o != nil && o.bitmap_&1 != 0 { + return o.max + } + return 0 +} + +// GetMax returns the value of the 'max' attribute and +// a flag indicating if the attribute has a value. +func (o *ResourceRange) GetMax() (value int, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.max + } + return +} + +// Min returns the value of the 'min' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *ResourceRange) Min() int { + if o != nil && o.bitmap_&2 != 0 { + return o.min + } + return 0 +} + +// GetMin returns the value of the 'min' attribute and +// a flag indicating if the attribute has a value. +func (o *ResourceRange) GetMin() (value int, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.min + } + return +} + +// ResourceRangeListKind is the name of the type used to represent list of objects of +// type 'resource_range'. +const ResourceRangeListKind = "ResourceRangeList" + +// ResourceRangeListLinkKind is the name of the type used to represent links to list +// of objects of type 'resource_range'. +const ResourceRangeListLinkKind = "ResourceRangeListLink" + +// ResourceRangeNilKind is the name of the type used to nil lists of objects of +// type 'resource_range'. +const ResourceRangeListNilKind = "ResourceRangeListNil" + +// ResourceRangeList is a list of values of the 'resource_range' type. +type ResourceRangeList struct { + href string + link bool + items []*ResourceRange +} + +// Len returns the length of the list. +func (l *ResourceRangeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ResourceRangeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ResourceRangeList) Get(i int) *ResourceRange { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ResourceRangeList) Slice() []*ResourceRange { + var slice []*ResourceRange + if l == nil { + slice = make([]*ResourceRange, 0) + } else { + slice = make([]*ResourceRange, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ResourceRangeList) Each(f func(item *ResourceRange) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ResourceRangeList) Range(f func(index int, item *ResourceRange) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/resource_range_type_json.go b/clustersmgmt/v2alpha1/resource_range_type_json.go new file mode 100644 index 00000000..51f24989 --- /dev/null +++ b/clustersmgmt/v2alpha1/resource_range_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalResourceRange writes a value of the 'resource_range' type to the given writer. +func MarshalResourceRange(object *ResourceRange, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeResourceRange(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeResourceRange writes a value of the 'resource_range' type to the given stream. +func writeResourceRange(object *ResourceRange, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max") + stream.WriteInt(object.max) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("min") + stream.WriteInt(object.min) + } + stream.WriteObjectEnd() +} + +// UnmarshalResourceRange reads a value of the 'resource_range' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalResourceRange(source interface{}) (object *ResourceRange, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readResourceRange(iterator) + err = iterator.Error + return +} + +// readResourceRange reads a value of the 'resource_range' type from the given iterator. +func readResourceRange(iterator *jsoniter.Iterator) *ResourceRange { + object := &ResourceRange{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "max": + value := iterator.ReadInt() + object.max = value + object.bitmap_ |= 1 + case "min": + value := iterator.ReadInt() + object.min = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/resources_client.go b/clustersmgmt/v2alpha1/resources_client.go new file mode 100644 index 00000000..dc637486 --- /dev/null +++ b/clustersmgmt/v2alpha1/resources_client.go @@ -0,0 +1,326 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// ResourcesClient is the client of the 'resources' resource. +// +// Manages a collection of resources for a cluster +type ResourcesClient struct { + transport http.RoundTripper + path string +} + +// NewResourcesClient creates a new client for the 'resources' +// resource using the given transport to send the requests and receive the +// responses. +func NewResourcesClient(transport http.RoundTripper, path string) *ResourcesClient { + return &ResourcesClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves a list of resources for a cluster in error state +func (c *ResourcesClient) Get() *ResourcesGetRequest { + return &ResourcesGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Live returns the target 'cluster_resources' resource. +// +// Retrieves a list of currently available resources for a cluster +func (c *ResourcesClient) Live() *ClusterResourcesClient { + return NewClusterResourcesClient( + c.transport, + path.Join(c.path, "live"), + ) +} + +// ResourcesPollRequest is the request for the Poll method. +type ResourcesPollRequest struct { + request *ResourcesGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *ResourcesPollRequest) Parameter(name string, value interface{}) *ResourcesPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *ResourcesPollRequest) Header(name string, value interface{}) *ResourcesPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *ResourcesPollRequest) Interval(value time.Duration) *ResourcesPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *ResourcesPollRequest) Status(value int) *ResourcesPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *ResourcesPollRequest) Predicate(value func(*ResourcesGetResponse) bool) *ResourcesPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*ResourcesGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *ResourcesPollRequest) StartContext(ctx context.Context) (response *ResourcesPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &ResourcesPollResponse{ + response: result.(*ResourcesGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *ResourcesPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// ResourcesPollResponse is the response for the Poll method. +type ResourcesPollResponse struct { + response *ResourcesGetResponse +} + +// Status returns the response status code. +func (r *ResourcesPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *ResourcesPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *ResourcesPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +// +// List of cluster resources +func (r *ResourcesPollResponse) Body() *ClusterResources { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// List of cluster resources +func (r *ResourcesPollResponse) GetBody() (value *ClusterResources, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *ResourcesClient) Poll() *ResourcesPollRequest { + return &ResourcesPollRequest{ + request: c.Get(), + } +} + +// ResourcesGetRequest is the request for the 'get' method. +type ResourcesGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *ResourcesGetRequest) Parameter(name string, value interface{}) *ResourcesGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *ResourcesGetRequest) Header(name string, value interface{}) *ResourcesGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *ResourcesGetRequest) Impersonate(user string) *ResourcesGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *ResourcesGetRequest) Send() (result *ResourcesGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *ResourcesGetRequest) SendContext(ctx context.Context) (result *ResourcesGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &ResourcesGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readResourcesGetResponse(result, reader) + if err != nil { + return + } + return +} + +// ResourcesGetResponse is the response for the 'get' method. +type ResourcesGetResponse struct { + status int + header http.Header + err *errors.Error + body *ClusterResources +} + +// Status returns the response status code. +func (r *ResourcesGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *ResourcesGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *ResourcesGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// List of cluster resources +func (r *ResourcesGetResponse) Body() *ClusterResources { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// List of cluster resources +func (r *ResourcesGetResponse) GetBody() (value *ClusterResources, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/resources_resource_json.go b/clustersmgmt/v2alpha1/resources_resource_json.go new file mode 100644 index 00000000..e3ce3cb5 --- /dev/null +++ b/clustersmgmt/v2alpha1/resources_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeResourcesGetRequest(request *ResourcesGetRequest, writer io.Writer) error { + return nil +} +func readResourcesGetResponse(response *ResourcesGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalClusterResources(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_builder.go b/clustersmgmt/v2alpha1/role_policy_binding_builder.go new file mode 100644 index 00000000..eba76830 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_builder.go @@ -0,0 +1,154 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// RolePolicyBindingBuilder contains the data and logic needed to build 'role_policy_binding' objects. +type RolePolicyBindingBuilder struct { + bitmap_ uint32 + arn string + creationTimestamp time.Time + lastUpdateTimestamp time.Time + name string + policies []*RolePolicyBuilder + status *RolePolicyBindingStatusBuilder + type_ string +} + +// NewRolePolicyBinding creates a new builder of 'role_policy_binding' objects. +func NewRolePolicyBinding() *RolePolicyBindingBuilder { + return &RolePolicyBindingBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *RolePolicyBindingBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Arn sets the value of the 'arn' attribute to the given value. +func (b *RolePolicyBindingBuilder) Arn(value string) *RolePolicyBindingBuilder { + b.arn = value + b.bitmap_ |= 1 + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *RolePolicyBindingBuilder) CreationTimestamp(value time.Time) *RolePolicyBindingBuilder { + b.creationTimestamp = value + b.bitmap_ |= 2 + return b +} + +// LastUpdateTimestamp sets the value of the 'last_update_timestamp' attribute to the given value. +func (b *RolePolicyBindingBuilder) LastUpdateTimestamp(value time.Time) *RolePolicyBindingBuilder { + b.lastUpdateTimestamp = value + b.bitmap_ |= 4 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *RolePolicyBindingBuilder) Name(value string) *RolePolicyBindingBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Policies sets the value of the 'policies' attribute to the given values. +func (b *RolePolicyBindingBuilder) Policies(values ...*RolePolicyBuilder) *RolePolicyBindingBuilder { + b.policies = make([]*RolePolicyBuilder, len(values)) + copy(b.policies, values) + b.bitmap_ |= 16 + return b +} + +// Status sets the value of the 'status' attribute to the given value. +func (b *RolePolicyBindingBuilder) Status(value *RolePolicyBindingStatusBuilder) *RolePolicyBindingBuilder { + b.status = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *RolePolicyBindingBuilder) Type(value string) *RolePolicyBindingBuilder { + b.type_ = value + b.bitmap_ |= 64 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *RolePolicyBindingBuilder) Copy(object *RolePolicyBinding) *RolePolicyBindingBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.arn = object.arn + b.creationTimestamp = object.creationTimestamp + b.lastUpdateTimestamp = object.lastUpdateTimestamp + b.name = object.name + if object.policies != nil { + b.policies = make([]*RolePolicyBuilder, len(object.policies)) + for i, v := range object.policies { + b.policies[i] = NewRolePolicy().Copy(v) + } + } else { + b.policies = nil + } + if object.status != nil { + b.status = NewRolePolicyBindingStatus().Copy(object.status) + } else { + b.status = nil + } + b.type_ = object.type_ + return b +} + +// Build creates a 'role_policy_binding' object using the configuration stored in the builder. +func (b *RolePolicyBindingBuilder) Build() (object *RolePolicyBinding, err error) { + object = new(RolePolicyBinding) + object.bitmap_ = b.bitmap_ + object.arn = b.arn + object.creationTimestamp = b.creationTimestamp + object.lastUpdateTimestamp = b.lastUpdateTimestamp + object.name = b.name + if b.policies != nil { + object.policies = make([]*RolePolicy, len(b.policies)) + for i, v := range b.policies { + object.policies[i], err = v.Build() + if err != nil { + return + } + } + } + if b.status != nil { + object.status, err = b.status.Build() + if err != nil { + return + } + } + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_list_builder.go b/clustersmgmt/v2alpha1/role_policy_binding_list_builder.go new file mode 100644 index 00000000..8142fab0 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicyBindingListBuilder contains the data and logic needed to build +// 'role_policy_binding' objects. +type RolePolicyBindingListBuilder struct { + items []*RolePolicyBindingBuilder +} + +// NewRolePolicyBindingList creates a new builder of 'role_policy_binding' objects. +func NewRolePolicyBindingList() *RolePolicyBindingListBuilder { + return new(RolePolicyBindingListBuilder) +} + +// Items sets the items of the list. +func (b *RolePolicyBindingListBuilder) Items(values ...*RolePolicyBindingBuilder) *RolePolicyBindingListBuilder { + b.items = make([]*RolePolicyBindingBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *RolePolicyBindingListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *RolePolicyBindingListBuilder) Copy(list *RolePolicyBindingList) *RolePolicyBindingListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*RolePolicyBindingBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewRolePolicyBinding().Copy(v) + } + } + return b +} + +// Build creates a list of 'role_policy_binding' objects using the +// configuration stored in the builder. +func (b *RolePolicyBindingListBuilder) Build() (list *RolePolicyBindingList, err error) { + items := make([]*RolePolicyBinding, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(RolePolicyBindingList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_list_type_json.go b/clustersmgmt/v2alpha1/role_policy_binding_list_type_json.go new file mode 100644 index 00000000..0ddaac68 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRolePolicyBindingList writes a list of values of the 'role_policy_binding' type to +// the given writer. +func MarshalRolePolicyBindingList(list []*RolePolicyBinding, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRolePolicyBindingList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRolePolicyBindingList writes a list of value of the 'role_policy_binding' type to +// the given stream. +func writeRolePolicyBindingList(list []*RolePolicyBinding, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeRolePolicyBinding(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalRolePolicyBindingList reads a list of values of the 'role_policy_binding' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalRolePolicyBindingList(source interface{}) (items []*RolePolicyBinding, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readRolePolicyBindingList(iterator) + err = iterator.Error + return +} + +// readRolePolicyBindingList reads list of values of the ”role_policy_binding' type from +// the given iterator. +func readRolePolicyBindingList(iterator *jsoniter.Iterator) []*RolePolicyBinding { + list := []*RolePolicyBinding{} + for iterator.ReadArray() { + item := readRolePolicyBinding(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_status_builder.go b/clustersmgmt/v2alpha1/role_policy_binding_status_builder.go new file mode 100644 index 00000000..d273da0f --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_status_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicyBindingStatusBuilder contains the data and logic needed to build 'role_policy_binding_status' objects. +type RolePolicyBindingStatusBuilder struct { + bitmap_ uint32 + description string + value string +} + +// NewRolePolicyBindingStatus creates a new builder of 'role_policy_binding_status' objects. +func NewRolePolicyBindingStatus() *RolePolicyBindingStatusBuilder { + return &RolePolicyBindingStatusBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *RolePolicyBindingStatusBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *RolePolicyBindingStatusBuilder) Description(value string) *RolePolicyBindingStatusBuilder { + b.description = value + b.bitmap_ |= 1 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *RolePolicyBindingStatusBuilder) Value(value string) *RolePolicyBindingStatusBuilder { + b.value = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *RolePolicyBindingStatusBuilder) Copy(object *RolePolicyBindingStatus) *RolePolicyBindingStatusBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.description = object.description + b.value = object.value + return b +} + +// Build creates a 'role_policy_binding_status' object using the configuration stored in the builder. +func (b *RolePolicyBindingStatusBuilder) Build() (object *RolePolicyBindingStatus, err error) { + object = new(RolePolicyBindingStatus) + object.bitmap_ = b.bitmap_ + object.description = b.description + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_status_list_builder.go b/clustersmgmt/v2alpha1/role_policy_binding_status_list_builder.go new file mode 100644 index 00000000..525fc75b --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_status_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicyBindingStatusListBuilder contains the data and logic needed to build +// 'role_policy_binding_status' objects. +type RolePolicyBindingStatusListBuilder struct { + items []*RolePolicyBindingStatusBuilder +} + +// NewRolePolicyBindingStatusList creates a new builder of 'role_policy_binding_status' objects. +func NewRolePolicyBindingStatusList() *RolePolicyBindingStatusListBuilder { + return new(RolePolicyBindingStatusListBuilder) +} + +// Items sets the items of the list. +func (b *RolePolicyBindingStatusListBuilder) Items(values ...*RolePolicyBindingStatusBuilder) *RolePolicyBindingStatusListBuilder { + b.items = make([]*RolePolicyBindingStatusBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *RolePolicyBindingStatusListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *RolePolicyBindingStatusListBuilder) Copy(list *RolePolicyBindingStatusList) *RolePolicyBindingStatusListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*RolePolicyBindingStatusBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewRolePolicyBindingStatus().Copy(v) + } + } + return b +} + +// Build creates a list of 'role_policy_binding_status' objects using the +// configuration stored in the builder. +func (b *RolePolicyBindingStatusListBuilder) Build() (list *RolePolicyBindingStatusList, err error) { + items := make([]*RolePolicyBindingStatus, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(RolePolicyBindingStatusList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_status_list_type_json.go b/clustersmgmt/v2alpha1/role_policy_binding_status_list_type_json.go new file mode 100644 index 00000000..d9ae4c63 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_status_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRolePolicyBindingStatusList writes a list of values of the 'role_policy_binding_status' type to +// the given writer. +func MarshalRolePolicyBindingStatusList(list []*RolePolicyBindingStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRolePolicyBindingStatusList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRolePolicyBindingStatusList writes a list of value of the 'role_policy_binding_status' type to +// the given stream. +func writeRolePolicyBindingStatusList(list []*RolePolicyBindingStatus, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeRolePolicyBindingStatus(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalRolePolicyBindingStatusList reads a list of values of the 'role_policy_binding_status' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalRolePolicyBindingStatusList(source interface{}) (items []*RolePolicyBindingStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readRolePolicyBindingStatusList(iterator) + err = iterator.Error + return +} + +// readRolePolicyBindingStatusList reads list of values of the ”role_policy_binding_status' type from +// the given iterator. +func readRolePolicyBindingStatusList(iterator *jsoniter.Iterator) []*RolePolicyBindingStatus { + list := []*RolePolicyBindingStatus{} + for iterator.ReadArray() { + item := readRolePolicyBindingStatus(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_status_type.go b/clustersmgmt/v2alpha1/role_policy_binding_status_type.go new file mode 100644 index 00000000..5a196b78 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_status_type.go @@ -0,0 +1,156 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicyBindingStatus represents the values of the 'role_policy_binding_status' type. +type RolePolicyBindingStatus struct { + bitmap_ uint32 + description string + value string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *RolePolicyBindingStatus) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBindingStatus) Description() string { + if o != nil && o.bitmap_&1 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBindingStatus) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.description + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBindingStatus) Value() string { + if o != nil && o.bitmap_&2 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBindingStatus) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.value + } + return +} + +// RolePolicyBindingStatusListKind is the name of the type used to represent list of objects of +// type 'role_policy_binding_status'. +const RolePolicyBindingStatusListKind = "RolePolicyBindingStatusList" + +// RolePolicyBindingStatusListLinkKind is the name of the type used to represent links to list +// of objects of type 'role_policy_binding_status'. +const RolePolicyBindingStatusListLinkKind = "RolePolicyBindingStatusListLink" + +// RolePolicyBindingStatusNilKind is the name of the type used to nil lists of objects of +// type 'role_policy_binding_status'. +const RolePolicyBindingStatusListNilKind = "RolePolicyBindingStatusListNil" + +// RolePolicyBindingStatusList is a list of values of the 'role_policy_binding_status' type. +type RolePolicyBindingStatusList struct { + href string + link bool + items []*RolePolicyBindingStatus +} + +// Len returns the length of the list. +func (l *RolePolicyBindingStatusList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *RolePolicyBindingStatusList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *RolePolicyBindingStatusList) Get(i int) *RolePolicyBindingStatus { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *RolePolicyBindingStatusList) Slice() []*RolePolicyBindingStatus { + var slice []*RolePolicyBindingStatus + if l == nil { + slice = make([]*RolePolicyBindingStatus, 0) + } else { + slice = make([]*RolePolicyBindingStatus, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *RolePolicyBindingStatusList) Each(f func(item *RolePolicyBindingStatus) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *RolePolicyBindingStatusList) Range(f func(index int, item *RolePolicyBindingStatus) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_status_type_json.go b/clustersmgmt/v2alpha1/role_policy_binding_status_type_json.go new file mode 100644 index 00000000..7e05419a --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_status_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRolePolicyBindingStatus writes a value of the 'role_policy_binding_status' type to the given writer. +func MarshalRolePolicyBindingStatus(object *RolePolicyBindingStatus, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRolePolicyBindingStatus(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRolePolicyBindingStatus writes a value of the 'role_policy_binding_status' type to the given stream. +func writeRolePolicyBindingStatus(object *RolePolicyBindingStatus, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalRolePolicyBindingStatus reads a value of the 'role_policy_binding_status' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalRolePolicyBindingStatus(source interface{}) (object *RolePolicyBindingStatus, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readRolePolicyBindingStatus(iterator) + err = iterator.Error + return +} + +// readRolePolicyBindingStatus reads a value of the 'role_policy_binding_status' type from the given iterator. +func readRolePolicyBindingStatus(iterator *jsoniter.Iterator) *RolePolicyBindingStatus { + object := &RolePolicyBindingStatus{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 1 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_type.go b/clustersmgmt/v2alpha1/role_policy_binding_type.go new file mode 100644 index 00000000..17830638 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_type.go @@ -0,0 +1,260 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// RolePolicyBinding represents the values of the 'role_policy_binding' type. +type RolePolicyBinding struct { + bitmap_ uint32 + arn string + creationTimestamp time.Time + lastUpdateTimestamp time.Time + name string + policies []*RolePolicy + status *RolePolicyBindingStatus + type_ string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *RolePolicyBinding) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Arn returns the value of the 'arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) Arn() string { + if o != nil && o.bitmap_&1 != 0 { + return o.arn + } + return "" +} + +// GetArn returns the value of the 'arn' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.arn + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&2 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// LastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) LastUpdateTimestamp() time.Time { + if o != nil && o.bitmap_&4 != 0 { + return o.lastUpdateTimestamp + } + return time.Time{} +} + +// GetLastUpdateTimestamp returns the value of the 'last_update_timestamp' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetLastUpdateTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.lastUpdateTimestamp + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// Policies returns the value of the 'policies' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) Policies() []*RolePolicy { + if o != nil && o.bitmap_&16 != 0 { + return o.policies + } + return nil +} + +// GetPolicies returns the value of the 'policies' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetPolicies() (value []*RolePolicy, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.policies + } + return +} + +// Status returns the value of the 'status' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) Status() *RolePolicyBindingStatus { + if o != nil && o.bitmap_&32 != 0 { + return o.status + } + return nil +} + +// GetStatus returns the value of the 'status' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetStatus() (value *RolePolicyBindingStatus, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.status + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicyBinding) Type() string { + if o != nil && o.bitmap_&64 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicyBinding) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.type_ + } + return +} + +// RolePolicyBindingListKind is the name of the type used to represent list of objects of +// type 'role_policy_binding'. +const RolePolicyBindingListKind = "RolePolicyBindingList" + +// RolePolicyBindingListLinkKind is the name of the type used to represent links to list +// of objects of type 'role_policy_binding'. +const RolePolicyBindingListLinkKind = "RolePolicyBindingListLink" + +// RolePolicyBindingNilKind is the name of the type used to nil lists of objects of +// type 'role_policy_binding'. +const RolePolicyBindingListNilKind = "RolePolicyBindingListNil" + +// RolePolicyBindingList is a list of values of the 'role_policy_binding' type. +type RolePolicyBindingList struct { + href string + link bool + items []*RolePolicyBinding +} + +// Len returns the length of the list. +func (l *RolePolicyBindingList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *RolePolicyBindingList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *RolePolicyBindingList) Get(i int) *RolePolicyBinding { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *RolePolicyBindingList) Slice() []*RolePolicyBinding { + var slice []*RolePolicyBinding + if l == nil { + slice = make([]*RolePolicyBinding, 0) + } else { + slice = make([]*RolePolicyBinding, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *RolePolicyBindingList) Each(f func(item *RolePolicyBinding) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *RolePolicyBindingList) Range(f func(index int, item *RolePolicyBinding) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/role_policy_binding_type_json.go b/clustersmgmt/v2alpha1/role_policy_binding_type_json.go new file mode 100644 index 00000000..ed22e039 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_binding_type_json.go @@ -0,0 +1,173 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRolePolicyBinding writes a value of the 'role_policy_binding' type to the given writer. +func MarshalRolePolicyBinding(object *RolePolicyBinding, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRolePolicyBinding(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRolePolicyBinding writes a value of the 'role_policy_binding' type to the given stream. +func writeRolePolicyBinding(object *RolePolicyBinding, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("arn") + stream.WriteString(object.arn) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("last_update_timestamp") + stream.WriteString((object.lastUpdateTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&16 != 0 && object.policies != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("policies") + writeRolePolicyList(object.policies, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.status != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("status") + writeRolePolicyBindingStatus(object.status, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalRolePolicyBinding reads a value of the 'role_policy_binding' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalRolePolicyBinding(source interface{}) (object *RolePolicyBinding, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readRolePolicyBinding(iterator) + err = iterator.Error + return +} + +// readRolePolicyBinding reads a value of the 'role_policy_binding' type from the given iterator. +func readRolePolicyBinding(iterator *jsoniter.Iterator) *RolePolicyBinding { + object := &RolePolicyBinding{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "arn": + value := iterator.ReadString() + object.arn = value + object.bitmap_ |= 1 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 2 + case "last_update_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.lastUpdateTimestamp = value + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + case "policies": + value := readRolePolicyList(iterator) + object.policies = value + object.bitmap_ |= 16 + case "status": + value := readRolePolicyBindingStatus(iterator) + object.status = value + object.bitmap_ |= 32 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/role_policy_bindings_client.go b/clustersmgmt/v2alpha1/role_policy_bindings_client.go new file mode 100644 index 00000000..27945a9e --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_bindings_client.go @@ -0,0 +1,294 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// RolePolicyBindingsClient is the client of the 'role_policy_bindings' resource. +type RolePolicyBindingsClient struct { + transport http.RoundTripper + path string +} + +// NewRolePolicyBindingsClient creates a new client for the 'role_policy_bindings' +// resource using the given transport to send the requests and receive the +// responses. +func NewRolePolicyBindingsClient(transport http.RoundTripper, path string) *RolePolicyBindingsClient { + return &RolePolicyBindingsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +func (c *RolePolicyBindingsClient) List() *RolePolicyBindingsListRequest { + return &RolePolicyBindingsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// RolePolicyBindingsListRequest is the request for the 'list' method. +type RolePolicyBindingsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + fetchCurrent *bool + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *RolePolicyBindingsListRequest) Parameter(name string, value interface{}) *RolePolicyBindingsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *RolePolicyBindingsListRequest) Header(name string, value interface{}) *RolePolicyBindingsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *RolePolicyBindingsListRequest) Impersonate(user string) *RolePolicyBindingsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// FetchCurrent sets the value of the 'fetch_current' parameter. +// +// If true, retrieves role policy binding states from AWS. +func (r *RolePolicyBindingsListRequest) FetchCurrent(value bool) *RolePolicyBindingsListRequest { + r.fetchCurrent = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *RolePolicyBindingsListRequest) Page(value int) *RolePolicyBindingsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *RolePolicyBindingsListRequest) Size(value int) *RolePolicyBindingsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *RolePolicyBindingsListRequest) Send() (result *RolePolicyBindingsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *RolePolicyBindingsListRequest) SendContext(ctx context.Context) (result *RolePolicyBindingsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.fetchCurrent != nil { + helpers.AddValue(&query, "fetchCurrent", *r.fetchCurrent) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &RolePolicyBindingsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readRolePolicyBindingsListResponse(result, reader) + if err != nil { + return + } + return +} + +// RolePolicyBindingsListResponse is the response for the 'list' method. +type RolePolicyBindingsListResponse struct { + status int + header http.Header + err *errors.Error + items *RolePolicyBindingList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *RolePolicyBindingsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *RolePolicyBindingsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *RolePolicyBindingsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of role policy bindings. +func (r *RolePolicyBindingsListResponse) Items() *RolePolicyBindingList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of role policy bindings. +func (r *RolePolicyBindingsListResponse) GetItems() (value *RolePolicyBindingList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *RolePolicyBindingsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *RolePolicyBindingsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *RolePolicyBindingsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *RolePolicyBindingsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *RolePolicyBindingsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *RolePolicyBindingsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_bindings_resource_json.go b/clustersmgmt/v2alpha1/role_policy_bindings_resource_json.go new file mode 100644 index 00000000..218be107 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_bindings_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeRolePolicyBindingsListRequest(request *RolePolicyBindingsListRequest, writer io.Writer) error { + return nil +} +func readRolePolicyBindingsListResponse(response *RolePolicyBindingsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readRolePolicyBindingList(iterator) + response.items = &RolePolicyBindingList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/role_policy_builder.go b/clustersmgmt/v2alpha1/role_policy_builder.go new file mode 100644 index 00000000..ac88c0ee --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_builder.go @@ -0,0 +1,81 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicyBuilder contains the data and logic needed to build 'role_policy' objects. +type RolePolicyBuilder struct { + bitmap_ uint32 + arn string + name string + type_ string +} + +// NewRolePolicy creates a new builder of 'role_policy' objects. +func NewRolePolicy() *RolePolicyBuilder { + return &RolePolicyBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *RolePolicyBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Arn sets the value of the 'arn' attribute to the given value. +func (b *RolePolicyBuilder) Arn(value string) *RolePolicyBuilder { + b.arn = value + b.bitmap_ |= 1 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *RolePolicyBuilder) Name(value string) *RolePolicyBuilder { + b.name = value + b.bitmap_ |= 2 + return b +} + +// Type sets the value of the 'type' attribute to the given value. +func (b *RolePolicyBuilder) Type(value string) *RolePolicyBuilder { + b.type_ = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *RolePolicyBuilder) Copy(object *RolePolicy) *RolePolicyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.arn = object.arn + b.name = object.name + b.type_ = object.type_ + return b +} + +// Build creates a 'role_policy' object using the configuration stored in the builder. +func (b *RolePolicyBuilder) Build() (object *RolePolicy, err error) { + object = new(RolePolicy) + object.bitmap_ = b.bitmap_ + object.arn = b.arn + object.name = b.name + object.type_ = b.type_ + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_list_builder.go b/clustersmgmt/v2alpha1/role_policy_list_builder.go new file mode 100644 index 00000000..0cf46bf8 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicyListBuilder contains the data and logic needed to build +// 'role_policy' objects. +type RolePolicyListBuilder struct { + items []*RolePolicyBuilder +} + +// NewRolePolicyList creates a new builder of 'role_policy' objects. +func NewRolePolicyList() *RolePolicyListBuilder { + return new(RolePolicyListBuilder) +} + +// Items sets the items of the list. +func (b *RolePolicyListBuilder) Items(values ...*RolePolicyBuilder) *RolePolicyListBuilder { + b.items = make([]*RolePolicyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *RolePolicyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *RolePolicyListBuilder) Copy(list *RolePolicyList) *RolePolicyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*RolePolicyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewRolePolicy().Copy(v) + } + } + return b +} + +// Build creates a list of 'role_policy' objects using the +// configuration stored in the builder. +func (b *RolePolicyListBuilder) Build() (list *RolePolicyList, err error) { + items := make([]*RolePolicy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(RolePolicyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/role_policy_list_type_json.go b/clustersmgmt/v2alpha1/role_policy_list_type_json.go new file mode 100644 index 00000000..9d088858 --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRolePolicyList writes a list of values of the 'role_policy' type to +// the given writer. +func MarshalRolePolicyList(list []*RolePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRolePolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRolePolicyList writes a list of value of the 'role_policy' type to +// the given stream. +func writeRolePolicyList(list []*RolePolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeRolePolicy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalRolePolicyList reads a list of values of the 'role_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalRolePolicyList(source interface{}) (items []*RolePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readRolePolicyList(iterator) + err = iterator.Error + return +} + +// readRolePolicyList reads list of values of the ”role_policy' type from +// the given iterator. +func readRolePolicyList(iterator *jsoniter.Iterator) []*RolePolicy { + list := []*RolePolicy{} + for iterator.ReadArray() { + item := readRolePolicy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/role_policy_type.go b/clustersmgmt/v2alpha1/role_policy_type.go new file mode 100644 index 00000000..b030c2bc --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_type.go @@ -0,0 +1,176 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RolePolicy represents the values of the 'role_policy' type. +type RolePolicy struct { + bitmap_ uint32 + arn string + name string + type_ string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *RolePolicy) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Arn returns the value of the 'arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicy) Arn() string { + if o != nil && o.bitmap_&1 != 0 { + return o.arn + } + return "" +} + +// GetArn returns the value of the 'arn' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicy) GetArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.arn + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicy) Name() string { + if o != nil && o.bitmap_&2 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicy) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.name + } + return +} + +// Type returns the value of the 'type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *RolePolicy) Type() string { + if o != nil && o.bitmap_&4 != 0 { + return o.type_ + } + return "" +} + +// GetType returns the value of the 'type' attribute and +// a flag indicating if the attribute has a value. +func (o *RolePolicy) GetType() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.type_ + } + return +} + +// RolePolicyListKind is the name of the type used to represent list of objects of +// type 'role_policy'. +const RolePolicyListKind = "RolePolicyList" + +// RolePolicyListLinkKind is the name of the type used to represent links to list +// of objects of type 'role_policy'. +const RolePolicyListLinkKind = "RolePolicyListLink" + +// RolePolicyNilKind is the name of the type used to nil lists of objects of +// type 'role_policy'. +const RolePolicyListNilKind = "RolePolicyListNil" + +// RolePolicyList is a list of values of the 'role_policy' type. +type RolePolicyList struct { + href string + link bool + items []*RolePolicy +} + +// Len returns the length of the list. +func (l *RolePolicyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *RolePolicyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *RolePolicyList) Get(i int) *RolePolicy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *RolePolicyList) Slice() []*RolePolicy { + var slice []*RolePolicy + if l == nil { + slice = make([]*RolePolicy, 0) + } else { + slice = make([]*RolePolicy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *RolePolicyList) Each(f func(item *RolePolicy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *RolePolicyList) Range(f func(index int, item *RolePolicy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/role_policy_type_json.go b/clustersmgmt/v2alpha1/role_policy_type_json.go new file mode 100644 index 00000000..a758dc8f --- /dev/null +++ b/clustersmgmt/v2alpha1/role_policy_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRolePolicy writes a value of the 'role_policy' type to the given writer. +func MarshalRolePolicy(object *RolePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRolePolicy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRolePolicy writes a value of the 'role_policy' type to the given stream. +func writeRolePolicy(object *RolePolicy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("arn") + stream.WriteString(object.arn) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("type") + stream.WriteString(object.type_) + } + stream.WriteObjectEnd() +} + +// UnmarshalRolePolicy reads a value of the 'role_policy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalRolePolicy(source interface{}) (object *RolePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readRolePolicy(iterator) + err = iterator.Error + return +} + +// readRolePolicy reads a value of the 'role_policy' type from the given iterator. +func readRolePolicy(iterator *jsoniter.Iterator) *RolePolicy { + object := &RolePolicy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "arn": + value := iterator.ReadString() + object.arn = value + object.bitmap_ |= 1 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 2 + case "type": + value := iterator.ReadString() + object.type_ = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/root_client.go b/clustersmgmt/v2alpha1/root_client.go new file mode 100644 index 00000000..2fd66d28 --- /dev/null +++ b/clustersmgmt/v2alpha1/root_client.go @@ -0,0 +1,292 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "net/http" + "path" +) + +// Client is the client of the 'root' resource. +// +// Root of the tree of resources of the clusters management service. +type Client struct { + transport http.RoundTripper + path string +} + +// NewClient creates a new client for the 'root' +// resource using the given transport to send the requests and receive the +// responses. +func NewClient(transport http.RoundTripper, path string) *Client { + return &Client{ + transport: transport, + path: path, + } +} + +// Creates a new request for the method that retrieves the metadata. +func (c *Client) Get() *MetadataRequest { + return &MetadataRequest{ + transport: c.transport, + path: c.path, + } +} + +// AWSInfrastructureAccessRoles returns the target 'AWS_infrastructure_access_roles' resource. +// +// Reference to the resource that manages the collection of AWS +// infrastructure access roles. +func (c *Client) AWSInfrastructureAccessRoles() *AWSInfrastructureAccessRolesClient { + return NewAWSInfrastructureAccessRolesClient( + c.transport, + path.Join(c.path, "aws_infrastructure_access_roles"), + ) +} + +// AWSInquiries returns the target 'AWS_inquiries' resource. +// +// Reference to the resource that manages the collection of aws inquiries. +func (c *Client) AWSInquiries() *AWSInquiriesClient { + return NewAWSInquiriesClient( + c.transport, + path.Join(c.path, "aws_inquiries"), + ) +} + +// DNSDomains returns the target 'DNS_domains' resource. +// +// Reference to the resource that manages dns domains. +func (c *Client) DNSDomains() *DNSDomainsClient { + return NewDNSDomainsClient( + c.transport, + path.Join(c.path, "dns_domains"), + ) +} + +// GCPInquiries returns the target 'GCP_inquiries' resource. +// +// Reference to the resource that manages the collection of gcp inquiries. +func (c *Client) GCPInquiries() *GCPInquiriesClient { + return NewGCPInquiriesClient( + c.transport, + path.Join(c.path, "gcp_inquiries"), + ) +} + +// Addons returns the target 'add_ons' resource. +// +// Reference to the resource that manages the collection of add-ons. +func (c *Client) Addons() *AddOnsClient { + return NewAddOnsClient( + c.transport, + path.Join(c.path, "addons"), + ) +} + +// CloudProviders returns the target 'cloud_providers' resource. +// +// Reference to the resource that manages the collection of cloud providers. +func (c *Client) CloudProviders() *CloudProvidersClient { + return NewCloudProvidersClient( + c.transport, + path.Join(c.path, "cloud_providers"), + ) +} + +// Clusters returns the target 'clusters' resource. +// +// Reference to the resource that manages the collection of clusters. +func (c *Client) Clusters() *ClustersClient { + return NewClustersClient( + c.transport, + path.Join(c.path, "clusters"), + ) +} + +// Environment returns the target 'environment' resource. +// +// Reference to the resource that manages the environment. +func (c *Client) Environment() *EnvironmentClient { + return NewEnvironmentClient( + c.transport, + path.Join(c.path, "environment"), + ) +} + +// Events returns the target 'events' resource. +// +// Reference to the resource that manages the collection of trackable events. +func (c *Client) Events() *EventsClient { + return NewEventsClient( + c.transport, + path.Join(c.path, "events"), + ) +} + +// Flavours returns the target 'flavours' resource. +// +// Reference to the service that manages the collection of flavours. +func (c *Client) Flavours() *FlavoursClient { + return NewFlavoursClient( + c.transport, + path.Join(c.path, "flavours"), + ) +} + +// LimitedSupportReasonTemplates returns the target 'limited_support_reason_templates' resource. +// +// Reference to limited support reason templates. +func (c *Client) LimitedSupportReasonTemplates() *LimitedSupportReasonTemplatesClient { + return NewLimitedSupportReasonTemplatesClient( + c.transport, + path.Join(c.path, "limited_support_reason_templates"), + ) +} + +// LoadBalancerQuotaValues returns the target 'load_balancer_quota_values' resource. +// +// Reference to the resource that manages the load balancer quota values. +func (c *Client) LoadBalancerQuotaValues() *LoadBalancerQuotaValuesClient { + return NewLoadBalancerQuotaValuesClient( + c.transport, + path.Join(c.path, "load_balancer_quota_values"), + ) +} + +// MachineTypes returns the target 'machine_types' resource. +// +// Reference to the resource that manage the collection of machine types. +func (c *Client) MachineTypes() *MachineTypesClient { + return NewMachineTypesClient( + c.transport, + path.Join(c.path, "machine_types"), + ) +} + +// NetworkVerifications returns the target 'network_verifications' resource. +// +// Reference to the resource that manages network verifications. +func (c *Client) NetworkVerifications() *NetworkVerificationsClient { + return NewNetworkVerificationsClient( + c.transport, + path.Join(c.path, "network_verifications"), + ) +} + +// OidcConfigs returns the target 'oidc_configs' resource. +// +// Reference to the resource that manages oidc. +func (c *Client) OidcConfigs() *OidcConfigsClient { + return NewOidcConfigsClient( + c.transport, + path.Join(c.path, "oidc_configs"), + ) +} + +// PendingDeleteClusters returns the target 'pending_delete_clusters' resource. +// +// Reference to the resource that manages the collection of pending delete clusters. +func (c *Client) PendingDeleteClusters() *PendingDeleteClustersClient { + return NewPendingDeleteClustersClient( + c.transport, + path.Join(c.path, "pending_delete_clusters"), + ) +} + +// Products returns the target 'products' resource. +// +// Reference to the resource that manages the collection of products. +func (c *Client) Products() *ProductsClient { + return NewProductsClient( + c.transport, + path.Join(c.path, "products"), + ) +} + +// ProvisionShards returns the target 'provision_shards' resource. +// +// Reference to the resource that manages the collection of provision shards. +func (c *Client) ProvisionShards() *ProvisionShardsClient { + return NewProvisionShardsClient( + c.transport, + path.Join(c.path, "provision_shards"), + ) +} + +// StorageQuotaValues returns the target 'storage_quota_values' resource. +// +// Reference to the resource that manages the storage quota values. +func (c *Client) StorageQuotaValues() *StorageQuotaValuesClient { + return NewStorageQuotaValuesClient( + c.transport, + path.Join(c.path, "storage_quota_values"), + ) +} + +// TrustedIPAddresses returns the target 'trusted_ips' resource. +// +// Reference to the resource that manages the collection of trusted ip addresses. +func (c *Client) TrustedIPAddresses() *TrustedIpsClient { + return NewTrustedIpsClient( + c.transport, + path.Join(c.path, "trusted_ip_addresses"), + ) +} + +// VersionGates returns the target 'version_gates' resource. +// +// Reference to version gates. +func (c *Client) VersionGates() *VersionGatesClient { + return NewVersionGatesClient( + c.transport, + path.Join(c.path, "version_gates"), + ) +} + +// Versions returns the target 'versions' resource. +// +// Reference to the resource that manage the collection of versions. +func (c *Client) Versions() *VersionsClient { + return NewVersionsClient( + c.transport, + path.Join(c.path, "versions"), + ) +} + +// WifConfigs returns the target 'wif_configs' resource. +// +// Reference to the resource that manages wif_configs +func (c *Client) WifConfigs() *WifConfigsClient { + return NewWifConfigsClient( + c.transport, + path.Join(c.path, "wif_configs"), + ) +} + +// WifTemplates returns the target 'wif_template' resource. +// +// Reference to the resource that manages wif_templates +func (c *Client) WifTemplates() *WifTemplateClient { + return NewWifTemplateClient( + c.transport, + path.Join(c.path, "wif_templates"), + ) +} diff --git a/clustersmgmt/v2alpha1/root_resource_json.go b/clustersmgmt/v2alpha1/root_resource_json.go new file mode 100644 index 00000000..45f0dd4e --- /dev/null +++ b/clustersmgmt/v2alpha1/root_resource_json.go @@ -0,0 +1,20 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 diff --git a/clustersmgmt/v2alpha1/root_volume_builder.go b/clustersmgmt/v2alpha1/root_volume_builder.go new file mode 100644 index 00000000..5e3e9ff2 --- /dev/null +++ b/clustersmgmt/v2alpha1/root_volume_builder.go @@ -0,0 +1,103 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RootVolumeBuilder contains the data and logic needed to build 'root_volume' objects. +// +// Root volume capabilities. +type RootVolumeBuilder struct { + bitmap_ uint32 + aws *AWSVolumeBuilder + gcp *GCPVolumeBuilder +} + +// NewRootVolume creates a new builder of 'root_volume' objects. +func NewRootVolume() *RootVolumeBuilder { + return &RootVolumeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *RootVolumeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AWS sets the value of the 'AWS' attribute to the given value. +// +// Holds settings for an AWS storage volume. +func (b *RootVolumeBuilder) AWS(value *AWSVolumeBuilder) *RootVolumeBuilder { + b.aws = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// GCP sets the value of the 'GCP' attribute to the given value. +// +// Holds settings for an GCP storage volume. +func (b *RootVolumeBuilder) GCP(value *GCPVolumeBuilder) *RootVolumeBuilder { + b.gcp = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *RootVolumeBuilder) Copy(object *RootVolume) *RootVolumeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.aws != nil { + b.aws = NewAWSVolume().Copy(object.aws) + } else { + b.aws = nil + } + if object.gcp != nil { + b.gcp = NewGCPVolume().Copy(object.gcp) + } else { + b.gcp = nil + } + return b +} + +// Build creates a 'root_volume' object using the configuration stored in the builder. +func (b *RootVolumeBuilder) Build() (object *RootVolume, err error) { + object = new(RootVolume) + object.bitmap_ = b.bitmap_ + if b.aws != nil { + object.aws, err = b.aws.Build() + if err != nil { + return + } + } + if b.gcp != nil { + object.gcp, err = b.gcp.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/root_volume_list_builder.go b/clustersmgmt/v2alpha1/root_volume_list_builder.go new file mode 100644 index 00000000..a39c50a0 --- /dev/null +++ b/clustersmgmt/v2alpha1/root_volume_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RootVolumeListBuilder contains the data and logic needed to build +// 'root_volume' objects. +type RootVolumeListBuilder struct { + items []*RootVolumeBuilder +} + +// NewRootVolumeList creates a new builder of 'root_volume' objects. +func NewRootVolumeList() *RootVolumeListBuilder { + return new(RootVolumeListBuilder) +} + +// Items sets the items of the list. +func (b *RootVolumeListBuilder) Items(values ...*RootVolumeBuilder) *RootVolumeListBuilder { + b.items = make([]*RootVolumeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *RootVolumeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *RootVolumeListBuilder) Copy(list *RootVolumeList) *RootVolumeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*RootVolumeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewRootVolume().Copy(v) + } + } + return b +} + +// Build creates a list of 'root_volume' objects using the +// configuration stored in the builder. +func (b *RootVolumeListBuilder) Build() (list *RootVolumeList, err error) { + items := make([]*RootVolume, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(RootVolumeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/root_volume_list_type_json.go b/clustersmgmt/v2alpha1/root_volume_list_type_json.go new file mode 100644 index 00000000..ed7b6eb6 --- /dev/null +++ b/clustersmgmt/v2alpha1/root_volume_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRootVolumeList writes a list of values of the 'root_volume' type to +// the given writer. +func MarshalRootVolumeList(list []*RootVolume, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRootVolumeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRootVolumeList writes a list of value of the 'root_volume' type to +// the given stream. +func writeRootVolumeList(list []*RootVolume, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeRootVolume(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalRootVolumeList reads a list of values of the 'root_volume' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalRootVolumeList(source interface{}) (items []*RootVolume, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readRootVolumeList(iterator) + err = iterator.Error + return +} + +// readRootVolumeList reads list of values of the ”root_volume' type from +// the given iterator. +func readRootVolumeList(iterator *jsoniter.Iterator) []*RootVolume { + list := []*RootVolume{} + for iterator.ReadArray() { + item := readRootVolume(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/root_volume_type.go b/clustersmgmt/v2alpha1/root_volume_type.go new file mode 100644 index 00000000..d3a128f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/root_volume_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// RootVolume represents the values of the 'root_volume' type. +// +// Root volume capabilities. +type RootVolume struct { + bitmap_ uint32 + aws *AWSVolume + gcp *GCPVolume +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *RootVolume) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AWS returns the value of the 'AWS' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AWS volume specification +func (o *RootVolume) AWS() *AWSVolume { + if o != nil && o.bitmap_&1 != 0 { + return o.aws + } + return nil +} + +// GetAWS returns the value of the 'AWS' attribute and +// a flag indicating if the attribute has a value. +// +// AWS volume specification +func (o *RootVolume) GetAWS() (value *AWSVolume, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.aws + } + return +} + +// GCP returns the value of the 'GCP' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCP Volume specification +func (o *RootVolume) GCP() *GCPVolume { + if o != nil && o.bitmap_&2 != 0 { + return o.gcp + } + return nil +} + +// GetGCP returns the value of the 'GCP' attribute and +// a flag indicating if the attribute has a value. +// +// GCP Volume specification +func (o *RootVolume) GetGCP() (value *GCPVolume, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.gcp + } + return +} + +// RootVolumeListKind is the name of the type used to represent list of objects of +// type 'root_volume'. +const RootVolumeListKind = "RootVolumeList" + +// RootVolumeListLinkKind is the name of the type used to represent links to list +// of objects of type 'root_volume'. +const RootVolumeListLinkKind = "RootVolumeListLink" + +// RootVolumeNilKind is the name of the type used to nil lists of objects of +// type 'root_volume'. +const RootVolumeListNilKind = "RootVolumeListNil" + +// RootVolumeList is a list of values of the 'root_volume' type. +type RootVolumeList struct { + href string + link bool + items []*RootVolume +} + +// Len returns the length of the list. +func (l *RootVolumeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *RootVolumeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *RootVolumeList) Get(i int) *RootVolume { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *RootVolumeList) Slice() []*RootVolume { + var slice []*RootVolume + if l == nil { + slice = make([]*RootVolume, 0) + } else { + slice = make([]*RootVolume, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *RootVolumeList) Each(f func(item *RootVolume) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *RootVolumeList) Range(f func(index int, item *RootVolume) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/root_volume_type_json.go b/clustersmgmt/v2alpha1/root_volume_type_json.go new file mode 100644 index 00000000..21728cfe --- /dev/null +++ b/clustersmgmt/v2alpha1/root_volume_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalRootVolume writes a value of the 'root_volume' type to the given writer. +func MarshalRootVolume(object *RootVolume, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeRootVolume(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeRootVolume writes a value of the 'root_volume' type to the given stream. +func writeRootVolume(object *RootVolume, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.aws != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("aws") + writeAWSVolume(object.aws, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.gcp != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp") + writeGCPVolume(object.gcp, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalRootVolume reads a value of the 'root_volume' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalRootVolume(source interface{}) (object *RootVolume, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readRootVolume(iterator) + err = iterator.Error + return +} + +// readRootVolume reads a value of the 'root_volume' type from the given iterator. +func readRootVolume(iterator *jsoniter.Iterator) *RootVolume { + object := &RootVolume{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "aws": + value := readAWSVolume(iterator) + object.aws = value + object.bitmap_ |= 1 + case "gcp": + value := readGCPVolume(iterator) + object.gcp = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/schedule_type_list_type_json.go b/clustersmgmt/v2alpha1/schedule_type_list_type_json.go new file mode 100644 index 00000000..e97b7f69 --- /dev/null +++ b/clustersmgmt/v2alpha1/schedule_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalScheduleTypeList writes a list of values of the 'schedule_type' type to +// the given writer. +func MarshalScheduleTypeList(list []ScheduleType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeScheduleTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeScheduleTypeList writes a list of value of the 'schedule_type' type to +// the given stream. +func writeScheduleTypeList(list []ScheduleType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalScheduleTypeList reads a list of values of the 'schedule_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalScheduleTypeList(source interface{}) (items []ScheduleType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readScheduleTypeList(iterator) + err = iterator.Error + return +} + +// readScheduleTypeList reads list of values of the ”schedule_type' type from +// the given iterator. +func readScheduleTypeList(iterator *jsoniter.Iterator) []ScheduleType { + list := []ScheduleType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := ScheduleType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/schedule_type_type.go b/clustersmgmt/v2alpha1/schedule_type_type.go new file mode 100644 index 00000000..48b4288c --- /dev/null +++ b/clustersmgmt/v2alpha1/schedule_type_type.go @@ -0,0 +1,33 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ScheduleType represents the values of the 'schedule_type' enumerated type. +type ScheduleType string + +const ( + // Automatic schedule type for automatically upgrade to the latest available version, at the next scheduled time, + // as defined by the 'scheduled' cron expression. Note that by default, automatic upgrade will pick only + // the latest Z stream. To enable minor version upgrades automatically, you will need to set the + // 'enable_minor_version_upgrades' to be 'true'. Major version upgrades are not supported. + ScheduleTypeAutomatic ScheduleType = "automatic" + // Manual schedule type is for upgrades scheduled manually by a user, to a specific version, at a specific time. + ScheduleTypeManual ScheduleType = "manual" +) diff --git a/clustersmgmt/v2alpha1/security_group_builder.go b/clustersmgmt/v2alpha1/security_group_builder.go new file mode 100644 index 00000000..c881acb6 --- /dev/null +++ b/clustersmgmt/v2alpha1/security_group_builder.go @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SecurityGroupBuilder contains the data and logic needed to build 'security_group' objects. +// +// AWS security group object +type SecurityGroupBuilder struct { + bitmap_ uint32 + id string + name string + redHatManaged bool +} + +// NewSecurityGroup creates a new builder of 'security_group' objects. +func NewSecurityGroup() *SecurityGroupBuilder { + return &SecurityGroupBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SecurityGroupBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ID sets the value of the 'ID' attribute to the given value. +func (b *SecurityGroupBuilder) ID(value string) *SecurityGroupBuilder { + b.id = value + b.bitmap_ |= 1 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *SecurityGroupBuilder) Name(value string) *SecurityGroupBuilder { + b.name = value + b.bitmap_ |= 2 + return b +} + +// RedHatManaged sets the value of the 'red_hat_managed' attribute to the given value. +func (b *SecurityGroupBuilder) RedHatManaged(value bool) *SecurityGroupBuilder { + b.redHatManaged = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SecurityGroupBuilder) Copy(object *SecurityGroup) *SecurityGroupBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.name = object.name + b.redHatManaged = object.redHatManaged + return b +} + +// Build creates a 'security_group' object using the configuration stored in the builder. +func (b *SecurityGroupBuilder) Build() (object *SecurityGroup, err error) { + object = new(SecurityGroup) + object.bitmap_ = b.bitmap_ + object.id = b.id + object.name = b.name + object.redHatManaged = b.redHatManaged + return +} diff --git a/clustersmgmt/v2alpha1/security_group_list_builder.go b/clustersmgmt/v2alpha1/security_group_list_builder.go new file mode 100644 index 00000000..94fd5e85 --- /dev/null +++ b/clustersmgmt/v2alpha1/security_group_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SecurityGroupListBuilder contains the data and logic needed to build +// 'security_group' objects. +type SecurityGroupListBuilder struct { + items []*SecurityGroupBuilder +} + +// NewSecurityGroupList creates a new builder of 'security_group' objects. +func NewSecurityGroupList() *SecurityGroupListBuilder { + return new(SecurityGroupListBuilder) +} + +// Items sets the items of the list. +func (b *SecurityGroupListBuilder) Items(values ...*SecurityGroupBuilder) *SecurityGroupListBuilder { + b.items = make([]*SecurityGroupBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SecurityGroupListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SecurityGroupListBuilder) Copy(list *SecurityGroupList) *SecurityGroupListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SecurityGroupBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSecurityGroup().Copy(v) + } + } + return b +} + +// Build creates a list of 'security_group' objects using the +// configuration stored in the builder. +func (b *SecurityGroupListBuilder) Build() (list *SecurityGroupList, err error) { + items := make([]*SecurityGroup, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SecurityGroupList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/security_group_list_type_json.go b/clustersmgmt/v2alpha1/security_group_list_type_json.go new file mode 100644 index 00000000..a24e2168 --- /dev/null +++ b/clustersmgmt/v2alpha1/security_group_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSecurityGroupList writes a list of values of the 'security_group' type to +// the given writer. +func MarshalSecurityGroupList(list []*SecurityGroup, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSecurityGroupList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSecurityGroupList writes a list of value of the 'security_group' type to +// the given stream. +func writeSecurityGroupList(list []*SecurityGroup, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSecurityGroup(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSecurityGroupList reads a list of values of the 'security_group' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSecurityGroupList(source interface{}) (items []*SecurityGroup, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSecurityGroupList(iterator) + err = iterator.Error + return +} + +// readSecurityGroupList reads list of values of the ”security_group' type from +// the given iterator. +func readSecurityGroupList(iterator *jsoniter.Iterator) []*SecurityGroup { + list := []*SecurityGroup{} + for iterator.ReadArray() { + item := readSecurityGroup(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/security_group_type.go b/clustersmgmt/v2alpha1/security_group_type.go new file mode 100644 index 00000000..eeb5e237 --- /dev/null +++ b/clustersmgmt/v2alpha1/security_group_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SecurityGroup represents the values of the 'security_group' type. +// +// AWS security group object +type SecurityGroup struct { + bitmap_ uint32 + id string + name string + redHatManaged bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *SecurityGroup) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ID returns the value of the 'ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The security group ID. +func (o *SecurityGroup) ID() string { + if o != nil && o.bitmap_&1 != 0 { + return o.id + } + return "" +} + +// GetID returns the value of the 'ID' attribute and +// a flag indicating if the attribute has a value. +// +// The security group ID. +func (o *SecurityGroup) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.id + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the security group according to its `Name` tag on AWS. +func (o *SecurityGroup) Name() string { + if o != nil && o.bitmap_&2 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the security group according to its `Name` tag on AWS. +func (o *SecurityGroup) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.name + } + return +} + +// RedHatManaged returns the value of the 'red_hat_managed' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// If the resource is RH managed. +func (o *SecurityGroup) RedHatManaged() bool { + if o != nil && o.bitmap_&4 != 0 { + return o.redHatManaged + } + return false +} + +// GetRedHatManaged returns the value of the 'red_hat_managed' attribute and +// a flag indicating if the attribute has a value. +// +// If the resource is RH managed. +func (o *SecurityGroup) GetRedHatManaged() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.redHatManaged + } + return +} + +// SecurityGroupListKind is the name of the type used to represent list of objects of +// type 'security_group'. +const SecurityGroupListKind = "SecurityGroupList" + +// SecurityGroupListLinkKind is the name of the type used to represent links to list +// of objects of type 'security_group'. +const SecurityGroupListLinkKind = "SecurityGroupListLink" + +// SecurityGroupNilKind is the name of the type used to nil lists of objects of +// type 'security_group'. +const SecurityGroupListNilKind = "SecurityGroupListNil" + +// SecurityGroupList is a list of values of the 'security_group' type. +type SecurityGroupList struct { + href string + link bool + items []*SecurityGroup +} + +// Len returns the length of the list. +func (l *SecurityGroupList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SecurityGroupList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SecurityGroupList) Get(i int) *SecurityGroup { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SecurityGroupList) Slice() []*SecurityGroup { + var slice []*SecurityGroup + if l == nil { + slice = make([]*SecurityGroup, 0) + } else { + slice = make([]*SecurityGroup, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SecurityGroupList) Each(f func(item *SecurityGroup) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SecurityGroupList) Range(f func(index int, item *SecurityGroup) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/security_group_type_json.go b/clustersmgmt/v2alpha1/security_group_type_json.go new file mode 100644 index 00000000..556f520e --- /dev/null +++ b/clustersmgmt/v2alpha1/security_group_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSecurityGroup writes a value of the 'security_group' type to the given writer. +func MarshalSecurityGroup(object *SecurityGroup, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSecurityGroup(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSecurityGroup writes a value of the 'security_group' type to the given stream. +func writeSecurityGroup(object *SecurityGroup, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("red_hat_managed") + stream.WriteBool(object.redHatManaged) + } + stream.WriteObjectEnd() +} + +// UnmarshalSecurityGroup reads a value of the 'security_group' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSecurityGroup(source interface{}) (object *SecurityGroup, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSecurityGroup(iterator) + err = iterator.Error + return +} + +// readSecurityGroup reads a value of the 'security_group' type from the given iterator. +func readSecurityGroup(iterator *jsoniter.Iterator) *SecurityGroup { + object := &SecurityGroup{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "id": + value := iterator.ReadString() + object.id = value + object.bitmap_ |= 1 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 2 + case "red_hat_managed": + value := iterator.ReadBool() + object.redHatManaged = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/server_config_builder.go b/clustersmgmt/v2alpha1/server_config_builder.go new file mode 100644 index 00000000..639bddaa --- /dev/null +++ b/clustersmgmt/v2alpha1/server_config_builder.go @@ -0,0 +1,109 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ServerConfigBuilder contains the data and logic needed to build 'server_config' objects. +// +// Representation of a server config +type ServerConfigBuilder struct { + bitmap_ uint32 + id string + href string + kubeconfig string + server string + topology ProvisionShardTopology +} + +// NewServerConfig creates a new builder of 'server_config' objects. +func NewServerConfig() *ServerConfigBuilder { + return &ServerConfigBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *ServerConfigBuilder) Link(value bool) *ServerConfigBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *ServerConfigBuilder) ID(value string) *ServerConfigBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *ServerConfigBuilder) HREF(value string) *ServerConfigBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ServerConfigBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Kubeconfig sets the value of the 'kubeconfig' attribute to the given value. +func (b *ServerConfigBuilder) Kubeconfig(value string) *ServerConfigBuilder { + b.kubeconfig = value + b.bitmap_ |= 8 + return b +} + +// Server sets the value of the 'server' attribute to the given value. +func (b *ServerConfigBuilder) Server(value string) *ServerConfigBuilder { + b.server = value + b.bitmap_ |= 16 + return b +} + +// Topology sets the value of the 'topology' attribute to the given value. +func (b *ServerConfigBuilder) Topology(value ProvisionShardTopology) *ServerConfigBuilder { + b.topology = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ServerConfigBuilder) Copy(object *ServerConfig) *ServerConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.kubeconfig = object.kubeconfig + b.server = object.server + b.topology = object.topology + return b +} + +// Build creates a 'server_config' object using the configuration stored in the builder. +func (b *ServerConfigBuilder) Build() (object *ServerConfig, err error) { + object = new(ServerConfig) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.kubeconfig = b.kubeconfig + object.server = b.server + object.topology = b.topology + return +} diff --git a/clustersmgmt/v2alpha1/server_config_list_builder.go b/clustersmgmt/v2alpha1/server_config_list_builder.go new file mode 100644 index 00000000..5daf26d1 --- /dev/null +++ b/clustersmgmt/v2alpha1/server_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ServerConfigListBuilder contains the data and logic needed to build +// 'server_config' objects. +type ServerConfigListBuilder struct { + items []*ServerConfigBuilder +} + +// NewServerConfigList creates a new builder of 'server_config' objects. +func NewServerConfigList() *ServerConfigListBuilder { + return new(ServerConfigListBuilder) +} + +// Items sets the items of the list. +func (b *ServerConfigListBuilder) Items(values ...*ServerConfigBuilder) *ServerConfigListBuilder { + b.items = make([]*ServerConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ServerConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ServerConfigListBuilder) Copy(list *ServerConfigList) *ServerConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ServerConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewServerConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'server_config' objects using the +// configuration stored in the builder. +func (b *ServerConfigListBuilder) Build() (list *ServerConfigList, err error) { + items := make([]*ServerConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ServerConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/server_config_list_type_json.go b/clustersmgmt/v2alpha1/server_config_list_type_json.go new file mode 100644 index 00000000..e9a02edb --- /dev/null +++ b/clustersmgmt/v2alpha1/server_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalServerConfigList writes a list of values of the 'server_config' type to +// the given writer. +func MarshalServerConfigList(list []*ServerConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeServerConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeServerConfigList writes a list of value of the 'server_config' type to +// the given stream. +func writeServerConfigList(list []*ServerConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeServerConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalServerConfigList reads a list of values of the 'server_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalServerConfigList(source interface{}) (items []*ServerConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readServerConfigList(iterator) + err = iterator.Error + return +} + +// readServerConfigList reads list of values of the ”server_config' type from +// the given iterator. +func readServerConfigList(iterator *jsoniter.Iterator) []*ServerConfig { + list := []*ServerConfig{} + for iterator.ReadArray() { + item := readServerConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/server_config_type.go b/clustersmgmt/v2alpha1/server_config_type.go new file mode 100644 index 00000000..ad62db8c --- /dev/null +++ b/clustersmgmt/v2alpha1/server_config_type.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ServerConfigKind is the name of the type used to represent objects +// of type 'server_config'. +const ServerConfigKind = "ServerConfig" + +// ServerConfigLinkKind is the name of the type used to represent links +// to objects of type 'server_config'. +const ServerConfigLinkKind = "ServerConfigLink" + +// ServerConfigNilKind is the name of the type used to nil references +// to objects of type 'server_config'. +const ServerConfigNilKind = "ServerConfigNil" + +// ServerConfig represents the values of the 'server_config' type. +// +// Representation of a server config +type ServerConfig struct { + bitmap_ uint32 + id string + href string + kubeconfig string + server string + topology ProvisionShardTopology +} + +// Kind returns the name of the type of the object. +func (o *ServerConfig) Kind() string { + if o == nil { + return ServerConfigNilKind + } + if o.bitmap_&1 != 0 { + return ServerConfigLinkKind + } + return ServerConfigKind +} + +// Link returns true iif this is a link. +func (o *ServerConfig) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *ServerConfig) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *ServerConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *ServerConfig) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *ServerConfig) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *ServerConfig) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Kubeconfig returns the value of the 'kubeconfig' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The kubeconfig of the server. +func (o *ServerConfig) Kubeconfig() string { + if o != nil && o.bitmap_&8 != 0 { + return o.kubeconfig + } + return "" +} + +// GetKubeconfig returns the value of the 'kubeconfig' attribute and +// a flag indicating if the attribute has a value. +// +// The kubeconfig of the server. +func (o *ServerConfig) GetKubeconfig() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.kubeconfig + } + return +} + +// Server returns the value of the 'server' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The URL of the server. +func (o *ServerConfig) Server() string { + if o != nil && o.bitmap_&16 != 0 { + return o.server + } + return "" +} + +// GetServer returns the value of the 'server' attribute and +// a flag indicating if the attribute has a value. +// +// The URL of the server. +func (o *ServerConfig) GetServer() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.server + } + return +} + +// Topology returns the value of the 'topology' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The topology of a provision shard (Optional). +func (o *ServerConfig) Topology() ProvisionShardTopology { + if o != nil && o.bitmap_&32 != 0 { + return o.topology + } + return ProvisionShardTopology("") +} + +// GetTopology returns the value of the 'topology' attribute and +// a flag indicating if the attribute has a value. +// +// The topology of a provision shard (Optional). +func (o *ServerConfig) GetTopology() (value ProvisionShardTopology, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.topology + } + return +} + +// ServerConfigListKind is the name of the type used to represent list of objects of +// type 'server_config'. +const ServerConfigListKind = "ServerConfigList" + +// ServerConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'server_config'. +const ServerConfigListLinkKind = "ServerConfigListLink" + +// ServerConfigNilKind is the name of the type used to nil lists of objects of +// type 'server_config'. +const ServerConfigListNilKind = "ServerConfigListNil" + +// ServerConfigList is a list of values of the 'server_config' type. +type ServerConfigList struct { + href string + link bool + items []*ServerConfig +} + +// Kind returns the name of the type of the object. +func (l *ServerConfigList) Kind() string { + if l == nil { + return ServerConfigListNilKind + } + if l.link { + return ServerConfigListLinkKind + } + return ServerConfigListKind +} + +// Link returns true iif this is a link. +func (l *ServerConfigList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *ServerConfigList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *ServerConfigList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *ServerConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ServerConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ServerConfigList) Get(i int) *ServerConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ServerConfigList) Slice() []*ServerConfig { + var slice []*ServerConfig + if l == nil { + slice = make([]*ServerConfig, 0) + } else { + slice = make([]*ServerConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ServerConfigList) Each(f func(item *ServerConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ServerConfigList) Range(f func(index int, item *ServerConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/server_config_type_json.go b/clustersmgmt/v2alpha1/server_config_type_json.go new file mode 100644 index 00000000..3c8a0e1c --- /dev/null +++ b/clustersmgmt/v2alpha1/server_config_type_json.go @@ -0,0 +1,147 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalServerConfig writes a value of the 'server_config' type to the given writer. +func MarshalServerConfig(object *ServerConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeServerConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeServerConfig writes a value of the 'server_config' type to the given stream. +func writeServerConfig(object *ServerConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(ServerConfigLinkKind) + } else { + stream.WriteString(ServerConfigKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("kubeconfig") + stream.WriteString(object.kubeconfig) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("server") + stream.WriteString(object.server) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("topology") + stream.WriteString(string(object.topology)) + } + stream.WriteObjectEnd() +} + +// UnmarshalServerConfig reads a value of the 'server_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalServerConfig(source interface{}) (object *ServerConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readServerConfig(iterator) + err = iterator.Error + return +} + +// readServerConfig reads a value of the 'server_config' type from the given iterator. +func readServerConfig(iterator *jsoniter.Iterator) *ServerConfig { + object := &ServerConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == ServerConfigLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "kubeconfig": + value := iterator.ReadString() + object.kubeconfig = value + object.bitmap_ |= 8 + case "server": + value := iterator.ReadString() + object.server = value + object.bitmap_ |= 16 + case "topology": + text := iterator.ReadString() + value := ProvisionShardTopology(text) + object.topology = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/socket_total_by_node_roles_os_metric_query_client.go b/clustersmgmt/v2alpha1/socket_total_by_node_roles_os_metric_query_client.go new file mode 100644 index 00000000..24524c37 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_by_node_roles_os_metric_query_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// SocketTotalByNodeRolesOSMetricQueryClient is the client of the 'socket_total_by_node_roles_OS_metric_query' resource. +// +// Total socket capacity in the cluster by node role and operating system. +type SocketTotalByNodeRolesOSMetricQueryClient struct { + transport http.RoundTripper + path string +} + +// NewSocketTotalByNodeRolesOSMetricQueryClient creates a new client for the 'socket_total_by_node_roles_OS_metric_query' +// resource using the given transport to send the requests and receive the +// responses. +func NewSocketTotalByNodeRolesOSMetricQueryClient(transport http.RoundTripper, path string) *SocketTotalByNodeRolesOSMetricQueryClient { + return &SocketTotalByNodeRolesOSMetricQueryClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the metrics. +func (c *SocketTotalByNodeRolesOSMetricQueryClient) Get() *SocketTotalByNodeRolesOSMetricQueryGetRequest { + return &SocketTotalByNodeRolesOSMetricQueryGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// SocketTotalByNodeRolesOSMetricQueryPollRequest is the request for the Poll method. +type SocketTotalByNodeRolesOSMetricQueryPollRequest struct { + request *SocketTotalByNodeRolesOSMetricQueryGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) Parameter(name string, value interface{}) *SocketTotalByNodeRolesOSMetricQueryPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) Header(name string, value interface{}) *SocketTotalByNodeRolesOSMetricQueryPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) Interval(value time.Duration) *SocketTotalByNodeRolesOSMetricQueryPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) Status(value int) *SocketTotalByNodeRolesOSMetricQueryPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) Predicate(value func(*SocketTotalByNodeRolesOSMetricQueryGetResponse) bool) *SocketTotalByNodeRolesOSMetricQueryPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*SocketTotalByNodeRolesOSMetricQueryGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) StartContext(ctx context.Context) (response *SocketTotalByNodeRolesOSMetricQueryPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &SocketTotalByNodeRolesOSMetricQueryPollResponse{ + response: result.(*SocketTotalByNodeRolesOSMetricQueryGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *SocketTotalByNodeRolesOSMetricQueryPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// SocketTotalByNodeRolesOSMetricQueryPollResponse is the response for the Poll method. +type SocketTotalByNodeRolesOSMetricQueryPollResponse struct { + response *SocketTotalByNodeRolesOSMetricQueryGetResponse +} + +// Status returns the response status code. +func (r *SocketTotalByNodeRolesOSMetricQueryPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *SocketTotalByNodeRolesOSMetricQueryPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *SocketTotalByNodeRolesOSMetricQueryPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *SocketTotalByNodeRolesOSMetricQueryPollResponse) Body() *SocketTotalsNodeRoleOSMetricNode { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *SocketTotalByNodeRolesOSMetricQueryPollResponse) GetBody() (value *SocketTotalsNodeRoleOSMetricNode, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *SocketTotalByNodeRolesOSMetricQueryClient) Poll() *SocketTotalByNodeRolesOSMetricQueryPollRequest { + return &SocketTotalByNodeRolesOSMetricQueryPollRequest{ + request: c.Get(), + } +} + +// SocketTotalByNodeRolesOSMetricQueryGetRequest is the request for the 'get' method. +type SocketTotalByNodeRolesOSMetricQueryGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *SocketTotalByNodeRolesOSMetricQueryGetRequest) Parameter(name string, value interface{}) *SocketTotalByNodeRolesOSMetricQueryGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *SocketTotalByNodeRolesOSMetricQueryGetRequest) Header(name string, value interface{}) *SocketTotalByNodeRolesOSMetricQueryGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *SocketTotalByNodeRolesOSMetricQueryGetRequest) Impersonate(user string) *SocketTotalByNodeRolesOSMetricQueryGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *SocketTotalByNodeRolesOSMetricQueryGetRequest) Send() (result *SocketTotalByNodeRolesOSMetricQueryGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *SocketTotalByNodeRolesOSMetricQueryGetRequest) SendContext(ctx context.Context) (result *SocketTotalByNodeRolesOSMetricQueryGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &SocketTotalByNodeRolesOSMetricQueryGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readSocketTotalByNodeRolesOSMetricQueryGetResponse(result, reader) + if err != nil { + return + } + return +} + +// SocketTotalByNodeRolesOSMetricQueryGetResponse is the response for the 'get' method. +type SocketTotalByNodeRolesOSMetricQueryGetResponse struct { + status int + header http.Header + err *errors.Error + body *SocketTotalsNodeRoleOSMetricNode +} + +// Status returns the response status code. +func (r *SocketTotalByNodeRolesOSMetricQueryGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *SocketTotalByNodeRolesOSMetricQueryGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *SocketTotalByNodeRolesOSMetricQueryGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *SocketTotalByNodeRolesOSMetricQueryGetResponse) Body() *SocketTotalsNodeRoleOSMetricNode { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *SocketTotalByNodeRolesOSMetricQueryGetResponse) GetBody() (value *SocketTotalsNodeRoleOSMetricNode, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/socket_total_by_node_roles_os_metric_query_resource_json.go b/clustersmgmt/v2alpha1/socket_total_by_node_roles_os_metric_query_resource_json.go new file mode 100644 index 00000000..533a1dbf --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_by_node_roles_os_metric_query_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeSocketTotalByNodeRolesOSMetricQueryGetRequest(request *SocketTotalByNodeRolesOSMetricQueryGetRequest, writer io.Writer) error { + return nil +} +func readSocketTotalByNodeRolesOSMetricQueryGetResponse(response *SocketTotalByNodeRolesOSMetricQueryGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalSocketTotalsNodeRoleOSMetricNode(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_builder.go b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_builder.go new file mode 100644 index 00000000..d7493a11 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_builder.go @@ -0,0 +1,107 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// SocketTotalNodeRoleOSMetricNodeBuilder contains the data and logic needed to build 'socket_total_node_role_OS_metric_node' objects. +// +// Representation of information from telemetry about a the socket capacity +// by node role and OS. +type SocketTotalNodeRoleOSMetricNodeBuilder struct { + bitmap_ uint32 + nodeRoles []string + operatingSystem string + socketTotal float64 + time time.Time +} + +// NewSocketTotalNodeRoleOSMetricNode creates a new builder of 'socket_total_node_role_OS_metric_node' objects. +func NewSocketTotalNodeRoleOSMetricNode() *SocketTotalNodeRoleOSMetricNodeBuilder { + return &SocketTotalNodeRoleOSMetricNodeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// NodeRoles sets the value of the 'node_roles' attribute to the given values. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) NodeRoles(values ...string) *SocketTotalNodeRoleOSMetricNodeBuilder { + b.nodeRoles = make([]string, len(values)) + copy(b.nodeRoles, values) + b.bitmap_ |= 1 + return b +} + +// OperatingSystem sets the value of the 'operating_system' attribute to the given value. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) OperatingSystem(value string) *SocketTotalNodeRoleOSMetricNodeBuilder { + b.operatingSystem = value + b.bitmap_ |= 2 + return b +} + +// SocketTotal sets the value of the 'socket_total' attribute to the given value. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) SocketTotal(value float64) *SocketTotalNodeRoleOSMetricNodeBuilder { + b.socketTotal = value + b.bitmap_ |= 4 + return b +} + +// Time sets the value of the 'time' attribute to the given value. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) Time(value time.Time) *SocketTotalNodeRoleOSMetricNodeBuilder { + b.time = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) Copy(object *SocketTotalNodeRoleOSMetricNode) *SocketTotalNodeRoleOSMetricNodeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.nodeRoles != nil { + b.nodeRoles = make([]string, len(object.nodeRoles)) + copy(b.nodeRoles, object.nodeRoles) + } else { + b.nodeRoles = nil + } + b.operatingSystem = object.operatingSystem + b.socketTotal = object.socketTotal + b.time = object.time + return b +} + +// Build creates a 'socket_total_node_role_OS_metric_node' object using the configuration stored in the builder. +func (b *SocketTotalNodeRoleOSMetricNodeBuilder) Build() (object *SocketTotalNodeRoleOSMetricNode, err error) { + object = new(SocketTotalNodeRoleOSMetricNode) + object.bitmap_ = b.bitmap_ + if b.nodeRoles != nil { + object.nodeRoles = make([]string, len(b.nodeRoles)) + copy(object.nodeRoles, b.nodeRoles) + } + object.operatingSystem = b.operatingSystem + object.socketTotal = b.socketTotal + object.time = b.time + return +} diff --git a/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_list_builder.go b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_list_builder.go new file mode 100644 index 00000000..f85ef705 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SocketTotalNodeRoleOSMetricNodeListBuilder contains the data and logic needed to build +// 'socket_total_node_role_OS_metric_node' objects. +type SocketTotalNodeRoleOSMetricNodeListBuilder struct { + items []*SocketTotalNodeRoleOSMetricNodeBuilder +} + +// NewSocketTotalNodeRoleOSMetricNodeList creates a new builder of 'socket_total_node_role_OS_metric_node' objects. +func NewSocketTotalNodeRoleOSMetricNodeList() *SocketTotalNodeRoleOSMetricNodeListBuilder { + return new(SocketTotalNodeRoleOSMetricNodeListBuilder) +} + +// Items sets the items of the list. +func (b *SocketTotalNodeRoleOSMetricNodeListBuilder) Items(values ...*SocketTotalNodeRoleOSMetricNodeBuilder) *SocketTotalNodeRoleOSMetricNodeListBuilder { + b.items = make([]*SocketTotalNodeRoleOSMetricNodeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SocketTotalNodeRoleOSMetricNodeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SocketTotalNodeRoleOSMetricNodeListBuilder) Copy(list *SocketTotalNodeRoleOSMetricNodeList) *SocketTotalNodeRoleOSMetricNodeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SocketTotalNodeRoleOSMetricNodeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSocketTotalNodeRoleOSMetricNode().Copy(v) + } + } + return b +} + +// Build creates a list of 'socket_total_node_role_OS_metric_node' objects using the +// configuration stored in the builder. +func (b *SocketTotalNodeRoleOSMetricNodeListBuilder) Build() (list *SocketTotalNodeRoleOSMetricNodeList, err error) { + items := make([]*SocketTotalNodeRoleOSMetricNode, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SocketTotalNodeRoleOSMetricNodeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_list_type_json.go b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_list_type_json.go new file mode 100644 index 00000000..f666f28d --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSocketTotalNodeRoleOSMetricNodeList writes a list of values of the 'socket_total_node_role_OS_metric_node' type to +// the given writer. +func MarshalSocketTotalNodeRoleOSMetricNodeList(list []*SocketTotalNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSocketTotalNodeRoleOSMetricNodeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSocketTotalNodeRoleOSMetricNodeList writes a list of value of the 'socket_total_node_role_OS_metric_node' type to +// the given stream. +func writeSocketTotalNodeRoleOSMetricNodeList(list []*SocketTotalNodeRoleOSMetricNode, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSocketTotalNodeRoleOSMetricNode(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSocketTotalNodeRoleOSMetricNodeList reads a list of values of the 'socket_total_node_role_OS_metric_node' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSocketTotalNodeRoleOSMetricNodeList(source interface{}) (items []*SocketTotalNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSocketTotalNodeRoleOSMetricNodeList(iterator) + err = iterator.Error + return +} + +// readSocketTotalNodeRoleOSMetricNodeList reads list of values of the ”socket_total_node_role_OS_metric_node' type from +// the given iterator. +func readSocketTotalNodeRoleOSMetricNodeList(iterator *jsoniter.Iterator) []*SocketTotalNodeRoleOSMetricNode { + list := []*SocketTotalNodeRoleOSMetricNode{} + for iterator.ReadArray() { + item := readSocketTotalNodeRoleOSMetricNode(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_type.go b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_type.go new file mode 100644 index 00000000..5095ec22 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_type.go @@ -0,0 +1,215 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// SocketTotalNodeRoleOSMetricNode represents the values of the 'socket_total_node_role_OS_metric_node' type. +// +// Representation of information from telemetry about a the socket capacity +// by node role and OS. +type SocketTotalNodeRoleOSMetricNode struct { + bitmap_ uint32 + nodeRoles []string + operatingSystem string + socketTotal float64 + time time.Time +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *SocketTotalNodeRoleOSMetricNode) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// NodeRoles returns the value of the 'node_roles' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Representation of the node role for a cluster. +func (o *SocketTotalNodeRoleOSMetricNode) NodeRoles() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.nodeRoles + } + return nil +} + +// GetNodeRoles returns the value of the 'node_roles' attribute and +// a flag indicating if the attribute has a value. +// +// Representation of the node role for a cluster. +func (o *SocketTotalNodeRoleOSMetricNode) GetNodeRoles() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.nodeRoles + } + return +} + +// OperatingSystem returns the value of the 'operating_system' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The operating system. +func (o *SocketTotalNodeRoleOSMetricNode) OperatingSystem() string { + if o != nil && o.bitmap_&2 != 0 { + return o.operatingSystem + } + return "" +} + +// GetOperatingSystem returns the value of the 'operating_system' attribute and +// a flag indicating if the attribute has a value. +// +// The operating system. +func (o *SocketTotalNodeRoleOSMetricNode) GetOperatingSystem() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.operatingSystem + } + return +} + +// SocketTotal returns the value of the 'socket_total' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The total socket capacity of nodes with this set of roles and operating system. +func (o *SocketTotalNodeRoleOSMetricNode) SocketTotal() float64 { + if o != nil && o.bitmap_&4 != 0 { + return o.socketTotal + } + return 0.0 +} + +// GetSocketTotal returns the value of the 'socket_total' attribute and +// a flag indicating if the attribute has a value. +// +// The total socket capacity of nodes with this set of roles and operating system. +func (o *SocketTotalNodeRoleOSMetricNode) GetSocketTotal() (value float64, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.socketTotal + } + return +} + +// Time returns the value of the 'time' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *SocketTotalNodeRoleOSMetricNode) Time() time.Time { + if o != nil && o.bitmap_&8 != 0 { + return o.time + } + return time.Time{} +} + +// GetTime returns the value of the 'time' attribute and +// a flag indicating if the attribute has a value. +func (o *SocketTotalNodeRoleOSMetricNode) GetTime() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.time + } + return +} + +// SocketTotalNodeRoleOSMetricNodeListKind is the name of the type used to represent list of objects of +// type 'socket_total_node_role_OS_metric_node'. +const SocketTotalNodeRoleOSMetricNodeListKind = "SocketTotalNodeRoleOSMetricNodeList" + +// SocketTotalNodeRoleOSMetricNodeListLinkKind is the name of the type used to represent links to list +// of objects of type 'socket_total_node_role_OS_metric_node'. +const SocketTotalNodeRoleOSMetricNodeListLinkKind = "SocketTotalNodeRoleOSMetricNodeListLink" + +// SocketTotalNodeRoleOSMetricNodeNilKind is the name of the type used to nil lists of objects of +// type 'socket_total_node_role_OS_metric_node'. +const SocketTotalNodeRoleOSMetricNodeListNilKind = "SocketTotalNodeRoleOSMetricNodeListNil" + +// SocketTotalNodeRoleOSMetricNodeList is a list of values of the 'socket_total_node_role_OS_metric_node' type. +type SocketTotalNodeRoleOSMetricNodeList struct { + href string + link bool + items []*SocketTotalNodeRoleOSMetricNode +} + +// Len returns the length of the list. +func (l *SocketTotalNodeRoleOSMetricNodeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SocketTotalNodeRoleOSMetricNodeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SocketTotalNodeRoleOSMetricNodeList) Get(i int) *SocketTotalNodeRoleOSMetricNode { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SocketTotalNodeRoleOSMetricNodeList) Slice() []*SocketTotalNodeRoleOSMetricNode { + var slice []*SocketTotalNodeRoleOSMetricNode + if l == nil { + slice = make([]*SocketTotalNodeRoleOSMetricNode, 0) + } else { + slice = make([]*SocketTotalNodeRoleOSMetricNode, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SocketTotalNodeRoleOSMetricNodeList) Each(f func(item *SocketTotalNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SocketTotalNodeRoleOSMetricNodeList) Range(f func(index int, item *SocketTotalNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_type_json.go b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_type_json.go new file mode 100644 index 00000000..996b54d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_total_node_role_os_metric_node_type_json.go @@ -0,0 +1,130 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSocketTotalNodeRoleOSMetricNode writes a value of the 'socket_total_node_role_OS_metric_node' type to the given writer. +func MarshalSocketTotalNodeRoleOSMetricNode(object *SocketTotalNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSocketTotalNodeRoleOSMetricNode(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSocketTotalNodeRoleOSMetricNode writes a value of the 'socket_total_node_role_OS_metric_node' type to the given stream. +func writeSocketTotalNodeRoleOSMetricNode(object *SocketTotalNodeRoleOSMetricNode, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.nodeRoles != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("node_roles") + writeStringList(object.nodeRoles, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operating_system") + stream.WriteString(object.operatingSystem) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("socket_total") + stream.WriteFloat64(object.socketTotal) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("time") + stream.WriteString((object.time).Format(time.RFC3339)) + } + stream.WriteObjectEnd() +} + +// UnmarshalSocketTotalNodeRoleOSMetricNode reads a value of the 'socket_total_node_role_OS_metric_node' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSocketTotalNodeRoleOSMetricNode(source interface{}) (object *SocketTotalNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSocketTotalNodeRoleOSMetricNode(iterator) + err = iterator.Error + return +} + +// readSocketTotalNodeRoleOSMetricNode reads a value of the 'socket_total_node_role_OS_metric_node' type from the given iterator. +func readSocketTotalNodeRoleOSMetricNode(iterator *jsoniter.Iterator) *SocketTotalNodeRoleOSMetricNode { + object := &SocketTotalNodeRoleOSMetricNode{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "node_roles": + value := readStringList(iterator) + object.nodeRoles = value + object.bitmap_ |= 1 + case "operating_system": + value := iterator.ReadString() + object.operatingSystem = value + object.bitmap_ |= 2 + case "socket_total": + value := iterator.ReadFloat64() + object.socketTotal = value + object.bitmap_ |= 4 + case "time": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.time = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_builder.go b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_builder.go new file mode 100644 index 00000000..8d1e6f85 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_builder.go @@ -0,0 +1,80 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SocketTotalsNodeRoleOSMetricNodeBuilder contains the data and logic needed to build 'socket_totals_node_role_OS_metric_node' objects. +// +// Representation of information from telemetry about the socket capacity by node +// role and OS of a cluster. +type SocketTotalsNodeRoleOSMetricNodeBuilder struct { + bitmap_ uint32 + socketTotals []*SocketTotalNodeRoleOSMetricNodeBuilder +} + +// NewSocketTotalsNodeRoleOSMetricNode creates a new builder of 'socket_totals_node_role_OS_metric_node' objects. +func NewSocketTotalsNodeRoleOSMetricNode() *SocketTotalsNodeRoleOSMetricNodeBuilder { + return &SocketTotalsNodeRoleOSMetricNodeBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SocketTotalsNodeRoleOSMetricNodeBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// SocketTotals sets the value of the 'socket_totals' attribute to the given values. +func (b *SocketTotalsNodeRoleOSMetricNodeBuilder) SocketTotals(values ...*SocketTotalNodeRoleOSMetricNodeBuilder) *SocketTotalsNodeRoleOSMetricNodeBuilder { + b.socketTotals = make([]*SocketTotalNodeRoleOSMetricNodeBuilder, len(values)) + copy(b.socketTotals, values) + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SocketTotalsNodeRoleOSMetricNodeBuilder) Copy(object *SocketTotalsNodeRoleOSMetricNode) *SocketTotalsNodeRoleOSMetricNodeBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.socketTotals != nil { + b.socketTotals = make([]*SocketTotalNodeRoleOSMetricNodeBuilder, len(object.socketTotals)) + for i, v := range object.socketTotals { + b.socketTotals[i] = NewSocketTotalNodeRoleOSMetricNode().Copy(v) + } + } else { + b.socketTotals = nil + } + return b +} + +// Build creates a 'socket_totals_node_role_OS_metric_node' object using the configuration stored in the builder. +func (b *SocketTotalsNodeRoleOSMetricNodeBuilder) Build() (object *SocketTotalsNodeRoleOSMetricNode, err error) { + object = new(SocketTotalsNodeRoleOSMetricNode) + object.bitmap_ = b.bitmap_ + if b.socketTotals != nil { + object.socketTotals = make([]*SocketTotalNodeRoleOSMetricNode, len(b.socketTotals)) + for i, v := range b.socketTotals { + object.socketTotals[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_list_builder.go b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_list_builder.go new file mode 100644 index 00000000..aeec3721 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SocketTotalsNodeRoleOSMetricNodeListBuilder contains the data and logic needed to build +// 'socket_totals_node_role_OS_metric_node' objects. +type SocketTotalsNodeRoleOSMetricNodeListBuilder struct { + items []*SocketTotalsNodeRoleOSMetricNodeBuilder +} + +// NewSocketTotalsNodeRoleOSMetricNodeList creates a new builder of 'socket_totals_node_role_OS_metric_node' objects. +func NewSocketTotalsNodeRoleOSMetricNodeList() *SocketTotalsNodeRoleOSMetricNodeListBuilder { + return new(SocketTotalsNodeRoleOSMetricNodeListBuilder) +} + +// Items sets the items of the list. +func (b *SocketTotalsNodeRoleOSMetricNodeListBuilder) Items(values ...*SocketTotalsNodeRoleOSMetricNodeBuilder) *SocketTotalsNodeRoleOSMetricNodeListBuilder { + b.items = make([]*SocketTotalsNodeRoleOSMetricNodeBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SocketTotalsNodeRoleOSMetricNodeListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SocketTotalsNodeRoleOSMetricNodeListBuilder) Copy(list *SocketTotalsNodeRoleOSMetricNodeList) *SocketTotalsNodeRoleOSMetricNodeListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SocketTotalsNodeRoleOSMetricNodeBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSocketTotalsNodeRoleOSMetricNode().Copy(v) + } + } + return b +} + +// Build creates a list of 'socket_totals_node_role_OS_metric_node' objects using the +// configuration stored in the builder. +func (b *SocketTotalsNodeRoleOSMetricNodeListBuilder) Build() (list *SocketTotalsNodeRoleOSMetricNodeList, err error) { + items := make([]*SocketTotalsNodeRoleOSMetricNode, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SocketTotalsNodeRoleOSMetricNodeList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_list_type_json.go b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_list_type_json.go new file mode 100644 index 00000000..dc0fc505 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSocketTotalsNodeRoleOSMetricNodeList writes a list of values of the 'socket_totals_node_role_OS_metric_node' type to +// the given writer. +func MarshalSocketTotalsNodeRoleOSMetricNodeList(list []*SocketTotalsNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSocketTotalsNodeRoleOSMetricNodeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSocketTotalsNodeRoleOSMetricNodeList writes a list of value of the 'socket_totals_node_role_OS_metric_node' type to +// the given stream. +func writeSocketTotalsNodeRoleOSMetricNodeList(list []*SocketTotalsNodeRoleOSMetricNode, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSocketTotalsNodeRoleOSMetricNode(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSocketTotalsNodeRoleOSMetricNodeList reads a list of values of the 'socket_totals_node_role_OS_metric_node' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSocketTotalsNodeRoleOSMetricNodeList(source interface{}) (items []*SocketTotalsNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSocketTotalsNodeRoleOSMetricNodeList(iterator) + err = iterator.Error + return +} + +// readSocketTotalsNodeRoleOSMetricNodeList reads list of values of the ”socket_totals_node_role_OS_metric_node' type from +// the given iterator. +func readSocketTotalsNodeRoleOSMetricNodeList(iterator *jsoniter.Iterator) []*SocketTotalsNodeRoleOSMetricNode { + list := []*SocketTotalsNodeRoleOSMetricNode{} + for iterator.ReadArray() { + item := readSocketTotalsNodeRoleOSMetricNode(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_type.go b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_type.go new file mode 100644 index 00000000..774a8073 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_type.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SocketTotalsNodeRoleOSMetricNode represents the values of the 'socket_totals_node_role_OS_metric_node' type. +// +// Representation of information from telemetry about the socket capacity by node +// role and OS of a cluster. +type SocketTotalsNodeRoleOSMetricNode struct { + bitmap_ uint32 + socketTotals []*SocketTotalNodeRoleOSMetricNode +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *SocketTotalsNodeRoleOSMetricNode) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// SocketTotals returns the value of the 'socket_totals' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *SocketTotalsNodeRoleOSMetricNode) SocketTotals() []*SocketTotalNodeRoleOSMetricNode { + if o != nil && o.bitmap_&1 != 0 { + return o.socketTotals + } + return nil +} + +// GetSocketTotals returns the value of the 'socket_totals' attribute and +// a flag indicating if the attribute has a value. +func (o *SocketTotalsNodeRoleOSMetricNode) GetSocketTotals() (value []*SocketTotalNodeRoleOSMetricNode, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.socketTotals + } + return +} + +// SocketTotalsNodeRoleOSMetricNodeListKind is the name of the type used to represent list of objects of +// type 'socket_totals_node_role_OS_metric_node'. +const SocketTotalsNodeRoleOSMetricNodeListKind = "SocketTotalsNodeRoleOSMetricNodeList" + +// SocketTotalsNodeRoleOSMetricNodeListLinkKind is the name of the type used to represent links to list +// of objects of type 'socket_totals_node_role_OS_metric_node'. +const SocketTotalsNodeRoleOSMetricNodeListLinkKind = "SocketTotalsNodeRoleOSMetricNodeListLink" + +// SocketTotalsNodeRoleOSMetricNodeNilKind is the name of the type used to nil lists of objects of +// type 'socket_totals_node_role_OS_metric_node'. +const SocketTotalsNodeRoleOSMetricNodeListNilKind = "SocketTotalsNodeRoleOSMetricNodeListNil" + +// SocketTotalsNodeRoleOSMetricNodeList is a list of values of the 'socket_totals_node_role_OS_metric_node' type. +type SocketTotalsNodeRoleOSMetricNodeList struct { + href string + link bool + items []*SocketTotalsNodeRoleOSMetricNode +} + +// Len returns the length of the list. +func (l *SocketTotalsNodeRoleOSMetricNodeList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SocketTotalsNodeRoleOSMetricNodeList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SocketTotalsNodeRoleOSMetricNodeList) Get(i int) *SocketTotalsNodeRoleOSMetricNode { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SocketTotalsNodeRoleOSMetricNodeList) Slice() []*SocketTotalsNodeRoleOSMetricNode { + var slice []*SocketTotalsNodeRoleOSMetricNode + if l == nil { + slice = make([]*SocketTotalsNodeRoleOSMetricNode, 0) + } else { + slice = make([]*SocketTotalsNodeRoleOSMetricNode, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SocketTotalsNodeRoleOSMetricNodeList) Each(f func(item *SocketTotalsNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SocketTotalsNodeRoleOSMetricNodeList) Range(f func(index int, item *SocketTotalsNodeRoleOSMetricNode) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_type_json.go b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_type_json.go new file mode 100644 index 00000000..d5ad4271 --- /dev/null +++ b/clustersmgmt/v2alpha1/socket_totals_node_role_os_metric_node_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSocketTotalsNodeRoleOSMetricNode writes a value of the 'socket_totals_node_role_OS_metric_node' type to the given writer. +func MarshalSocketTotalsNodeRoleOSMetricNode(object *SocketTotalsNodeRoleOSMetricNode, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSocketTotalsNodeRoleOSMetricNode(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSocketTotalsNodeRoleOSMetricNode writes a value of the 'socket_totals_node_role_OS_metric_node' type to the given stream. +func writeSocketTotalsNodeRoleOSMetricNode(object *SocketTotalsNodeRoleOSMetricNode, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.socketTotals != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("socket_totals") + writeSocketTotalNodeRoleOSMetricNodeList(object.socketTotals, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalSocketTotalsNodeRoleOSMetricNode reads a value of the 'socket_totals_node_role_OS_metric_node' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSocketTotalsNodeRoleOSMetricNode(source interface{}) (object *SocketTotalsNodeRoleOSMetricNode, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSocketTotalsNodeRoleOSMetricNode(iterator) + err = iterator.Error + return +} + +// readSocketTotalsNodeRoleOSMetricNode reads a value of the 'socket_totals_node_role_OS_metric_node' type from the given iterator. +func readSocketTotalsNodeRoleOSMetricNode(iterator *jsoniter.Iterator) *SocketTotalsNodeRoleOSMetricNode { + object := &SocketTotalsNodeRoleOSMetricNode{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "socket_totals": + value := readSocketTotalNodeRoleOSMetricNodeList(iterator) + object.socketTotals = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/storage_quota_builder.go b/clustersmgmt/v2alpha1/storage_quota_builder.go new file mode 100644 index 00000000..3cd8ee90 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// StorageQuotaBuilder contains the data and logic needed to build 'storage_quota' objects. +// +// Representation of a storage quota +type StorageQuotaBuilder struct { + bitmap_ uint32 + unit string + value float64 +} + +// NewStorageQuota creates a new builder of 'storage_quota' objects. +func NewStorageQuota() *StorageQuotaBuilder { + return &StorageQuotaBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *StorageQuotaBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Unit sets the value of the 'unit' attribute to the given value. +func (b *StorageQuotaBuilder) Unit(value string) *StorageQuotaBuilder { + b.unit = value + b.bitmap_ |= 1 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *StorageQuotaBuilder) Value(value float64) *StorageQuotaBuilder { + b.value = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *StorageQuotaBuilder) Copy(object *StorageQuota) *StorageQuotaBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.unit = object.unit + b.value = object.value + return b +} + +// Build creates a 'storage_quota' object using the configuration stored in the builder. +func (b *StorageQuotaBuilder) Build() (object *StorageQuota, err error) { + object = new(StorageQuota) + object.bitmap_ = b.bitmap_ + object.unit = b.unit + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/storage_quota_list_builder.go b/clustersmgmt/v2alpha1/storage_quota_list_builder.go new file mode 100644 index 00000000..744d7232 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// StorageQuotaListBuilder contains the data and logic needed to build +// 'storage_quota' objects. +type StorageQuotaListBuilder struct { + items []*StorageQuotaBuilder +} + +// NewStorageQuotaList creates a new builder of 'storage_quota' objects. +func NewStorageQuotaList() *StorageQuotaListBuilder { + return new(StorageQuotaListBuilder) +} + +// Items sets the items of the list. +func (b *StorageQuotaListBuilder) Items(values ...*StorageQuotaBuilder) *StorageQuotaListBuilder { + b.items = make([]*StorageQuotaBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *StorageQuotaListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *StorageQuotaListBuilder) Copy(list *StorageQuotaList) *StorageQuotaListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*StorageQuotaBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewStorageQuota().Copy(v) + } + } + return b +} + +// Build creates a list of 'storage_quota' objects using the +// configuration stored in the builder. +func (b *StorageQuotaListBuilder) Build() (list *StorageQuotaList, err error) { + items := make([]*StorageQuota, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(StorageQuotaList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/storage_quota_list_type_json.go b/clustersmgmt/v2alpha1/storage_quota_list_type_json.go new file mode 100644 index 00000000..95591bc0 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalStorageQuotaList writes a list of values of the 'storage_quota' type to +// the given writer. +func MarshalStorageQuotaList(list []*StorageQuota, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeStorageQuotaList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeStorageQuotaList writes a list of value of the 'storage_quota' type to +// the given stream. +func writeStorageQuotaList(list []*StorageQuota, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeStorageQuota(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalStorageQuotaList reads a list of values of the 'storage_quota' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalStorageQuotaList(source interface{}) (items []*StorageQuota, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readStorageQuotaList(iterator) + err = iterator.Error + return +} + +// readStorageQuotaList reads list of values of the ”storage_quota' type from +// the given iterator. +func readStorageQuotaList(iterator *jsoniter.Iterator) []*StorageQuota { + list := []*StorageQuota{} + for iterator.ReadArray() { + item := readStorageQuota(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/storage_quota_type.go b/clustersmgmt/v2alpha1/storage_quota_type.go new file mode 100644 index 00000000..34d2e4d4 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// StorageQuota represents the values of the 'storage_quota' type. +// +// Representation of a storage quota +type StorageQuota struct { + bitmap_ uint32 + unit string + value float64 +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *StorageQuota) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Unit returns the value of the 'unit' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Unit of storage +func (o *StorageQuota) Unit() string { + if o != nil && o.bitmap_&1 != 0 { + return o.unit + } + return "" +} + +// GetUnit returns the value of the 'unit' attribute and +// a flag indicating if the attribute has a value. +// +// Unit of storage +func (o *StorageQuota) GetUnit() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.unit + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Numerical value +func (o *StorageQuota) Value() float64 { + if o != nil && o.bitmap_&2 != 0 { + return o.value + } + return 0.0 +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// Numerical value +func (o *StorageQuota) GetValue() (value float64, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.value + } + return +} + +// StorageQuotaListKind is the name of the type used to represent list of objects of +// type 'storage_quota'. +const StorageQuotaListKind = "StorageQuotaList" + +// StorageQuotaListLinkKind is the name of the type used to represent links to list +// of objects of type 'storage_quota'. +const StorageQuotaListLinkKind = "StorageQuotaListLink" + +// StorageQuotaNilKind is the name of the type used to nil lists of objects of +// type 'storage_quota'. +const StorageQuotaListNilKind = "StorageQuotaListNil" + +// StorageQuotaList is a list of values of the 'storage_quota' type. +type StorageQuotaList struct { + href string + link bool + items []*StorageQuota +} + +// Len returns the length of the list. +func (l *StorageQuotaList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *StorageQuotaList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *StorageQuotaList) Get(i int) *StorageQuota { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *StorageQuotaList) Slice() []*StorageQuota { + var slice []*StorageQuota + if l == nil { + slice = make([]*StorageQuota, 0) + } else { + slice = make([]*StorageQuota, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *StorageQuotaList) Each(f func(item *StorageQuota) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *StorageQuotaList) Range(f func(index int, item *StorageQuota) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/storage_quota_type_json.go b/clustersmgmt/v2alpha1/storage_quota_type_json.go new file mode 100644 index 00000000..090427d1 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalStorageQuota writes a value of the 'storage_quota' type to the given writer. +func MarshalStorageQuota(object *StorageQuota, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeStorageQuota(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeStorageQuota writes a value of the 'storage_quota' type to the given stream. +func writeStorageQuota(object *StorageQuota, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("unit") + stream.WriteString(object.unit) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteFloat64(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalStorageQuota reads a value of the 'storage_quota' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalStorageQuota(source interface{}) (object *StorageQuota, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readStorageQuota(iterator) + err = iterator.Error + return +} + +// readStorageQuota reads a value of the 'storage_quota' type from the given iterator. +func readStorageQuota(iterator *jsoniter.Iterator) *StorageQuota { + object := &StorageQuota{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "unit": + value := iterator.ReadString() + object.unit = value + object.bitmap_ |= 1 + case "value": + value := iterator.ReadFloat64() + object.value = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/storage_quota_values_client.go b/clustersmgmt/v2alpha1/storage_quota_values_client.go new file mode 100644 index 00000000..b96f6f01 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_values_client.go @@ -0,0 +1,286 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// StorageQuotaValuesClient is the client of the 'storage_quota_values' resource. +// +// Manages storage quota values. +type StorageQuotaValuesClient struct { + transport http.RoundTripper + path string +} + +// NewStorageQuotaValuesClient creates a new client for the 'storage_quota_values' +// resource using the given transport to send the requests and receive the +// responses. +func NewStorageQuotaValuesClient(transport http.RoundTripper, path string) *StorageQuotaValuesClient { + return &StorageQuotaValuesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of Storage Quota Values. +func (c *StorageQuotaValuesClient) List() *StorageQuotaValuesListRequest { + return &StorageQuotaValuesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// StorageQuotaValuesListRequest is the request for the 'list' method. +type StorageQuotaValuesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *StorageQuotaValuesListRequest) Parameter(name string, value interface{}) *StorageQuotaValuesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *StorageQuotaValuesListRequest) Header(name string, value interface{}) *StorageQuotaValuesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *StorageQuotaValuesListRequest) Impersonate(user string) *StorageQuotaValuesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *StorageQuotaValuesListRequest) Page(value int) *StorageQuotaValuesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *StorageQuotaValuesListRequest) Size(value int) *StorageQuotaValuesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *StorageQuotaValuesListRequest) Send() (result *StorageQuotaValuesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *StorageQuotaValuesListRequest) SendContext(ctx context.Context) (result *StorageQuotaValuesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &StorageQuotaValuesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readStorageQuotaValuesListResponse(result, reader) + if err != nil { + return + } + return +} + +// StorageQuotaValuesListResponse is the response for the 'list' method. +type StorageQuotaValuesListResponse struct { + status int + header http.Header + err *errors.Error + items *StorageQuotaList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *StorageQuotaValuesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *StorageQuotaValuesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *StorageQuotaValuesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of values. +func (r *StorageQuotaValuesListResponse) Items() *StorageQuotaList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of values. +func (r *StorageQuotaValuesListResponse) GetItems() (value *StorageQuotaList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *StorageQuotaValuesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *StorageQuotaValuesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *StorageQuotaValuesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *StorageQuotaValuesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *StorageQuotaValuesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *StorageQuotaValuesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/storage_quota_values_resource_json.go b/clustersmgmt/v2alpha1/storage_quota_values_resource_json.go new file mode 100644 index 00000000..945d1862 --- /dev/null +++ b/clustersmgmt/v2alpha1/storage_quota_values_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeStorageQuotaValuesListRequest(request *StorageQuotaValuesListRequest, writer io.Writer) error { + return nil +} +func readStorageQuotaValuesListResponse(response *StorageQuotaValuesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readStorageQuotaList(iterator) + response.items = &StorageQuotaList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/string_list_type_json.go b/clustersmgmt/v2alpha1/string_list_type_json.go new file mode 100644 index 00000000..d1df5e71 --- /dev/null +++ b/clustersmgmt/v2alpha1/string_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalStringList writes a list of values of the 'string' type to +// the given writer. +func MarshalStringList(list []string, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeStringList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeStringList writes a list of value of the 'string' type to +// the given stream. +func writeStringList(list []string, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(value) + } + stream.WriteArrayEnd() +} + +// UnmarshalStringList reads a list of values of the 'string' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalStringList(source interface{}) (items []string, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readStringList(iterator) + err = iterator.Error + return +} + +// readStringList reads list of values of the ”string' type from +// the given iterator. +func readStringList(iterator *jsoniter.Iterator) []string { + list := []string{} + for iterator.ReadArray() { + item := iterator.ReadString() + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/sts_builder.go b/clustersmgmt/v2alpha1/sts_builder.go new file mode 100644 index 00000000..9f24e849 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_builder.go @@ -0,0 +1,219 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSBuilder contains the data and logic needed to build 'STS' objects. +// +// Contains the necessary attributes to support role-based authentication on AWS. +type STSBuilder struct { + bitmap_ uint32 + oidcEndpointURL string + externalID string + instanceIAMRoles *InstanceIAMRolesBuilder + oidcConfig *OidcConfigBuilder + operatorIAMRoles []*OperatorIAMRoleBuilder + operatorRolePrefix string + permissionBoundary string + roleARN string + supportRoleARN string + autoMode bool + enabled bool + managedPolicies bool +} + +// NewSTS creates a new builder of 'STS' objects. +func NewSTS() *STSBuilder { + return &STSBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *STSBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// OIDCEndpointURL sets the value of the 'OIDC_endpoint_URL' attribute to the given value. +func (b *STSBuilder) OIDCEndpointURL(value string) *STSBuilder { + b.oidcEndpointURL = value + b.bitmap_ |= 1 + return b +} + +// AutoMode sets the value of the 'auto_mode' attribute to the given value. +func (b *STSBuilder) AutoMode(value bool) *STSBuilder { + b.autoMode = value + b.bitmap_ |= 2 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *STSBuilder) Enabled(value bool) *STSBuilder { + b.enabled = value + b.bitmap_ |= 4 + return b +} + +// ExternalID sets the value of the 'external_ID' attribute to the given value. +func (b *STSBuilder) ExternalID(value string) *STSBuilder { + b.externalID = value + b.bitmap_ |= 8 + return b +} + +// InstanceIAMRoles sets the value of the 'instance_IAM_roles' attribute to the given value. +// +// Contains the necessary attributes to support role-based authentication on AWS. +func (b *STSBuilder) InstanceIAMRoles(value *InstanceIAMRolesBuilder) *STSBuilder { + b.instanceIAMRoles = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// ManagedPolicies sets the value of the 'managed_policies' attribute to the given value. +func (b *STSBuilder) ManagedPolicies(value bool) *STSBuilder { + b.managedPolicies = value + b.bitmap_ |= 32 + return b +} + +// OidcConfig sets the value of the 'oidc_config' attribute to the given value. +// +// Contains the necessary attributes to support oidc configuration hosting under Red Hat or registering a Customer's byo oidc config. +func (b *STSBuilder) OidcConfig(value *OidcConfigBuilder) *STSBuilder { + b.oidcConfig = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// OperatorIAMRoles sets the value of the 'operator_IAM_roles' attribute to the given values. +func (b *STSBuilder) OperatorIAMRoles(values ...*OperatorIAMRoleBuilder) *STSBuilder { + b.operatorIAMRoles = make([]*OperatorIAMRoleBuilder, len(values)) + copy(b.operatorIAMRoles, values) + b.bitmap_ |= 128 + return b +} + +// OperatorRolePrefix sets the value of the 'operator_role_prefix' attribute to the given value. +func (b *STSBuilder) OperatorRolePrefix(value string) *STSBuilder { + b.operatorRolePrefix = value + b.bitmap_ |= 256 + return b +} + +// PermissionBoundary sets the value of the 'permission_boundary' attribute to the given value. +func (b *STSBuilder) PermissionBoundary(value string) *STSBuilder { + b.permissionBoundary = value + b.bitmap_ |= 512 + return b +} + +// RoleARN sets the value of the 'role_ARN' attribute to the given value. +func (b *STSBuilder) RoleARN(value string) *STSBuilder { + b.roleARN = value + b.bitmap_ |= 1024 + return b +} + +// SupportRoleARN sets the value of the 'support_role_ARN' attribute to the given value. +func (b *STSBuilder) SupportRoleARN(value string) *STSBuilder { + b.supportRoleARN = value + b.bitmap_ |= 2048 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *STSBuilder) Copy(object *STS) *STSBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.oidcEndpointURL = object.oidcEndpointURL + b.autoMode = object.autoMode + b.enabled = object.enabled + b.externalID = object.externalID + if object.instanceIAMRoles != nil { + b.instanceIAMRoles = NewInstanceIAMRoles().Copy(object.instanceIAMRoles) + } else { + b.instanceIAMRoles = nil + } + b.managedPolicies = object.managedPolicies + if object.oidcConfig != nil { + b.oidcConfig = NewOidcConfig().Copy(object.oidcConfig) + } else { + b.oidcConfig = nil + } + if object.operatorIAMRoles != nil { + b.operatorIAMRoles = make([]*OperatorIAMRoleBuilder, len(object.operatorIAMRoles)) + for i, v := range object.operatorIAMRoles { + b.operatorIAMRoles[i] = NewOperatorIAMRole().Copy(v) + } + } else { + b.operatorIAMRoles = nil + } + b.operatorRolePrefix = object.operatorRolePrefix + b.permissionBoundary = object.permissionBoundary + b.roleARN = object.roleARN + b.supportRoleARN = object.supportRoleARN + return b +} + +// Build creates a 'STS' object using the configuration stored in the builder. +func (b *STSBuilder) Build() (object *STS, err error) { + object = new(STS) + object.bitmap_ = b.bitmap_ + object.oidcEndpointURL = b.oidcEndpointURL + object.autoMode = b.autoMode + object.enabled = b.enabled + object.externalID = b.externalID + if b.instanceIAMRoles != nil { + object.instanceIAMRoles, err = b.instanceIAMRoles.Build() + if err != nil { + return + } + } + object.managedPolicies = b.managedPolicies + if b.oidcConfig != nil { + object.oidcConfig, err = b.oidcConfig.Build() + if err != nil { + return + } + } + if b.operatorIAMRoles != nil { + object.operatorIAMRoles = make([]*OperatorIAMRole, len(b.operatorIAMRoles)) + for i, v := range b.operatorIAMRoles { + object.operatorIAMRoles[i], err = v.Build() + if err != nil { + return + } + } + } + object.operatorRolePrefix = b.operatorRolePrefix + object.permissionBoundary = b.permissionBoundary + object.roleARN = b.roleARN + object.supportRoleARN = b.supportRoleARN + return +} diff --git a/clustersmgmt/v2alpha1/sts_credential_request_builder.go b/clustersmgmt/v2alpha1/sts_credential_request_builder.go new file mode 100644 index 00000000..7fde0f26 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_request_builder.go @@ -0,0 +1,88 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSCredentialRequestBuilder contains the data and logic needed to build 'STS_credential_request' objects. +// +// Representation of an credRequest +type STSCredentialRequestBuilder struct { + bitmap_ uint32 + name string + operator *STSOperatorBuilder +} + +// NewSTSCredentialRequest creates a new builder of 'STS_credential_request' objects. +func NewSTSCredentialRequest() *STSCredentialRequestBuilder { + return &STSCredentialRequestBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *STSCredentialRequestBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *STSCredentialRequestBuilder) Name(value string) *STSCredentialRequestBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Operator sets the value of the 'operator' attribute to the given value. +// +// Representation of an sts operator +func (b *STSCredentialRequestBuilder) Operator(value *STSOperatorBuilder) *STSCredentialRequestBuilder { + b.operator = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *STSCredentialRequestBuilder) Copy(object *STSCredentialRequest) *STSCredentialRequestBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + if object.operator != nil { + b.operator = NewSTSOperator().Copy(object.operator) + } else { + b.operator = nil + } + return b +} + +// Build creates a 'STS_credential_request' object using the configuration stored in the builder. +func (b *STSCredentialRequestBuilder) Build() (object *STSCredentialRequest, err error) { + object = new(STSCredentialRequest) + object.bitmap_ = b.bitmap_ + object.name = b.name + if b.operator != nil { + object.operator, err = b.operator.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/sts_credential_request_list_builder.go b/clustersmgmt/v2alpha1/sts_credential_request_list_builder.go new file mode 100644 index 00000000..8c32eec5 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_request_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSCredentialRequestListBuilder contains the data and logic needed to build +// 'STS_credential_request' objects. +type STSCredentialRequestListBuilder struct { + items []*STSCredentialRequestBuilder +} + +// NewSTSCredentialRequestList creates a new builder of 'STS_credential_request' objects. +func NewSTSCredentialRequestList() *STSCredentialRequestListBuilder { + return new(STSCredentialRequestListBuilder) +} + +// Items sets the items of the list. +func (b *STSCredentialRequestListBuilder) Items(values ...*STSCredentialRequestBuilder) *STSCredentialRequestListBuilder { + b.items = make([]*STSCredentialRequestBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *STSCredentialRequestListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *STSCredentialRequestListBuilder) Copy(list *STSCredentialRequestList) *STSCredentialRequestListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*STSCredentialRequestBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSTSCredentialRequest().Copy(v) + } + } + return b +} + +// Build creates a list of 'STS_credential_request' objects using the +// configuration stored in the builder. +func (b *STSCredentialRequestListBuilder) Build() (list *STSCredentialRequestList, err error) { + items := make([]*STSCredentialRequest, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(STSCredentialRequestList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/sts_credential_request_list_type_json.go b/clustersmgmt/v2alpha1/sts_credential_request_list_type_json.go new file mode 100644 index 00000000..76f3aaec --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_request_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSTSCredentialRequestList writes a list of values of the 'STS_credential_request' type to +// the given writer. +func MarshalSTSCredentialRequestList(list []*STSCredentialRequest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSTSCredentialRequestList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSTSCredentialRequestList writes a list of value of the 'STS_credential_request' type to +// the given stream. +func writeSTSCredentialRequestList(list []*STSCredentialRequest, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSTSCredentialRequest(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSTSCredentialRequestList reads a list of values of the 'STS_credential_request' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSTSCredentialRequestList(source interface{}) (items []*STSCredentialRequest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSTSCredentialRequestList(iterator) + err = iterator.Error + return +} + +// readSTSCredentialRequestList reads list of values of the ”STS_credential_request' type from +// the given iterator. +func readSTSCredentialRequestList(iterator *jsoniter.Iterator) []*STSCredentialRequest { + list := []*STSCredentialRequest{} + for iterator.ReadArray() { + item := readSTSCredentialRequest(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/sts_credential_request_type.go b/clustersmgmt/v2alpha1/sts_credential_request_type.go new file mode 100644 index 00000000..9cc6733f --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_request_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSCredentialRequest represents the values of the 'STS_credential_request' type. +// +// Representation of an credRequest +type STSCredentialRequest struct { + bitmap_ uint32 + name string + operator *STSOperator +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *STSCredentialRequest) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of CredRequest +func (o *STSCredentialRequest) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of CredRequest +func (o *STSCredentialRequest) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Operator returns the value of the 'operator' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Operator Details +func (o *STSCredentialRequest) Operator() *STSOperator { + if o != nil && o.bitmap_&2 != 0 { + return o.operator + } + return nil +} + +// GetOperator returns the value of the 'operator' attribute and +// a flag indicating if the attribute has a value. +// +// Operator Details +func (o *STSCredentialRequest) GetOperator() (value *STSOperator, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.operator + } + return +} + +// STSCredentialRequestListKind is the name of the type used to represent list of objects of +// type 'STS_credential_request'. +const STSCredentialRequestListKind = "STSCredentialRequestList" + +// STSCredentialRequestListLinkKind is the name of the type used to represent links to list +// of objects of type 'STS_credential_request'. +const STSCredentialRequestListLinkKind = "STSCredentialRequestListLink" + +// STSCredentialRequestNilKind is the name of the type used to nil lists of objects of +// type 'STS_credential_request'. +const STSCredentialRequestListNilKind = "STSCredentialRequestListNil" + +// STSCredentialRequestList is a list of values of the 'STS_credential_request' type. +type STSCredentialRequestList struct { + href string + link bool + items []*STSCredentialRequest +} + +// Len returns the length of the list. +func (l *STSCredentialRequestList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *STSCredentialRequestList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *STSCredentialRequestList) Get(i int) *STSCredentialRequest { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *STSCredentialRequestList) Slice() []*STSCredentialRequest { + var slice []*STSCredentialRequest + if l == nil { + slice = make([]*STSCredentialRequest, 0) + } else { + slice = make([]*STSCredentialRequest, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *STSCredentialRequestList) Each(f func(item *STSCredentialRequest) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *STSCredentialRequestList) Range(f func(index int, item *STSCredentialRequest) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/sts_credential_request_type_json.go b/clustersmgmt/v2alpha1/sts_credential_request_type_json.go new file mode 100644 index 00000000..0e5f3db9 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_request_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSTSCredentialRequest writes a value of the 'STS_credential_request' type to the given writer. +func MarshalSTSCredentialRequest(object *STSCredentialRequest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSTSCredentialRequest(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSTSCredentialRequest writes a value of the 'STS_credential_request' type to the given stream. +func writeSTSCredentialRequest(object *STSCredentialRequest, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 && object.operator != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator") + writeSTSOperator(object.operator, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalSTSCredentialRequest reads a value of the 'STS_credential_request' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSTSCredentialRequest(source interface{}) (object *STSCredentialRequest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSTSCredentialRequest(iterator) + err = iterator.Error + return +} + +// readSTSCredentialRequest reads a value of the 'STS_credential_request' type from the given iterator. +func readSTSCredentialRequest(iterator *jsoniter.Iterator) *STSCredentialRequest { + object := &STSCredentialRequest{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "operator": + value := readSTSOperator(iterator) + object.operator = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/sts_credential_requests_inquiry_client.go b/clustersmgmt/v2alpha1/sts_credential_requests_inquiry_client.go new file mode 100644 index 00000000..ba870ba6 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_requests_inquiry_client.go @@ -0,0 +1,288 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// STSCredentialRequestsInquiryClient is the client of the 'STS_credential_requests_inquiry' resource. +// +// Manages STS Credential Request +type STSCredentialRequestsInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewSTSCredentialRequestsInquiryClient creates a new client for the 'STS_credential_requests_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewSTSCredentialRequestsInquiryClient(transport http.RoundTripper, path string) *STSCredentialRequestsInquiryClient { + return &STSCredentialRequestsInquiryClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of policies. +func (c *STSCredentialRequestsInquiryClient) List() *STSCredentialRequestsInquiryListRequest { + return &STSCredentialRequestsInquiryListRequest{ + transport: c.transport, + path: c.path, + } +} + +// STSCredentialRequestsInquiryListRequest is the request for the 'list' method. +type STSCredentialRequestsInquiryListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *STSCredentialRequestsInquiryListRequest) Parameter(name string, value interface{}) *STSCredentialRequestsInquiryListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *STSCredentialRequestsInquiryListRequest) Header(name string, value interface{}) *STSCredentialRequestsInquiryListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *STSCredentialRequestsInquiryListRequest) Impersonate(user string) *STSCredentialRequestsInquiryListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *STSCredentialRequestsInquiryListRequest) Page(value int) *STSCredentialRequestsInquiryListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *STSCredentialRequestsInquiryListRequest) Size(value int) *STSCredentialRequestsInquiryListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *STSCredentialRequestsInquiryListRequest) Send() (result *STSCredentialRequestsInquiryListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *STSCredentialRequestsInquiryListRequest) SendContext(ctx context.Context) (result *STSCredentialRequestsInquiryListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &STSCredentialRequestsInquiryListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readSTSCredentialRequestsInquiryListResponse(result, reader) + if err != nil { + return + } + return +} + +// STSCredentialRequestsInquiryListResponse is the response for the 'list' method. +type STSCredentialRequestsInquiryListResponse struct { + status int + header http.Header + err *errors.Error + items *STSCredentialRequestList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *STSCredentialRequestsInquiryListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *STSCredentialRequestsInquiryListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *STSCredentialRequestsInquiryListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of CredRequest. +func (r *STSCredentialRequestsInquiryListResponse) Items() *STSCredentialRequestList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of CredRequest. +func (r *STSCredentialRequestsInquiryListResponse) GetItems() (value *STSCredentialRequestList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *STSCredentialRequestsInquiryListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *STSCredentialRequestsInquiryListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *STSCredentialRequestsInquiryListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *STSCredentialRequestsInquiryListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *STSCredentialRequestsInquiryListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *STSCredentialRequestsInquiryListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/sts_credential_requests_inquiry_resource_json.go b/clustersmgmt/v2alpha1/sts_credential_requests_inquiry_resource_json.go new file mode 100644 index 00000000..e8a164e1 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_credential_requests_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeSTSCredentialRequestsInquiryListRequest(request *STSCredentialRequestsInquiryListRequest, writer io.Writer) error { + return nil +} +func readSTSCredentialRequestsInquiryListResponse(response *STSCredentialRequestsInquiryListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readSTSCredentialRequestList(iterator) + response.items = &STSCredentialRequestList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/sts_list_builder.go b/clustersmgmt/v2alpha1/sts_list_builder.go new file mode 100644 index 00000000..93326017 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSListBuilder contains the data and logic needed to build +// 'STS' objects. +type STSListBuilder struct { + items []*STSBuilder +} + +// NewSTSList creates a new builder of 'STS' objects. +func NewSTSList() *STSListBuilder { + return new(STSListBuilder) +} + +// Items sets the items of the list. +func (b *STSListBuilder) Items(values ...*STSBuilder) *STSListBuilder { + b.items = make([]*STSBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *STSListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *STSListBuilder) Copy(list *STSList) *STSListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*STSBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSTS().Copy(v) + } + } + return b +} + +// Build creates a list of 'STS' objects using the +// configuration stored in the builder. +func (b *STSListBuilder) Build() (list *STSList, err error) { + items := make([]*STS, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(STSList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/sts_list_type_json.go b/clustersmgmt/v2alpha1/sts_list_type_json.go new file mode 100644 index 00000000..44aa4b6b --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSTSList writes a list of values of the 'STS' type to +// the given writer. +func MarshalSTSList(list []*STS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSTSList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSTSList writes a list of value of the 'STS' type to +// the given stream. +func writeSTSList(list []*STS, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSTS(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSTSList reads a list of values of the 'STS' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSTSList(source interface{}) (items []*STS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSTSList(iterator) + err = iterator.Error + return +} + +// readSTSList reads list of values of the ”STS' type from +// the given iterator. +func readSTSList(iterator *jsoniter.Iterator) []*STS { + list := []*STS{} + for iterator.ReadArray() { + item := readSTS(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/sts_operator_builder.go b/clustersmgmt/v2alpha1/sts_operator_builder.go new file mode 100644 index 00000000..a66dda41 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_operator_builder.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSOperatorBuilder contains the data and logic needed to build 'STS_operator' objects. +// +// Representation of an sts operator +type STSOperatorBuilder struct { + bitmap_ uint32 + maxVersion string + minVersion string + name string + namespace string + serviceAccounts []string +} + +// NewSTSOperator creates a new builder of 'STS_operator' objects. +func NewSTSOperator() *STSOperatorBuilder { + return &STSOperatorBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *STSOperatorBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// MaxVersion sets the value of the 'max_version' attribute to the given value. +func (b *STSOperatorBuilder) MaxVersion(value string) *STSOperatorBuilder { + b.maxVersion = value + b.bitmap_ |= 1 + return b +} + +// MinVersion sets the value of the 'min_version' attribute to the given value. +func (b *STSOperatorBuilder) MinVersion(value string) *STSOperatorBuilder { + b.minVersion = value + b.bitmap_ |= 2 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *STSOperatorBuilder) Name(value string) *STSOperatorBuilder { + b.name = value + b.bitmap_ |= 4 + return b +} + +// Namespace sets the value of the 'namespace' attribute to the given value. +func (b *STSOperatorBuilder) Namespace(value string) *STSOperatorBuilder { + b.namespace = value + b.bitmap_ |= 8 + return b +} + +// ServiceAccounts sets the value of the 'service_accounts' attribute to the given values. +func (b *STSOperatorBuilder) ServiceAccounts(values ...string) *STSOperatorBuilder { + b.serviceAccounts = make([]string, len(values)) + copy(b.serviceAccounts, values) + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *STSOperatorBuilder) Copy(object *STSOperator) *STSOperatorBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.maxVersion = object.maxVersion + b.minVersion = object.minVersion + b.name = object.name + b.namespace = object.namespace + if object.serviceAccounts != nil { + b.serviceAccounts = make([]string, len(object.serviceAccounts)) + copy(b.serviceAccounts, object.serviceAccounts) + } else { + b.serviceAccounts = nil + } + return b +} + +// Build creates a 'STS_operator' object using the configuration stored in the builder. +func (b *STSOperatorBuilder) Build() (object *STSOperator, err error) { + object = new(STSOperator) + object.bitmap_ = b.bitmap_ + object.maxVersion = b.maxVersion + object.minVersion = b.minVersion + object.name = b.name + object.namespace = b.namespace + if b.serviceAccounts != nil { + object.serviceAccounts = make([]string, len(b.serviceAccounts)) + copy(object.serviceAccounts, b.serviceAccounts) + } + return +} diff --git a/clustersmgmt/v2alpha1/sts_operator_list_builder.go b/clustersmgmt/v2alpha1/sts_operator_list_builder.go new file mode 100644 index 00000000..550c9842 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_operator_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSOperatorListBuilder contains the data and logic needed to build +// 'STS_operator' objects. +type STSOperatorListBuilder struct { + items []*STSOperatorBuilder +} + +// NewSTSOperatorList creates a new builder of 'STS_operator' objects. +func NewSTSOperatorList() *STSOperatorListBuilder { + return new(STSOperatorListBuilder) +} + +// Items sets the items of the list. +func (b *STSOperatorListBuilder) Items(values ...*STSOperatorBuilder) *STSOperatorListBuilder { + b.items = make([]*STSOperatorBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *STSOperatorListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *STSOperatorListBuilder) Copy(list *STSOperatorList) *STSOperatorListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*STSOperatorBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSTSOperator().Copy(v) + } + } + return b +} + +// Build creates a list of 'STS_operator' objects using the +// configuration stored in the builder. +func (b *STSOperatorListBuilder) Build() (list *STSOperatorList, err error) { + items := make([]*STSOperator, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(STSOperatorList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/sts_operator_list_type_json.go b/clustersmgmt/v2alpha1/sts_operator_list_type_json.go new file mode 100644 index 00000000..33ad781f --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_operator_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSTSOperatorList writes a list of values of the 'STS_operator' type to +// the given writer. +func MarshalSTSOperatorList(list []*STSOperator, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSTSOperatorList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSTSOperatorList writes a list of value of the 'STS_operator' type to +// the given stream. +func writeSTSOperatorList(list []*STSOperator, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSTSOperator(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSTSOperatorList reads a list of values of the 'STS_operator' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSTSOperatorList(source interface{}) (items []*STSOperator, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSTSOperatorList(iterator) + err = iterator.Error + return +} + +// readSTSOperatorList reads list of values of the ”STS_operator' type from +// the given iterator. +func readSTSOperatorList(iterator *jsoniter.Iterator) []*STSOperator { + list := []*STSOperator{} + for iterator.ReadArray() { + item := readSTSOperator(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/sts_operator_type.go b/clustersmgmt/v2alpha1/sts_operator_type.go new file mode 100644 index 00000000..fb65433c --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_operator_type.go @@ -0,0 +1,238 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STSOperator represents the values of the 'STS_operator' type. +// +// Representation of an sts operator +type STSOperator struct { + bitmap_ uint32 + maxVersion string + minVersion string + name string + namespace string + serviceAccounts []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *STSOperator) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// MaxVersion returns the value of the 'max_version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Maximum ocp version supported +func (o *STSOperator) MaxVersion() string { + if o != nil && o.bitmap_&1 != 0 { + return o.maxVersion + } + return "" +} + +// GetMaxVersion returns the value of the 'max_version' attribute and +// a flag indicating if the attribute has a value. +// +// Maximum ocp version supported +func (o *STSOperator) GetMaxVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.maxVersion + } + return +} + +// MinVersion returns the value of the 'min_version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Minimum ocp version supported +func (o *STSOperator) MinVersion() string { + if o != nil && o.bitmap_&2 != 0 { + return o.minVersion + } + return "" +} + +// GetMinVersion returns the value of the 'min_version' attribute and +// a flag indicating if the attribute has a value. +// +// Minimum ocp version supported +func (o *STSOperator) GetMinVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.minVersion + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Operator Name +func (o *STSOperator) Name() string { + if o != nil && o.bitmap_&4 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Operator Name +func (o *STSOperator) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.name + } + return +} + +// Namespace returns the value of the 'namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Operator Namespace +func (o *STSOperator) Namespace() string { + if o != nil && o.bitmap_&8 != 0 { + return o.namespace + } + return "" +} + +// GetNamespace returns the value of the 'namespace' attribute and +// a flag indicating if the attribute has a value. +// +// Operator Namespace +func (o *STSOperator) GetNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.namespace + } + return +} + +// ServiceAccounts returns the value of the 'service_accounts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Service Accounts +func (o *STSOperator) ServiceAccounts() []string { + if o != nil && o.bitmap_&16 != 0 { + return o.serviceAccounts + } + return nil +} + +// GetServiceAccounts returns the value of the 'service_accounts' attribute and +// a flag indicating if the attribute has a value. +// +// Service Accounts +func (o *STSOperator) GetServiceAccounts() (value []string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.serviceAccounts + } + return +} + +// STSOperatorListKind is the name of the type used to represent list of objects of +// type 'STS_operator'. +const STSOperatorListKind = "STSOperatorList" + +// STSOperatorListLinkKind is the name of the type used to represent links to list +// of objects of type 'STS_operator'. +const STSOperatorListLinkKind = "STSOperatorListLink" + +// STSOperatorNilKind is the name of the type used to nil lists of objects of +// type 'STS_operator'. +const STSOperatorListNilKind = "STSOperatorListNil" + +// STSOperatorList is a list of values of the 'STS_operator' type. +type STSOperatorList struct { + href string + link bool + items []*STSOperator +} + +// Len returns the length of the list. +func (l *STSOperatorList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *STSOperatorList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *STSOperatorList) Get(i int) *STSOperator { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *STSOperatorList) Slice() []*STSOperator { + var slice []*STSOperator + if l == nil { + slice = make([]*STSOperator, 0) + } else { + slice = make([]*STSOperator, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *STSOperatorList) Each(f func(item *STSOperator) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *STSOperatorList) Range(f func(index int, item *STSOperator) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/sts_operator_type_json.go b/clustersmgmt/v2alpha1/sts_operator_type_json.go new file mode 100644 index 00000000..da564d69 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_operator_type_json.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSTSOperator writes a value of the 'STS_operator' type to the given writer. +func MarshalSTSOperator(object *STSOperator, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSTSOperator(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSTSOperator writes a value of the 'STS_operator' type to the given stream. +func writeSTSOperator(object *STSOperator, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("max_version") + stream.WriteString(object.maxVersion) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("min_version") + stream.WriteString(object.minVersion) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("namespace") + stream.WriteString(object.namespace) + count++ + } + present_ = object.bitmap_&16 != 0 && object.serviceAccounts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_accounts") + writeStringList(object.serviceAccounts, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalSTSOperator reads a value of the 'STS_operator' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSTSOperator(source interface{}) (object *STSOperator, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSTSOperator(iterator) + err = iterator.Error + return +} + +// readSTSOperator reads a value of the 'STS_operator' type from the given iterator. +func readSTSOperator(iterator *jsoniter.Iterator) *STSOperator { + object := &STSOperator{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "max_version": + value := iterator.ReadString() + object.maxVersion = value + object.bitmap_ |= 1 + case "min_version": + value := iterator.ReadString() + object.minVersion = value + object.bitmap_ |= 2 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 4 + case "namespace": + value := iterator.ReadString() + object.namespace = value + object.bitmap_ |= 8 + case "service_accounts": + value := readStringList(iterator) + object.serviceAccounts = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_builder.go b/clustersmgmt/v2alpha1/sts_support_jump_role_builder.go new file mode 100644 index 00000000..b7a38233 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_builder.go @@ -0,0 +1,63 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// StsSupportJumpRoleBuilder contains the data and logic needed to build 'sts_support_jump_role' objects. +// +// Isolated STS support role created per organization. +type StsSupportJumpRoleBuilder struct { + bitmap_ uint32 + roleArn string +} + +// NewStsSupportJumpRole creates a new builder of 'sts_support_jump_role' objects. +func NewStsSupportJumpRole() *StsSupportJumpRoleBuilder { + return &StsSupportJumpRoleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *StsSupportJumpRoleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// RoleArn sets the value of the 'role_arn' attribute to the given value. +func (b *StsSupportJumpRoleBuilder) RoleArn(value string) *StsSupportJumpRoleBuilder { + b.roleArn = value + b.bitmap_ |= 1 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *StsSupportJumpRoleBuilder) Copy(object *StsSupportJumpRole) *StsSupportJumpRoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.roleArn = object.roleArn + return b +} + +// Build creates a 'sts_support_jump_role' object using the configuration stored in the builder. +func (b *StsSupportJumpRoleBuilder) Build() (object *StsSupportJumpRole, err error) { + object = new(StsSupportJumpRole) + object.bitmap_ = b.bitmap_ + object.roleArn = b.roleArn + return +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_client.go b/clustersmgmt/v2alpha1/sts_support_jump_role_client.go new file mode 100644 index 00000000..191171fe --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// StsSupportJumpRoleClient is the client of the 'sts_support_jump_role' resource. +// +// Provides the role arn to use to assume the support role in the customer's aws account. +type StsSupportJumpRoleClient struct { + transport http.RoundTripper + path string +} + +// NewStsSupportJumpRoleClient creates a new client for the 'sts_support_jump_role' +// resource using the given transport to send the requests and receive the +// responses. +func NewStsSupportJumpRoleClient(transport http.RoundTripper, path string) *StsSupportJumpRoleClient { + return &StsSupportJumpRoleClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *StsSupportJumpRoleClient) Get() *StsSupportJumpRoleGetRequest { + return &StsSupportJumpRoleGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// StsSupportJumpRolePollRequest is the request for the Poll method. +type StsSupportJumpRolePollRequest struct { + request *StsSupportJumpRoleGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *StsSupportJumpRolePollRequest) Parameter(name string, value interface{}) *StsSupportJumpRolePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *StsSupportJumpRolePollRequest) Header(name string, value interface{}) *StsSupportJumpRolePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *StsSupportJumpRolePollRequest) Interval(value time.Duration) *StsSupportJumpRolePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *StsSupportJumpRolePollRequest) Status(value int) *StsSupportJumpRolePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *StsSupportJumpRolePollRequest) Predicate(value func(*StsSupportJumpRoleGetResponse) bool) *StsSupportJumpRolePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*StsSupportJumpRoleGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *StsSupportJumpRolePollRequest) StartContext(ctx context.Context) (response *StsSupportJumpRolePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &StsSupportJumpRolePollResponse{ + response: result.(*StsSupportJumpRoleGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *StsSupportJumpRolePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// StsSupportJumpRolePollResponse is the response for the Poll method. +type StsSupportJumpRolePollResponse struct { + response *StsSupportJumpRoleGetResponse +} + +// Status returns the response status code. +func (r *StsSupportJumpRolePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *StsSupportJumpRolePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *StsSupportJumpRolePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *StsSupportJumpRolePollResponse) Body() *StsSupportJumpRole { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *StsSupportJumpRolePollResponse) GetBody() (value *StsSupportJumpRole, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *StsSupportJumpRoleClient) Poll() *StsSupportJumpRolePollRequest { + return &StsSupportJumpRolePollRequest{ + request: c.Get(), + } +} + +// StsSupportJumpRoleGetRequest is the request for the 'get' method. +type StsSupportJumpRoleGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *StsSupportJumpRoleGetRequest) Parameter(name string, value interface{}) *StsSupportJumpRoleGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *StsSupportJumpRoleGetRequest) Header(name string, value interface{}) *StsSupportJumpRoleGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *StsSupportJumpRoleGetRequest) Impersonate(user string) *StsSupportJumpRoleGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *StsSupportJumpRoleGetRequest) Send() (result *StsSupportJumpRoleGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *StsSupportJumpRoleGetRequest) SendContext(ctx context.Context) (result *StsSupportJumpRoleGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &StsSupportJumpRoleGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readStsSupportJumpRoleGetResponse(result, reader) + if err != nil { + return + } + return +} + +// StsSupportJumpRoleGetResponse is the response for the 'get' method. +type StsSupportJumpRoleGetResponse struct { + status int + header http.Header + err *errors.Error + body *StsSupportJumpRole +} + +// Status returns the response status code. +func (r *StsSupportJumpRoleGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *StsSupportJumpRoleGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *StsSupportJumpRoleGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *StsSupportJumpRoleGetResponse) Body() *StsSupportJumpRole { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *StsSupportJumpRoleGetResponse) GetBody() (value *StsSupportJumpRole, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_list_builder.go b/clustersmgmt/v2alpha1/sts_support_jump_role_list_builder.go new file mode 100644 index 00000000..0aa55b1d --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// StsSupportJumpRoleListBuilder contains the data and logic needed to build +// 'sts_support_jump_role' objects. +type StsSupportJumpRoleListBuilder struct { + items []*StsSupportJumpRoleBuilder +} + +// NewStsSupportJumpRoleList creates a new builder of 'sts_support_jump_role' objects. +func NewStsSupportJumpRoleList() *StsSupportJumpRoleListBuilder { + return new(StsSupportJumpRoleListBuilder) +} + +// Items sets the items of the list. +func (b *StsSupportJumpRoleListBuilder) Items(values ...*StsSupportJumpRoleBuilder) *StsSupportJumpRoleListBuilder { + b.items = make([]*StsSupportJumpRoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *StsSupportJumpRoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *StsSupportJumpRoleListBuilder) Copy(list *StsSupportJumpRoleList) *StsSupportJumpRoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*StsSupportJumpRoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewStsSupportJumpRole().Copy(v) + } + } + return b +} + +// Build creates a list of 'sts_support_jump_role' objects using the +// configuration stored in the builder. +func (b *StsSupportJumpRoleListBuilder) Build() (list *StsSupportJumpRoleList, err error) { + items := make([]*StsSupportJumpRole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(StsSupportJumpRoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_list_type_json.go b/clustersmgmt/v2alpha1/sts_support_jump_role_list_type_json.go new file mode 100644 index 00000000..4f698cd6 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalStsSupportJumpRoleList writes a list of values of the 'sts_support_jump_role' type to +// the given writer. +func MarshalStsSupportJumpRoleList(list []*StsSupportJumpRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeStsSupportJumpRoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeStsSupportJumpRoleList writes a list of value of the 'sts_support_jump_role' type to +// the given stream. +func writeStsSupportJumpRoleList(list []*StsSupportJumpRole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeStsSupportJumpRole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalStsSupportJumpRoleList reads a list of values of the 'sts_support_jump_role' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalStsSupportJumpRoleList(source interface{}) (items []*StsSupportJumpRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readStsSupportJumpRoleList(iterator) + err = iterator.Error + return +} + +// readStsSupportJumpRoleList reads list of values of the ”sts_support_jump_role' type from +// the given iterator. +func readStsSupportJumpRoleList(iterator *jsoniter.Iterator) []*StsSupportJumpRole { + list := []*StsSupportJumpRole{} + for iterator.ReadArray() { + item := readStsSupportJumpRole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_resource_json.go b/clustersmgmt/v2alpha1/sts_support_jump_role_resource_json.go new file mode 100644 index 00000000..e6f9cbe1 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeStsSupportJumpRoleGetRequest(request *StsSupportJumpRoleGetRequest, writer io.Writer) error { + return nil +} +func readStsSupportJumpRoleGetResponse(response *StsSupportJumpRoleGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalStsSupportJumpRole(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_type.go b/clustersmgmt/v2alpha1/sts_support_jump_role_type.go new file mode 100644 index 00000000..ca276c0e --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_type.go @@ -0,0 +1,142 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// StsSupportJumpRole represents the values of the 'sts_support_jump_role' type. +// +// Isolated STS support role created per organization. +type StsSupportJumpRole struct { + bitmap_ uint32 + roleArn string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *StsSupportJumpRole) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// RoleArn returns the value of the 'role_arn' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN of the support role created in the SRE jump account. +func (o *StsSupportJumpRole) RoleArn() string { + if o != nil && o.bitmap_&1 != 0 { + return o.roleArn + } + return "" +} + +// GetRoleArn returns the value of the 'role_arn' attribute and +// a flag indicating if the attribute has a value. +// +// ARN of the support role created in the SRE jump account. +func (o *StsSupportJumpRole) GetRoleArn() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.roleArn + } + return +} + +// StsSupportJumpRoleListKind is the name of the type used to represent list of objects of +// type 'sts_support_jump_role'. +const StsSupportJumpRoleListKind = "StsSupportJumpRoleList" + +// StsSupportJumpRoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'sts_support_jump_role'. +const StsSupportJumpRoleListLinkKind = "StsSupportJumpRoleListLink" + +// StsSupportJumpRoleNilKind is the name of the type used to nil lists of objects of +// type 'sts_support_jump_role'. +const StsSupportJumpRoleListNilKind = "StsSupportJumpRoleListNil" + +// StsSupportJumpRoleList is a list of values of the 'sts_support_jump_role' type. +type StsSupportJumpRoleList struct { + href string + link bool + items []*StsSupportJumpRole +} + +// Len returns the length of the list. +func (l *StsSupportJumpRoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *StsSupportJumpRoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *StsSupportJumpRoleList) Get(i int) *StsSupportJumpRole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *StsSupportJumpRoleList) Slice() []*StsSupportJumpRole { + var slice []*StsSupportJumpRole + if l == nil { + slice = make([]*StsSupportJumpRole, 0) + } else { + slice = make([]*StsSupportJumpRole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *StsSupportJumpRoleList) Each(f func(item *StsSupportJumpRole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *StsSupportJumpRoleList) Range(f func(index int, item *StsSupportJumpRole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/sts_support_jump_role_type_json.go b/clustersmgmt/v2alpha1/sts_support_jump_role_type_json.go new file mode 100644 index 00000000..5cc4e24e --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_support_jump_role_type_json.go @@ -0,0 +1,86 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalStsSupportJumpRole writes a value of the 'sts_support_jump_role' type to the given writer. +func MarshalStsSupportJumpRole(object *StsSupportJumpRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeStsSupportJumpRole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeStsSupportJumpRole writes a value of the 'sts_support_jump_role' type to the given stream. +func writeStsSupportJumpRole(object *StsSupportJumpRole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("role_arn") + stream.WriteString(object.roleArn) + } + stream.WriteObjectEnd() +} + +// UnmarshalStsSupportJumpRole reads a value of the 'sts_support_jump_role' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalStsSupportJumpRole(source interface{}) (object *StsSupportJumpRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readStsSupportJumpRole(iterator) + err = iterator.Error + return +} + +// readStsSupportJumpRole reads a value of the 'sts_support_jump_role' type from the given iterator. +func readStsSupportJumpRole(iterator *jsoniter.Iterator) *StsSupportJumpRole { + object := &StsSupportJumpRole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "role_arn": + value := iterator.ReadString() + object.roleArn = value + object.bitmap_ |= 1 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/sts_type.go b/clustersmgmt/v2alpha1/sts_type.go new file mode 100644 index 00000000..d725b6d8 --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_type.go @@ -0,0 +1,406 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// STS represents the values of the 'STS' type. +// +// Contains the necessary attributes to support role-based authentication on AWS. +type STS struct { + bitmap_ uint32 + oidcEndpointURL string + externalID string + instanceIAMRoles *InstanceIAMRoles + oidcConfig *OidcConfig + operatorIAMRoles []*OperatorIAMRole + operatorRolePrefix string + permissionBoundary string + roleARN string + supportRoleARN string + autoMode bool + enabled bool + managedPolicies bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *STS) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// OIDCEndpointURL returns the value of the 'OIDC_endpoint_URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// URL of the location where OIDC configuration and keys are available +func (o *STS) OIDCEndpointURL() string { + if o != nil && o.bitmap_&1 != 0 { + return o.oidcEndpointURL + } + return "" +} + +// GetOIDCEndpointURL returns the value of the 'OIDC_endpoint_URL' attribute and +// a flag indicating if the attribute has a value. +// +// URL of the location where OIDC configuration and keys are available +func (o *STS) GetOIDCEndpointURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.oidcEndpointURL + } + return +} + +// AutoMode returns the value of the 'auto_mode' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Auto creation mode for cluster - OCM will create the operator roles and OIDC provider. false by default. +func (o *STS) AutoMode() bool { + if o != nil && o.bitmap_&2 != 0 { + return o.autoMode + } + return false +} + +// GetAutoMode returns the value of the 'auto_mode' attribute and +// a flag indicating if the attribute has a value. +// +// Auto creation mode for cluster - OCM will create the operator roles and OIDC provider. false by default. +func (o *STS) GetAutoMode() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.autoMode + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// If STS is enabled or disabled +func (o *STS) Enabled() bool { + if o != nil && o.bitmap_&4 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// If STS is enabled or disabled +func (o *STS) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.enabled + } + return +} + +// ExternalID returns the value of the 'external_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional unique identifier when assuming role in another account +func (o *STS) ExternalID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.externalID + } + return "" +} + +// GetExternalID returns the value of the 'external_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Optional unique identifier when assuming role in another account +func (o *STS) GetExternalID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.externalID + } + return +} + +// InstanceIAMRoles returns the value of the 'instance_IAM_roles' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Instance IAM roles to use for the instance profiles of the master and worker instances +func (o *STS) InstanceIAMRoles() *InstanceIAMRoles { + if o != nil && o.bitmap_&16 != 0 { + return o.instanceIAMRoles + } + return nil +} + +// GetInstanceIAMRoles returns the value of the 'instance_IAM_roles' attribute and +// a flag indicating if the attribute has a value. +// +// Instance IAM roles to use for the instance profiles of the master and worker instances +func (o *STS) GetInstanceIAMRoles() (value *InstanceIAMRoles, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.instanceIAMRoles + } + return +} + +// ManagedPolicies returns the value of the 'managed_policies' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// If true, cluster account and operator roles have managed policies attached. +func (o *STS) ManagedPolicies() bool { + if o != nil && o.bitmap_&32 != 0 { + return o.managedPolicies + } + return false +} + +// GetManagedPolicies returns the value of the 'managed_policies' attribute and +// a flag indicating if the attribute has a value. +// +// If true, cluster account and operator roles have managed policies attached. +func (o *STS) GetManagedPolicies() (value bool, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.managedPolicies + } + return +} + +// OidcConfig returns the value of the 'oidc_config' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Registered Oidc Config, if available holds information related to the oidc config. +func (o *STS) OidcConfig() *OidcConfig { + if o != nil && o.bitmap_&64 != 0 { + return o.oidcConfig + } + return nil +} + +// GetOidcConfig returns the value of the 'oidc_config' attribute and +// a flag indicating if the attribute has a value. +// +// Registered Oidc Config, if available holds information related to the oidc config. +func (o *STS) GetOidcConfig() (value *OidcConfig, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.oidcConfig + } + return +} + +// OperatorIAMRoles returns the value of the 'operator_IAM_roles' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of roles necessary to access the AWS resources of the various operators used during installation +func (o *STS) OperatorIAMRoles() []*OperatorIAMRole { + if o != nil && o.bitmap_&128 != 0 { + return o.operatorIAMRoles + } + return nil +} + +// GetOperatorIAMRoles returns the value of the 'operator_IAM_roles' attribute and +// a flag indicating if the attribute has a value. +// +// List of roles necessary to access the AWS resources of the various operators used during installation +func (o *STS) GetOperatorIAMRoles() (value []*OperatorIAMRole, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.operatorIAMRoles + } + return +} + +// OperatorRolePrefix returns the value of the 'operator_role_prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional user provided prefix for operator roles. +func (o *STS) OperatorRolePrefix() string { + if o != nil && o.bitmap_&256 != 0 { + return o.operatorRolePrefix + } + return "" +} + +// GetOperatorRolePrefix returns the value of the 'operator_role_prefix' attribute and +// a flag indicating if the attribute has a value. +// +// Optional user provided prefix for operator roles. +func (o *STS) GetOperatorRolePrefix() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.operatorRolePrefix + } + return +} + +// PermissionBoundary returns the value of the 'permission_boundary' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Optional user provided permission boundary. +func (o *STS) PermissionBoundary() string { + if o != nil && o.bitmap_&512 != 0 { + return o.permissionBoundary + } + return "" +} + +// GetPermissionBoundary returns the value of the 'permission_boundary' attribute and +// a flag indicating if the attribute has a value. +// +// Optional user provided permission boundary. +func (o *STS) GetPermissionBoundary() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.permissionBoundary + } + return +} + +// RoleARN returns the value of the 'role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN of the AWS role to assume when installing the cluster +func (o *STS) RoleARN() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.roleARN + } + return "" +} + +// GetRoleARN returns the value of the 'role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// ARN of the AWS role to assume when installing the cluster +func (o *STS) GetRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.roleARN + } + return +} + +// SupportRoleARN returns the value of the 'support_role_ARN' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ARN of the AWS role used by SREs to access the cluster AWS account in order to provide support +func (o *STS) SupportRoleARN() string { + if o != nil && o.bitmap_&2048 != 0 { + return o.supportRoleARN + } + return "" +} + +// GetSupportRoleARN returns the value of the 'support_role_ARN' attribute and +// a flag indicating if the attribute has a value. +// +// ARN of the AWS role used by SREs to access the cluster AWS account in order to provide support +func (o *STS) GetSupportRoleARN() (value string, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.supportRoleARN + } + return +} + +// STSListKind is the name of the type used to represent list of objects of +// type 'STS'. +const STSListKind = "STSList" + +// STSListLinkKind is the name of the type used to represent links to list +// of objects of type 'STS'. +const STSListLinkKind = "STSListLink" + +// STSNilKind is the name of the type used to nil lists of objects of +// type 'STS'. +const STSListNilKind = "STSListNil" + +// STSList is a list of values of the 'STS' type. +type STSList struct { + href string + link bool + items []*STS +} + +// Len returns the length of the list. +func (l *STSList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *STSList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *STSList) Get(i int) *STS { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *STSList) Slice() []*STS { + var slice []*STS + if l == nil { + slice = make([]*STS, 0) + } else { + slice = make([]*STS, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *STSList) Each(f func(item *STS) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *STSList) Range(f func(index int, item *STS) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/sts_type_json.go b/clustersmgmt/v2alpha1/sts_type_json.go new file mode 100644 index 00000000..4f3c39ce --- /dev/null +++ b/clustersmgmt/v2alpha1/sts_type_json.go @@ -0,0 +1,229 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSTS writes a value of the 'STS' type to the given writer. +func MarshalSTS(object *STS, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSTS(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSTS writes a value of the 'STS' type to the given stream. +func writeSTS(object *STS, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("oidc_endpoint_url") + stream.WriteString(object.oidcEndpointURL) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("auto_mode") + stream.WriteBool(object.autoMode) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("external_id") + stream.WriteString(object.externalID) + count++ + } + present_ = object.bitmap_&16 != 0 && object.instanceIAMRoles != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("instance_iam_roles") + writeInstanceIAMRoles(object.instanceIAMRoles, stream) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("managed_policies") + stream.WriteBool(object.managedPolicies) + count++ + } + present_ = object.bitmap_&64 != 0 && object.oidcConfig != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("oidc_config") + writeOidcConfig(object.oidcConfig, stream) + count++ + } + present_ = object.bitmap_&128 != 0 && object.operatorIAMRoles != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator_iam_roles") + writeOperatorIAMRoleList(object.operatorIAMRoles, stream) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("operator_role_prefix") + stream.WriteString(object.operatorRolePrefix) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("permission_boundary") + stream.WriteString(object.permissionBoundary) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("role_arn") + stream.WriteString(object.roleARN) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("support_role_arn") + stream.WriteString(object.supportRoleARN) + } + stream.WriteObjectEnd() +} + +// UnmarshalSTS reads a value of the 'STS' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSTS(source interface{}) (object *STS, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSTS(iterator) + err = iterator.Error + return +} + +// readSTS reads a value of the 'STS' type from the given iterator. +func readSTS(iterator *jsoniter.Iterator) *STS { + object := &STS{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "oidc_endpoint_url": + value := iterator.ReadString() + object.oidcEndpointURL = value + object.bitmap_ |= 1 + case "auto_mode": + value := iterator.ReadBool() + object.autoMode = value + object.bitmap_ |= 2 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 4 + case "external_id": + value := iterator.ReadString() + object.externalID = value + object.bitmap_ |= 8 + case "instance_iam_roles": + value := readInstanceIAMRoles(iterator) + object.instanceIAMRoles = value + object.bitmap_ |= 16 + case "managed_policies": + value := iterator.ReadBool() + object.managedPolicies = value + object.bitmap_ |= 32 + case "oidc_config": + value := readOidcConfig(iterator) + object.oidcConfig = value + object.bitmap_ |= 64 + case "operator_iam_roles": + value := readOperatorIAMRoleList(iterator) + object.operatorIAMRoles = value + object.bitmap_ |= 128 + case "operator_role_prefix": + value := iterator.ReadString() + object.operatorRolePrefix = value + object.bitmap_ |= 256 + case "permission_boundary": + value := iterator.ReadString() + object.permissionBoundary = value + object.bitmap_ |= 512 + case "role_arn": + value := iterator.ReadString() + object.roleARN = value + object.bitmap_ |= 1024 + case "support_role_arn": + value := iterator.ReadString() + object.supportRoleARN = value + object.bitmap_ |= 2048 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/subnet_network_verification_builder.go b/clustersmgmt/v2alpha1/subnet_network_verification_builder.go new file mode 100644 index 00000000..ea4695f4 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnet_network_verification_builder.go @@ -0,0 +1,144 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubnetNetworkVerificationBuilder contains the data and logic needed to build 'subnet_network_verification' objects. +type SubnetNetworkVerificationBuilder struct { + bitmap_ uint32 + id string + href string + details []string + platform Platform + state string + tags map[string]string +} + +// NewSubnetNetworkVerification creates a new builder of 'subnet_network_verification' objects. +func NewSubnetNetworkVerification() *SubnetNetworkVerificationBuilder { + return &SubnetNetworkVerificationBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *SubnetNetworkVerificationBuilder) Link(value bool) *SubnetNetworkVerificationBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *SubnetNetworkVerificationBuilder) ID(value string) *SubnetNetworkVerificationBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *SubnetNetworkVerificationBuilder) HREF(value string) *SubnetNetworkVerificationBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SubnetNetworkVerificationBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Details sets the value of the 'details' attribute to the given values. +func (b *SubnetNetworkVerificationBuilder) Details(values ...string) *SubnetNetworkVerificationBuilder { + b.details = make([]string, len(values)) + copy(b.details, values) + b.bitmap_ |= 8 + return b +} + +// Platform sets the value of the 'platform' attribute to the given value. +// +// Representation of an platform type field. +func (b *SubnetNetworkVerificationBuilder) Platform(value Platform) *SubnetNetworkVerificationBuilder { + b.platform = value + b.bitmap_ |= 16 + return b +} + +// State sets the value of the 'state' attribute to the given value. +func (b *SubnetNetworkVerificationBuilder) State(value string) *SubnetNetworkVerificationBuilder { + b.state = value + b.bitmap_ |= 32 + return b +} + +// Tags sets the value of the 'tags' attribute to the given value. +func (b *SubnetNetworkVerificationBuilder) Tags(value map[string]string) *SubnetNetworkVerificationBuilder { + b.tags = value + if value != nil { + b.bitmap_ |= 64 + } else { + b.bitmap_ &^= 64 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SubnetNetworkVerificationBuilder) Copy(object *SubnetNetworkVerification) *SubnetNetworkVerificationBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.details != nil { + b.details = make([]string, len(object.details)) + copy(b.details, object.details) + } else { + b.details = nil + } + b.platform = object.platform + b.state = object.state + if len(object.tags) > 0 { + b.tags = map[string]string{} + for k, v := range object.tags { + b.tags[k] = v + } + } else { + b.tags = nil + } + return b +} + +// Build creates a 'subnet_network_verification' object using the configuration stored in the builder. +func (b *SubnetNetworkVerificationBuilder) Build() (object *SubnetNetworkVerification, err error) { + object = new(SubnetNetworkVerification) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.details != nil { + object.details = make([]string, len(b.details)) + copy(object.details, b.details) + } + object.platform = b.platform + object.state = b.state + if b.tags != nil { + object.tags = make(map[string]string) + for k, v := range b.tags { + object.tags[k] = v + } + } + return +} diff --git a/clustersmgmt/v2alpha1/subnet_network_verification_list_builder.go b/clustersmgmt/v2alpha1/subnet_network_verification_list_builder.go new file mode 100644 index 00000000..ff782cd0 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnet_network_verification_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubnetNetworkVerificationListBuilder contains the data and logic needed to build +// 'subnet_network_verification' objects. +type SubnetNetworkVerificationListBuilder struct { + items []*SubnetNetworkVerificationBuilder +} + +// NewSubnetNetworkVerificationList creates a new builder of 'subnet_network_verification' objects. +func NewSubnetNetworkVerificationList() *SubnetNetworkVerificationListBuilder { + return new(SubnetNetworkVerificationListBuilder) +} + +// Items sets the items of the list. +func (b *SubnetNetworkVerificationListBuilder) Items(values ...*SubnetNetworkVerificationBuilder) *SubnetNetworkVerificationListBuilder { + b.items = make([]*SubnetNetworkVerificationBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SubnetNetworkVerificationListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SubnetNetworkVerificationListBuilder) Copy(list *SubnetNetworkVerificationList) *SubnetNetworkVerificationListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SubnetNetworkVerificationBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSubnetNetworkVerification().Copy(v) + } + } + return b +} + +// Build creates a list of 'subnet_network_verification' objects using the +// configuration stored in the builder. +func (b *SubnetNetworkVerificationListBuilder) Build() (list *SubnetNetworkVerificationList, err error) { + items := make([]*SubnetNetworkVerification, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SubnetNetworkVerificationList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/subnet_network_verification_list_type_json.go b/clustersmgmt/v2alpha1/subnet_network_verification_list_type_json.go new file mode 100644 index 00000000..235916f9 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnet_network_verification_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSubnetNetworkVerificationList writes a list of values of the 'subnet_network_verification' type to +// the given writer. +func MarshalSubnetNetworkVerificationList(list []*SubnetNetworkVerification, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSubnetNetworkVerificationList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSubnetNetworkVerificationList writes a list of value of the 'subnet_network_verification' type to +// the given stream. +func writeSubnetNetworkVerificationList(list []*SubnetNetworkVerification, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSubnetNetworkVerification(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSubnetNetworkVerificationList reads a list of values of the 'subnet_network_verification' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSubnetNetworkVerificationList(source interface{}) (items []*SubnetNetworkVerification, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSubnetNetworkVerificationList(iterator) + err = iterator.Error + return +} + +// readSubnetNetworkVerificationList reads list of values of the ”subnet_network_verification' type from +// the given iterator. +func readSubnetNetworkVerificationList(iterator *jsoniter.Iterator) []*SubnetNetworkVerification { + list := []*SubnetNetworkVerification{} + for iterator.ReadArray() { + item := readSubnetNetworkVerification(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/subnet_network_verification_type.go b/clustersmgmt/v2alpha1/subnet_network_verification_type.go new file mode 100644 index 00000000..38373e30 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnet_network_verification_type.go @@ -0,0 +1,312 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubnetNetworkVerificationKind is the name of the type used to represent objects +// of type 'subnet_network_verification'. +const SubnetNetworkVerificationKind = "SubnetNetworkVerification" + +// SubnetNetworkVerificationLinkKind is the name of the type used to represent links +// to objects of type 'subnet_network_verification'. +const SubnetNetworkVerificationLinkKind = "SubnetNetworkVerificationLink" + +// SubnetNetworkVerificationNilKind is the name of the type used to nil references +// to objects of type 'subnet_network_verification'. +const SubnetNetworkVerificationNilKind = "SubnetNetworkVerificationNil" + +// SubnetNetworkVerification represents the values of the 'subnet_network_verification' type. +type SubnetNetworkVerification struct { + bitmap_ uint32 + id string + href string + details []string + platform Platform + state string + tags map[string]string +} + +// Kind returns the name of the type of the object. +func (o *SubnetNetworkVerification) Kind() string { + if o == nil { + return SubnetNetworkVerificationNilKind + } + if o.bitmap_&1 != 0 { + return SubnetNetworkVerificationLinkKind + } + return SubnetNetworkVerificationKind +} + +// Link returns true iif this is a link. +func (o *SubnetNetworkVerification) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *SubnetNetworkVerification) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *SubnetNetworkVerification) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *SubnetNetworkVerification) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *SubnetNetworkVerification) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *SubnetNetworkVerification) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Details returns the value of the 'details' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Slice of failures that happened during a subnet network verification. +func (o *SubnetNetworkVerification) Details() []string { + if o != nil && o.bitmap_&8 != 0 { + return o.details + } + return nil +} + +// GetDetails returns the value of the 'details' attribute and +// a flag indicating if the attribute has a value. +// +// Slice of failures that happened during a subnet network verification. +func (o *SubnetNetworkVerification) GetDetails() (value []string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.details + } + return +} + +// Platform returns the value of the 'platform' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Platform supplied to the network verifier for this subnet. +func (o *SubnetNetworkVerification) Platform() Platform { + if o != nil && o.bitmap_&16 != 0 { + return o.platform + } + return Platform("") +} + +// GetPlatform returns the value of the 'platform' attribute and +// a flag indicating if the attribute has a value. +// +// Platform supplied to the network verifier for this subnet. +func (o *SubnetNetworkVerification) GetPlatform() (value Platform, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.platform + } + return +} + +// State returns the value of the 'state' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State of the subnet network verification. +func (o *SubnetNetworkVerification) State() string { + if o != nil && o.bitmap_&32 != 0 { + return o.state + } + return "" +} + +// GetState returns the value of the 'state' attribute and +// a flag indicating if the attribute has a value. +// +// State of the subnet network verification. +func (o *SubnetNetworkVerification) GetState() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.state + } + return +} + +// Tags returns the value of the 'tags' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Tags supplied to the network verifier for this subnet. +func (o *SubnetNetworkVerification) Tags() map[string]string { + if o != nil && o.bitmap_&64 != 0 { + return o.tags + } + return nil +} + +// GetTags returns the value of the 'tags' attribute and +// a flag indicating if the attribute has a value. +// +// Tags supplied to the network verifier for this subnet. +func (o *SubnetNetworkVerification) GetTags() (value map[string]string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.tags + } + return +} + +// SubnetNetworkVerificationListKind is the name of the type used to represent list of objects of +// type 'subnet_network_verification'. +const SubnetNetworkVerificationListKind = "SubnetNetworkVerificationList" + +// SubnetNetworkVerificationListLinkKind is the name of the type used to represent links to list +// of objects of type 'subnet_network_verification'. +const SubnetNetworkVerificationListLinkKind = "SubnetNetworkVerificationListLink" + +// SubnetNetworkVerificationNilKind is the name of the type used to nil lists of objects of +// type 'subnet_network_verification'. +const SubnetNetworkVerificationListNilKind = "SubnetNetworkVerificationListNil" + +// SubnetNetworkVerificationList is a list of values of the 'subnet_network_verification' type. +type SubnetNetworkVerificationList struct { + href string + link bool + items []*SubnetNetworkVerification +} + +// Kind returns the name of the type of the object. +func (l *SubnetNetworkVerificationList) Kind() string { + if l == nil { + return SubnetNetworkVerificationListNilKind + } + if l.link { + return SubnetNetworkVerificationListLinkKind + } + return SubnetNetworkVerificationListKind +} + +// Link returns true iif this is a link. +func (l *SubnetNetworkVerificationList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *SubnetNetworkVerificationList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *SubnetNetworkVerificationList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *SubnetNetworkVerificationList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SubnetNetworkVerificationList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SubnetNetworkVerificationList) Get(i int) *SubnetNetworkVerification { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SubnetNetworkVerificationList) Slice() []*SubnetNetworkVerification { + var slice []*SubnetNetworkVerification + if l == nil { + slice = make([]*SubnetNetworkVerification, 0) + } else { + slice = make([]*SubnetNetworkVerification, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SubnetNetworkVerificationList) Each(f func(item *SubnetNetworkVerification) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SubnetNetworkVerificationList) Range(f func(index int, item *SubnetNetworkVerification) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/subnet_network_verification_type_json.go b/clustersmgmt/v2alpha1/subnet_network_verification_type_json.go new file mode 100644 index 00000000..f90dee4f --- /dev/null +++ b/clustersmgmt/v2alpha1/subnet_network_verification_type_json.go @@ -0,0 +1,189 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "sort" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSubnetNetworkVerification writes a value of the 'subnet_network_verification' type to the given writer. +func MarshalSubnetNetworkVerification(object *SubnetNetworkVerification, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSubnetNetworkVerification(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSubnetNetworkVerification writes a value of the 'subnet_network_verification' type to the given stream. +func writeSubnetNetworkVerification(object *SubnetNetworkVerification, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(SubnetNetworkVerificationLinkKind) + } else { + stream.WriteString(SubnetNetworkVerificationKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.details != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("details") + writeStringList(object.details, stream) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("platform") + stream.WriteString(string(object.platform)) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("state") + stream.WriteString(object.state) + count++ + } + present_ = object.bitmap_&64 != 0 && object.tags != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("tags") + if object.tags != nil { + stream.WriteObjectStart() + keys := make([]string, len(object.tags)) + i := 0 + for key := range object.tags { + keys[i] = key + i++ + } + sort.Strings(keys) + for i, key := range keys { + if i > 0 { + stream.WriteMore() + } + item := object.tags[key] + stream.WriteObjectField(key) + stream.WriteString(item) + } + stream.WriteObjectEnd() + } else { + stream.WriteNil() + } + } + stream.WriteObjectEnd() +} + +// UnmarshalSubnetNetworkVerification reads a value of the 'subnet_network_verification' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSubnetNetworkVerification(source interface{}) (object *SubnetNetworkVerification, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSubnetNetworkVerification(iterator) + err = iterator.Error + return +} + +// readSubnetNetworkVerification reads a value of the 'subnet_network_verification' type from the given iterator. +func readSubnetNetworkVerification(iterator *jsoniter.Iterator) *SubnetNetworkVerification { + object := &SubnetNetworkVerification{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == SubnetNetworkVerificationLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "details": + value := readStringList(iterator) + object.details = value + object.bitmap_ |= 8 + case "platform": + text := iterator.ReadString() + value := Platform(text) + object.platform = value + object.bitmap_ |= 16 + case "state": + value := iterator.ReadString() + object.state = value + object.bitmap_ |= 32 + case "tags": + value := map[string]string{} + for { + key := iterator.ReadObject() + if key == "" { + break + } + item := iterator.ReadString() + value[key] = item + } + object.tags = value + object.bitmap_ |= 64 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/subnetwork_builder.go b/clustersmgmt/v2alpha1/subnetwork_builder.go new file mode 100644 index 00000000..faae6dfe --- /dev/null +++ b/clustersmgmt/v2alpha1/subnetwork_builder.go @@ -0,0 +1,113 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubnetworkBuilder contains the data and logic needed to build 'subnetwork' objects. +// +// AWS subnetwork object to be used while installing a cluster +type SubnetworkBuilder struct { + bitmap_ uint32 + cidrBlock string + availabilityZone string + name string + subnetID string + public bool + redHatManaged bool +} + +// NewSubnetwork creates a new builder of 'subnetwork' objects. +func NewSubnetwork() *SubnetworkBuilder { + return &SubnetworkBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SubnetworkBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CIDRBlock sets the value of the 'CIDR_block' attribute to the given value. +func (b *SubnetworkBuilder) CIDRBlock(value string) *SubnetworkBuilder { + b.cidrBlock = value + b.bitmap_ |= 1 + return b +} + +// AvailabilityZone sets the value of the 'availability_zone' attribute to the given value. +func (b *SubnetworkBuilder) AvailabilityZone(value string) *SubnetworkBuilder { + b.availabilityZone = value + b.bitmap_ |= 2 + return b +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *SubnetworkBuilder) Name(value string) *SubnetworkBuilder { + b.name = value + b.bitmap_ |= 4 + return b +} + +// Public sets the value of the 'public' attribute to the given value. +func (b *SubnetworkBuilder) Public(value bool) *SubnetworkBuilder { + b.public = value + b.bitmap_ |= 8 + return b +} + +// RedHatManaged sets the value of the 'red_hat_managed' attribute to the given value. +func (b *SubnetworkBuilder) RedHatManaged(value bool) *SubnetworkBuilder { + b.redHatManaged = value + b.bitmap_ |= 16 + return b +} + +// SubnetID sets the value of the 'subnet_ID' attribute to the given value. +func (b *SubnetworkBuilder) SubnetID(value string) *SubnetworkBuilder { + b.subnetID = value + b.bitmap_ |= 32 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SubnetworkBuilder) Copy(object *Subnetwork) *SubnetworkBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.cidrBlock = object.cidrBlock + b.availabilityZone = object.availabilityZone + b.name = object.name + b.public = object.public + b.redHatManaged = object.redHatManaged + b.subnetID = object.subnetID + return b +} + +// Build creates a 'subnetwork' object using the configuration stored in the builder. +func (b *SubnetworkBuilder) Build() (object *Subnetwork, err error) { + object = new(Subnetwork) + object.bitmap_ = b.bitmap_ + object.cidrBlock = b.cidrBlock + object.availabilityZone = b.availabilityZone + object.name = b.name + object.public = b.public + object.redHatManaged = b.redHatManaged + object.subnetID = b.subnetID + return +} diff --git a/clustersmgmt/v2alpha1/subnetwork_list_builder.go b/clustersmgmt/v2alpha1/subnetwork_list_builder.go new file mode 100644 index 00000000..c0c233ee --- /dev/null +++ b/clustersmgmt/v2alpha1/subnetwork_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubnetworkListBuilder contains the data and logic needed to build +// 'subnetwork' objects. +type SubnetworkListBuilder struct { + items []*SubnetworkBuilder +} + +// NewSubnetworkList creates a new builder of 'subnetwork' objects. +func NewSubnetworkList() *SubnetworkListBuilder { + return new(SubnetworkListBuilder) +} + +// Items sets the items of the list. +func (b *SubnetworkListBuilder) Items(values ...*SubnetworkBuilder) *SubnetworkListBuilder { + b.items = make([]*SubnetworkBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SubnetworkListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SubnetworkListBuilder) Copy(list *SubnetworkList) *SubnetworkListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SubnetworkBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSubnetwork().Copy(v) + } + } + return b +} + +// Build creates a list of 'subnetwork' objects using the +// configuration stored in the builder. +func (b *SubnetworkListBuilder) Build() (list *SubnetworkList, err error) { + items := make([]*Subnetwork, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SubnetworkList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/subnetwork_list_type_json.go b/clustersmgmt/v2alpha1/subnetwork_list_type_json.go new file mode 100644 index 00000000..515d4292 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnetwork_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSubnetworkList writes a list of values of the 'subnetwork' type to +// the given writer. +func MarshalSubnetworkList(list []*Subnetwork, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSubnetworkList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSubnetworkList writes a list of value of the 'subnetwork' type to +// the given stream. +func writeSubnetworkList(list []*Subnetwork, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSubnetwork(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSubnetworkList reads a list of values of the 'subnetwork' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSubnetworkList(source interface{}) (items []*Subnetwork, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSubnetworkList(iterator) + err = iterator.Error + return +} + +// readSubnetworkList reads list of values of the ”subnetwork' type from +// the given iterator. +func readSubnetworkList(iterator *jsoniter.Iterator) []*Subnetwork { + list := []*Subnetwork{} + for iterator.ReadArray() { + item := readSubnetwork(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/subnetwork_type.go b/clustersmgmt/v2alpha1/subnetwork_type.go new file mode 100644 index 00000000..5a941305 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnetwork_type.go @@ -0,0 +1,262 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Subnetwork represents the values of the 'subnetwork' type. +// +// AWS subnetwork object to be used while installing a cluster +type Subnetwork struct { + bitmap_ uint32 + cidrBlock string + availabilityZone string + name string + subnetID string + public bool + redHatManaged bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Subnetwork) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CIDRBlock returns the value of the 'CIDR_block' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The CIDR Block of the subnet. +func (o *Subnetwork) CIDRBlock() string { + if o != nil && o.bitmap_&1 != 0 { + return o.cidrBlock + } + return "" +} + +// GetCIDRBlock returns the value of the 'CIDR_block' attribute and +// a flag indicating if the attribute has a value. +// +// The CIDR Block of the subnet. +func (o *Subnetwork) GetCIDRBlock() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.cidrBlock + } + return +} + +// AvailabilityZone returns the value of the 'availability_zone' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The availability zone to which the subnet is related. +func (o *Subnetwork) AvailabilityZone() string { + if o != nil && o.bitmap_&2 != 0 { + return o.availabilityZone + } + return "" +} + +// GetAvailabilityZone returns the value of the 'availability_zone' attribute and +// a flag indicating if the attribute has a value. +// +// The availability zone to which the subnet is related. +func (o *Subnetwork) GetAvailabilityZone() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.availabilityZone + } + return +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the subnet according to its `Name` tag on AWS. +func (o *Subnetwork) Name() string { + if o != nil && o.bitmap_&4 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the subnet according to its `Name` tag on AWS. +func (o *Subnetwork) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.name + } + return +} + +// Public returns the value of the 'public' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Whether or not it is a public subnet. +func (o *Subnetwork) Public() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.public + } + return false +} + +// GetPublic returns the value of the 'public' attribute and +// a flag indicating if the attribute has a value. +// +// Whether or not it is a public subnet. +func (o *Subnetwork) GetPublic() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.public + } + return +} + +// RedHatManaged returns the value of the 'red_hat_managed' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// If the resource is RH managed. +func (o *Subnetwork) RedHatManaged() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.redHatManaged + } + return false +} + +// GetRedHatManaged returns the value of the 'red_hat_managed' attribute and +// a flag indicating if the attribute has a value. +// +// If the resource is RH managed. +func (o *Subnetwork) GetRedHatManaged() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.redHatManaged + } + return +} + +// SubnetID returns the value of the 'subnet_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The subnet ID to be used while installing a cluster. +func (o *Subnetwork) SubnetID() string { + if o != nil && o.bitmap_&32 != 0 { + return o.subnetID + } + return "" +} + +// GetSubnetID returns the value of the 'subnet_ID' attribute and +// a flag indicating if the attribute has a value. +// +// The subnet ID to be used while installing a cluster. +func (o *Subnetwork) GetSubnetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.subnetID + } + return +} + +// SubnetworkListKind is the name of the type used to represent list of objects of +// type 'subnetwork'. +const SubnetworkListKind = "SubnetworkList" + +// SubnetworkListLinkKind is the name of the type used to represent links to list +// of objects of type 'subnetwork'. +const SubnetworkListLinkKind = "SubnetworkListLink" + +// SubnetworkNilKind is the name of the type used to nil lists of objects of +// type 'subnetwork'. +const SubnetworkListNilKind = "SubnetworkListNil" + +// SubnetworkList is a list of values of the 'subnetwork' type. +type SubnetworkList struct { + href string + link bool + items []*Subnetwork +} + +// Len returns the length of the list. +func (l *SubnetworkList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SubnetworkList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SubnetworkList) Get(i int) *Subnetwork { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SubnetworkList) Slice() []*Subnetwork { + var slice []*Subnetwork + if l == nil { + slice = make([]*Subnetwork, 0) + } else { + slice = make([]*Subnetwork, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SubnetworkList) Each(f func(item *Subnetwork) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SubnetworkList) Range(f func(index int, item *Subnetwork) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/subnetwork_type_json.go b/clustersmgmt/v2alpha1/subnetwork_type_json.go new file mode 100644 index 00000000..f3fc70c7 --- /dev/null +++ b/clustersmgmt/v2alpha1/subnetwork_type_json.go @@ -0,0 +1,151 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSubnetwork writes a value of the 'subnetwork' type to the given writer. +func MarshalSubnetwork(object *Subnetwork, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSubnetwork(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSubnetwork writes a value of the 'subnetwork' type to the given stream. +func writeSubnetwork(object *Subnetwork, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cidr_block") + stream.WriteString(object.cidrBlock) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("availability_zone") + stream.WriteString(object.availabilityZone) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("public") + stream.WriteBool(object.public) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("red_hat_managed") + stream.WriteBool(object.redHatManaged) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("subnet_id") + stream.WriteString(object.subnetID) + } + stream.WriteObjectEnd() +} + +// UnmarshalSubnetwork reads a value of the 'subnetwork' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSubnetwork(source interface{}) (object *Subnetwork, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSubnetwork(iterator) + err = iterator.Error + return +} + +// readSubnetwork reads a value of the 'subnetwork' type from the given iterator. +func readSubnetwork(iterator *jsoniter.Iterator) *Subnetwork { + object := &Subnetwork{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "cidr_block": + value := iterator.ReadString() + object.cidrBlock = value + object.bitmap_ |= 1 + case "availability_zone": + value := iterator.ReadString() + object.availabilityZone = value + object.bitmap_ |= 2 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 4 + case "public": + value := iterator.ReadBool() + object.public = value + object.bitmap_ |= 8 + case "red_hat_managed": + value := iterator.ReadBool() + object.redHatManaged = value + object.bitmap_ |= 16 + case "subnet_id": + value := iterator.ReadString() + object.subnetID = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/subscription_builder.go b/clustersmgmt/v2alpha1/subscription_builder.go new file mode 100644 index 00000000..cee4d9d1 --- /dev/null +++ b/clustersmgmt/v2alpha1/subscription_builder.go @@ -0,0 +1,79 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubscriptionBuilder contains the data and logic needed to build 'subscription' objects. +// +// Definition of a subscription. +type SubscriptionBuilder struct { + bitmap_ uint32 + id string + href string +} + +// NewSubscription creates a new builder of 'subscription' objects. +func NewSubscription() *SubscriptionBuilder { + return &SubscriptionBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *SubscriptionBuilder) Link(value bool) *SubscriptionBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *SubscriptionBuilder) ID(value string) *SubscriptionBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *SubscriptionBuilder) HREF(value string) *SubscriptionBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SubscriptionBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SubscriptionBuilder) Copy(object *Subscription) *SubscriptionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + return b +} + +// Build creates a 'subscription' object using the configuration stored in the builder. +func (b *SubscriptionBuilder) Build() (object *Subscription, err error) { + object = new(Subscription) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + return +} diff --git a/clustersmgmt/v2alpha1/subscription_list_builder.go b/clustersmgmt/v2alpha1/subscription_list_builder.go new file mode 100644 index 00000000..a3c4dfeb --- /dev/null +++ b/clustersmgmt/v2alpha1/subscription_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubscriptionListBuilder contains the data and logic needed to build +// 'subscription' objects. +type SubscriptionListBuilder struct { + items []*SubscriptionBuilder +} + +// NewSubscriptionList creates a new builder of 'subscription' objects. +func NewSubscriptionList() *SubscriptionListBuilder { + return new(SubscriptionListBuilder) +} + +// Items sets the items of the list. +func (b *SubscriptionListBuilder) Items(values ...*SubscriptionBuilder) *SubscriptionListBuilder { + b.items = make([]*SubscriptionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SubscriptionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SubscriptionListBuilder) Copy(list *SubscriptionList) *SubscriptionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SubscriptionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSubscription().Copy(v) + } + } + return b +} + +// Build creates a list of 'subscription' objects using the +// configuration stored in the builder. +func (b *SubscriptionListBuilder) Build() (list *SubscriptionList, err error) { + items := make([]*Subscription, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SubscriptionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/subscription_list_type_json.go b/clustersmgmt/v2alpha1/subscription_list_type_json.go new file mode 100644 index 00000000..e7e48a88 --- /dev/null +++ b/clustersmgmt/v2alpha1/subscription_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSubscriptionList writes a list of values of the 'subscription' type to +// the given writer. +func MarshalSubscriptionList(list []*Subscription, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSubscriptionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSubscriptionList writes a list of value of the 'subscription' type to +// the given stream. +func writeSubscriptionList(list []*Subscription, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSubscription(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSubscriptionList reads a list of values of the 'subscription' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSubscriptionList(source interface{}) (items []*Subscription, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSubscriptionList(iterator) + err = iterator.Error + return +} + +// readSubscriptionList reads list of values of the ”subscription' type from +// the given iterator. +func readSubscriptionList(iterator *jsoniter.Iterator) []*Subscription { + list := []*Subscription{} + for iterator.ReadArray() { + item := readSubscription(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/subscription_type.go b/clustersmgmt/v2alpha1/subscription_type.go new file mode 100644 index 00000000..dffbc034 --- /dev/null +++ b/clustersmgmt/v2alpha1/subscription_type.go @@ -0,0 +1,218 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SubscriptionKind is the name of the type used to represent objects +// of type 'subscription'. +const SubscriptionKind = "Subscription" + +// SubscriptionLinkKind is the name of the type used to represent links +// to objects of type 'subscription'. +const SubscriptionLinkKind = "SubscriptionLink" + +// SubscriptionNilKind is the name of the type used to nil references +// to objects of type 'subscription'. +const SubscriptionNilKind = "SubscriptionNil" + +// Subscription represents the values of the 'subscription' type. +// +// Definition of a subscription. +type Subscription struct { + bitmap_ uint32 + id string + href string +} + +// Kind returns the name of the type of the object. +func (o *Subscription) Kind() string { + if o == nil { + return SubscriptionNilKind + } + if o.bitmap_&1 != 0 { + return SubscriptionLinkKind + } + return SubscriptionKind +} + +// Link returns true iif this is a link. +func (o *Subscription) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Subscription) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Subscription) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Subscription) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Subscription) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Subscription) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// SubscriptionListKind is the name of the type used to represent list of objects of +// type 'subscription'. +const SubscriptionListKind = "SubscriptionList" + +// SubscriptionListLinkKind is the name of the type used to represent links to list +// of objects of type 'subscription'. +const SubscriptionListLinkKind = "SubscriptionListLink" + +// SubscriptionNilKind is the name of the type used to nil lists of objects of +// type 'subscription'. +const SubscriptionListNilKind = "SubscriptionListNil" + +// SubscriptionList is a list of values of the 'subscription' type. +type SubscriptionList struct { + href string + link bool + items []*Subscription +} + +// Kind returns the name of the type of the object. +func (l *SubscriptionList) Kind() string { + if l == nil { + return SubscriptionListNilKind + } + if l.link { + return SubscriptionListLinkKind + } + return SubscriptionListKind +} + +// Link returns true iif this is a link. +func (l *SubscriptionList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *SubscriptionList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *SubscriptionList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *SubscriptionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SubscriptionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SubscriptionList) Get(i int) *Subscription { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SubscriptionList) Slice() []*Subscription { + var slice []*Subscription + if l == nil { + slice = make([]*Subscription, 0) + } else { + slice = make([]*Subscription, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SubscriptionList) Each(f func(item *Subscription) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SubscriptionList) Range(f func(index int, item *Subscription) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/subscription_type_json.go b/clustersmgmt/v2alpha1/subscription_type_json.go new file mode 100644 index 00000000..b05c420a --- /dev/null +++ b/clustersmgmt/v2alpha1/subscription_type_json.go @@ -0,0 +1,106 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSubscription writes a value of the 'subscription' type to the given writer. +func MarshalSubscription(object *Subscription, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSubscription(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSubscription writes a value of the 'subscription' type to the given stream. +func writeSubscription(object *Subscription, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(SubscriptionLinkKind) + } else { + stream.WriteString(SubscriptionKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + } + stream.WriteObjectEnd() +} + +// UnmarshalSubscription reads a value of the 'subscription' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSubscription(source interface{}) (object *Subscription, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSubscription(iterator) + err = iterator.Error + return +} + +// readSubscription reads a value of the 'subscription' type from the given iterator. +func readSubscription(iterator *jsoniter.Iterator) *Subscription { + object := &Subscription{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == SubscriptionLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/syncset_builder.go b/clustersmgmt/v2alpha1/syncset_builder.go new file mode 100644 index 00000000..f654c874 --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_builder.go @@ -0,0 +1,98 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SyncsetBuilder contains the data and logic needed to build 'syncset' objects. +// +// Representation of a syncset. +type SyncsetBuilder struct { + bitmap_ uint32 + id string + href string + resources []interface{} +} + +// NewSyncset creates a new builder of 'syncset' objects. +func NewSyncset() *SyncsetBuilder { + return &SyncsetBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *SyncsetBuilder) Link(value bool) *SyncsetBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *SyncsetBuilder) ID(value string) *SyncsetBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *SyncsetBuilder) HREF(value string) *SyncsetBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *SyncsetBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Resources sets the value of the 'resources' attribute to the given values. +func (b *SyncsetBuilder) Resources(values ...interface{}) *SyncsetBuilder { + b.resources = make([]interface{}, len(values)) + copy(b.resources, values) + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *SyncsetBuilder) Copy(object *Syncset) *SyncsetBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.resources != nil { + b.resources = make([]interface{}, len(object.resources)) + copy(b.resources, object.resources) + } else { + b.resources = nil + } + return b +} + +// Build creates a 'syncset' object using the configuration stored in the builder. +func (b *SyncsetBuilder) Build() (object *Syncset, err error) { + object = new(Syncset) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.resources != nil { + object.resources = make([]interface{}, len(b.resources)) + copy(object.resources, b.resources) + } + return +} diff --git a/clustersmgmt/v2alpha1/syncset_client.go b/clustersmgmt/v2alpha1/syncset_client.go new file mode 100644 index 00000000..b45e2333 --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// SyncsetClient is the client of the 'syncset' resource. +// +// Manages a specific syncset. +type SyncsetClient struct { + transport http.RoundTripper + path string +} + +// NewSyncsetClient creates a new client for the 'syncset' +// resource using the given transport to send the requests and receive the +// responses. +func NewSyncsetClient(transport http.RoundTripper, path string) *SyncsetClient { + return &SyncsetClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the syncset. +func (c *SyncsetClient) Delete() *SyncsetDeleteRequest { + return &SyncsetDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the syncset. +func (c *SyncsetClient) Get() *SyncsetGetRequest { + return &SyncsetGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the syncset. +func (c *SyncsetClient) Update() *SyncsetUpdateRequest { + return &SyncsetUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// SyncsetPollRequest is the request for the Poll method. +type SyncsetPollRequest struct { + request *SyncsetGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *SyncsetPollRequest) Parameter(name string, value interface{}) *SyncsetPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *SyncsetPollRequest) Header(name string, value interface{}) *SyncsetPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *SyncsetPollRequest) Interval(value time.Duration) *SyncsetPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *SyncsetPollRequest) Status(value int) *SyncsetPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *SyncsetPollRequest) Predicate(value func(*SyncsetGetResponse) bool) *SyncsetPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*SyncsetGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *SyncsetPollRequest) StartContext(ctx context.Context) (response *SyncsetPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &SyncsetPollResponse{ + response: result.(*SyncsetGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *SyncsetPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// SyncsetPollResponse is the response for the Poll method. +type SyncsetPollResponse struct { + response *SyncsetGetResponse +} + +// Status returns the response status code. +func (r *SyncsetPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *SyncsetPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *SyncsetPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *SyncsetPollResponse) Body() *Syncset { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *SyncsetPollResponse) GetBody() (value *Syncset, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *SyncsetClient) Poll() *SyncsetPollRequest { + return &SyncsetPollRequest{ + request: c.Get(), + } +} + +// SyncsetDeleteRequest is the request for the 'delete' method. +type SyncsetDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *SyncsetDeleteRequest) Parameter(name string, value interface{}) *SyncsetDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *SyncsetDeleteRequest) Header(name string, value interface{}) *SyncsetDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *SyncsetDeleteRequest) Impersonate(user string) *SyncsetDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *SyncsetDeleteRequest) Send() (result *SyncsetDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *SyncsetDeleteRequest) SendContext(ctx context.Context) (result *SyncsetDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &SyncsetDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// SyncsetDeleteResponse is the response for the 'delete' method. +type SyncsetDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *SyncsetDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *SyncsetDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *SyncsetDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// SyncsetGetRequest is the request for the 'get' method. +type SyncsetGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *SyncsetGetRequest) Parameter(name string, value interface{}) *SyncsetGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *SyncsetGetRequest) Header(name string, value interface{}) *SyncsetGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *SyncsetGetRequest) Impersonate(user string) *SyncsetGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *SyncsetGetRequest) Send() (result *SyncsetGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *SyncsetGetRequest) SendContext(ctx context.Context) (result *SyncsetGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &SyncsetGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readSyncsetGetResponse(result, reader) + if err != nil { + return + } + return +} + +// SyncsetGetResponse is the response for the 'get' method. +type SyncsetGetResponse struct { + status int + header http.Header + err *errors.Error + body *Syncset +} + +// Status returns the response status code. +func (r *SyncsetGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *SyncsetGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *SyncsetGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *SyncsetGetResponse) Body() *Syncset { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *SyncsetGetResponse) GetBody() (value *Syncset, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// SyncsetUpdateRequest is the request for the 'update' method. +type SyncsetUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Syncset +} + +// Parameter adds a query parameter. +func (r *SyncsetUpdateRequest) Parameter(name string, value interface{}) *SyncsetUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *SyncsetUpdateRequest) Header(name string, value interface{}) *SyncsetUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *SyncsetUpdateRequest) Impersonate(user string) *SyncsetUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *SyncsetUpdateRequest) Body(value *Syncset) *SyncsetUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *SyncsetUpdateRequest) Send() (result *SyncsetUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *SyncsetUpdateRequest) SendContext(ctx context.Context) (result *SyncsetUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeSyncsetUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &SyncsetUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readSyncsetUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// SyncsetUpdateResponse is the response for the 'update' method. +type SyncsetUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *Syncset +} + +// Status returns the response status code. +func (r *SyncsetUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *SyncsetUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *SyncsetUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *SyncsetUpdateResponse) Body() *Syncset { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *SyncsetUpdateResponse) GetBody() (value *Syncset, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/syncset_list_builder.go b/clustersmgmt/v2alpha1/syncset_list_builder.go new file mode 100644 index 00000000..ad526fb2 --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SyncsetListBuilder contains the data and logic needed to build +// 'syncset' objects. +type SyncsetListBuilder struct { + items []*SyncsetBuilder +} + +// NewSyncsetList creates a new builder of 'syncset' objects. +func NewSyncsetList() *SyncsetListBuilder { + return new(SyncsetListBuilder) +} + +// Items sets the items of the list. +func (b *SyncsetListBuilder) Items(values ...*SyncsetBuilder) *SyncsetListBuilder { + b.items = make([]*SyncsetBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *SyncsetListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *SyncsetListBuilder) Copy(list *SyncsetList) *SyncsetListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*SyncsetBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewSyncset().Copy(v) + } + } + return b +} + +// Build creates a list of 'syncset' objects using the +// configuration stored in the builder. +func (b *SyncsetListBuilder) Build() (list *SyncsetList, err error) { + items := make([]*Syncset, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(SyncsetList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/syncset_list_type_json.go b/clustersmgmt/v2alpha1/syncset_list_type_json.go new file mode 100644 index 00000000..3186b3ee --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSyncsetList writes a list of values of the 'syncset' type to +// the given writer. +func MarshalSyncsetList(list []*Syncset, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSyncsetList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSyncsetList writes a list of value of the 'syncset' type to +// the given stream. +func writeSyncsetList(list []*Syncset, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeSyncset(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalSyncsetList reads a list of values of the 'syncset' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalSyncsetList(source interface{}) (items []*Syncset, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readSyncsetList(iterator) + err = iterator.Error + return +} + +// readSyncsetList reads list of values of the ”syncset' type from +// the given iterator. +func readSyncsetList(iterator *jsoniter.Iterator) []*Syncset { + list := []*Syncset{} + for iterator.ReadArray() { + item := readSyncset(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/syncset_resource_json.go b/clustersmgmt/v2alpha1/syncset_resource_json.go new file mode 100644 index 00000000..225f095a --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeSyncsetDeleteRequest(request *SyncsetDeleteRequest, writer io.Writer) error { + return nil +} +func readSyncsetDeleteResponse(response *SyncsetDeleteResponse, reader io.Reader) error { + return nil +} +func writeSyncsetGetRequest(request *SyncsetGetRequest, writer io.Writer) error { + return nil +} +func readSyncsetGetResponse(response *SyncsetGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalSyncset(reader) + return err +} +func writeSyncsetUpdateRequest(request *SyncsetUpdateRequest, writer io.Writer) error { + return MarshalSyncset(request.body, writer) +} +func readSyncsetUpdateResponse(response *SyncsetUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalSyncset(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/syncset_type.go b/clustersmgmt/v2alpha1/syncset_type.go new file mode 100644 index 00000000..2a4310c2 --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// SyncsetKind is the name of the type used to represent objects +// of type 'syncset'. +const SyncsetKind = "Syncset" + +// SyncsetLinkKind is the name of the type used to represent links +// to objects of type 'syncset'. +const SyncsetLinkKind = "SyncsetLink" + +// SyncsetNilKind is the name of the type used to nil references +// to objects of type 'syncset'. +const SyncsetNilKind = "SyncsetNil" + +// Syncset represents the values of the 'syncset' type. +// +// Representation of a syncset. +type Syncset struct { + bitmap_ uint32 + id string + href string + resources []interface{} +} + +// Kind returns the name of the type of the object. +func (o *Syncset) Kind() string { + if o == nil { + return SyncsetNilKind + } + if o.bitmap_&1 != 0 { + return SyncsetLinkKind + } + return SyncsetKind +} + +// Link returns true iif this is a link. +func (o *Syncset) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Syncset) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Syncset) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Syncset) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Syncset) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Syncset) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Resources returns the value of the 'resources' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// List of k8s objects to configure for the cluster. +func (o *Syncset) Resources() []interface{} { + if o != nil && o.bitmap_&8 != 0 { + return o.resources + } + return nil +} + +// GetResources returns the value of the 'resources' attribute and +// a flag indicating if the attribute has a value. +// +// List of k8s objects to configure for the cluster. +func (o *Syncset) GetResources() (value []interface{}, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.resources + } + return +} + +// SyncsetListKind is the name of the type used to represent list of objects of +// type 'syncset'. +const SyncsetListKind = "SyncsetList" + +// SyncsetListLinkKind is the name of the type used to represent links to list +// of objects of type 'syncset'. +const SyncsetListLinkKind = "SyncsetListLink" + +// SyncsetNilKind is the name of the type used to nil lists of objects of +// type 'syncset'. +const SyncsetListNilKind = "SyncsetListNil" + +// SyncsetList is a list of values of the 'syncset' type. +type SyncsetList struct { + href string + link bool + items []*Syncset +} + +// Kind returns the name of the type of the object. +func (l *SyncsetList) Kind() string { + if l == nil { + return SyncsetListNilKind + } + if l.link { + return SyncsetListLinkKind + } + return SyncsetListKind +} + +// Link returns true iif this is a link. +func (l *SyncsetList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *SyncsetList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *SyncsetList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *SyncsetList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *SyncsetList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *SyncsetList) Get(i int) *Syncset { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *SyncsetList) Slice() []*Syncset { + var slice []*Syncset + if l == nil { + slice = make([]*Syncset, 0) + } else { + slice = make([]*Syncset, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *SyncsetList) Each(f func(item *Syncset) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *SyncsetList) Range(f func(index int, item *Syncset) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/syncset_type_json.go b/clustersmgmt/v2alpha1/syncset_type_json.go new file mode 100644 index 00000000..e5ce08c3 --- /dev/null +++ b/clustersmgmt/v2alpha1/syncset_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalSyncset writes a value of the 'syncset' type to the given writer. +func MarshalSyncset(object *Syncset, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeSyncset(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeSyncset writes a value of the 'syncset' type to the given stream. +func writeSyncset(object *Syncset, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(SyncsetLinkKind) + } else { + stream.WriteString(SyncsetKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.resources != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("resources") + writeInterfaceList(object.resources, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalSyncset reads a value of the 'syncset' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalSyncset(source interface{}) (object *Syncset, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readSyncset(iterator) + err = iterator.Error + return +} + +// readSyncset reads a value of the 'syncset' type from the given iterator. +func readSyncset(iterator *jsoniter.Iterator) *Syncset { + object := &Syncset{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == SyncsetLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "resources": + value := readInterfaceList(iterator) + object.resources = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/syncsets_client.go b/clustersmgmt/v2alpha1/syncsets_client.go new file mode 100644 index 00000000..019e0e3d --- /dev/null +++ b/clustersmgmt/v2alpha1/syncsets_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// SyncsetsClient is the client of the 'syncsets' resource. +// +// Manages the collection of syncsets of a cluster. +type SyncsetsClient struct { + transport http.RoundTripper + path string +} + +// NewSyncsetsClient creates a new client for the 'syncsets' +// resource using the given transport to send the requests and receive the +// responses. +func NewSyncsetsClient(transport http.RoundTripper, path string) *SyncsetsClient { + return &SyncsetsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new syncset to the cluster. +func (c *SyncsetsClient) Add() *SyncsetsAddRequest { + return &SyncsetsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of syncsets. +func (c *SyncsetsClient) List() *SyncsetsListRequest { + return &SyncsetsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Syncset returns the target 'syncset' resource for the given identifier. +// +// Reference to the service that manages an specific syncset. +func (c *SyncsetsClient) Syncset(id string) *SyncsetClient { + return NewSyncsetClient( + c.transport, + path.Join(c.path, id), + ) +} + +// SyncsetsAddRequest is the request for the 'add' method. +type SyncsetsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *Syncset +} + +// Parameter adds a query parameter. +func (r *SyncsetsAddRequest) Parameter(name string, value interface{}) *SyncsetsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *SyncsetsAddRequest) Header(name string, value interface{}) *SyncsetsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *SyncsetsAddRequest) Impersonate(user string) *SyncsetsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the syncset. +func (r *SyncsetsAddRequest) Body(value *Syncset) *SyncsetsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *SyncsetsAddRequest) Send() (result *SyncsetsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *SyncsetsAddRequest) SendContext(ctx context.Context) (result *SyncsetsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeSyncsetsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &SyncsetsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readSyncsetsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// SyncsetsAddResponse is the response for the 'add' method. +type SyncsetsAddResponse struct { + status int + header http.Header + err *errors.Error + body *Syncset +} + +// Status returns the response status code. +func (r *SyncsetsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *SyncsetsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *SyncsetsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the syncset. +func (r *SyncsetsAddResponse) Body() *Syncset { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the syncset. +func (r *SyncsetsAddResponse) GetBody() (value *Syncset, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// SyncsetsListRequest is the request for the 'list' method. +type SyncsetsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *SyncsetsListRequest) Parameter(name string, value interface{}) *SyncsetsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *SyncsetsListRequest) Header(name string, value interface{}) *SyncsetsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *SyncsetsListRequest) Impersonate(user string) *SyncsetsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *SyncsetsListRequest) Page(value int) *SyncsetsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *SyncsetsListRequest) Size(value int) *SyncsetsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *SyncsetsListRequest) Send() (result *SyncsetsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *SyncsetsListRequest) SendContext(ctx context.Context) (result *SyncsetsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &SyncsetsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readSyncsetsListResponse(result, reader) + if err != nil { + return + } + return +} + +// SyncsetsListResponse is the response for the 'list' method. +type SyncsetsListResponse struct { + status int + header http.Header + err *errors.Error + items *SyncsetList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *SyncsetsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *SyncsetsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *SyncsetsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of syncsets. +func (r *SyncsetsListResponse) Items() *SyncsetList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of syncsets. +func (r *SyncsetsListResponse) GetItems() (value *SyncsetList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *SyncsetsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *SyncsetsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *SyncsetsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *SyncsetsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *SyncsetsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *SyncsetsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/syncsets_resource_json.go b/clustersmgmt/v2alpha1/syncsets_resource_json.go new file mode 100644 index 00000000..9f9dc98f --- /dev/null +++ b/clustersmgmt/v2alpha1/syncsets_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeSyncsetsAddRequest(request *SyncsetsAddRequest, writer io.Writer) error { + return MarshalSyncset(request.body, writer) +} +func readSyncsetsAddResponse(response *SyncsetsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalSyncset(reader) + return err +} +func writeSyncsetsListRequest(request *SyncsetsListRequest, writer io.Writer) error { + return nil +} +func readSyncsetsListResponse(response *SyncsetsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readSyncsetList(iterator) + response.items = &SyncsetList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/taint_builder.go b/clustersmgmt/v2alpha1/taint_builder.go new file mode 100644 index 00000000..9e71ba93 --- /dev/null +++ b/clustersmgmt/v2alpha1/taint_builder.go @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TaintBuilder contains the data and logic needed to build 'taint' objects. +// +// Representation of a Taint set on a MachinePool in a cluster. +type TaintBuilder struct { + bitmap_ uint32 + effect string + key string + value string +} + +// NewTaint creates a new builder of 'taint' objects. +func NewTaint() *TaintBuilder { + return &TaintBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *TaintBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Effect sets the value of the 'effect' attribute to the given value. +func (b *TaintBuilder) Effect(value string) *TaintBuilder { + b.effect = value + b.bitmap_ |= 1 + return b +} + +// Key sets the value of the 'key' attribute to the given value. +func (b *TaintBuilder) Key(value string) *TaintBuilder { + b.key = value + b.bitmap_ |= 2 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *TaintBuilder) Value(value string) *TaintBuilder { + b.value = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *TaintBuilder) Copy(object *Taint) *TaintBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.effect = object.effect + b.key = object.key + b.value = object.value + return b +} + +// Build creates a 'taint' object using the configuration stored in the builder. +func (b *TaintBuilder) Build() (object *Taint, err error) { + object = new(Taint) + object.bitmap_ = b.bitmap_ + object.effect = b.effect + object.key = b.key + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/taint_list_builder.go b/clustersmgmt/v2alpha1/taint_list_builder.go new file mode 100644 index 00000000..90137fb0 --- /dev/null +++ b/clustersmgmt/v2alpha1/taint_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TaintListBuilder contains the data and logic needed to build +// 'taint' objects. +type TaintListBuilder struct { + items []*TaintBuilder +} + +// NewTaintList creates a new builder of 'taint' objects. +func NewTaintList() *TaintListBuilder { + return new(TaintListBuilder) +} + +// Items sets the items of the list. +func (b *TaintListBuilder) Items(values ...*TaintBuilder) *TaintListBuilder { + b.items = make([]*TaintBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *TaintListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *TaintListBuilder) Copy(list *TaintList) *TaintListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*TaintBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewTaint().Copy(v) + } + } + return b +} + +// Build creates a list of 'taint' objects using the +// configuration stored in the builder. +func (b *TaintListBuilder) Build() (list *TaintList, err error) { + items := make([]*Taint, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(TaintList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/taint_list_type_json.go b/clustersmgmt/v2alpha1/taint_list_type_json.go new file mode 100644 index 00000000..094439e7 --- /dev/null +++ b/clustersmgmt/v2alpha1/taint_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTaintList writes a list of values of the 'taint' type to +// the given writer. +func MarshalTaintList(list []*Taint, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTaintList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTaintList writes a list of value of the 'taint' type to +// the given stream. +func writeTaintList(list []*Taint, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeTaint(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalTaintList reads a list of values of the 'taint' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalTaintList(source interface{}) (items []*Taint, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readTaintList(iterator) + err = iterator.Error + return +} + +// readTaintList reads list of values of the ”taint' type from +// the given iterator. +func readTaintList(iterator *jsoniter.Iterator) []*Taint { + list := []*Taint{} + for iterator.ReadArray() { + item := readTaint(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/taint_type.go b/clustersmgmt/v2alpha1/taint_type.go new file mode 100644 index 00000000..d28c9af8 --- /dev/null +++ b/clustersmgmt/v2alpha1/taint_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Taint represents the values of the 'taint' type. +// +// Representation of a Taint set on a MachinePool in a cluster. +type Taint struct { + bitmap_ uint32 + effect string + key string + value string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Taint) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Effect returns the value of the 'effect' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The effect on the node for the pods matching the taint, i.e: NoSchedule, NoExecute, PreferNoSchedule. +func (o *Taint) Effect() string { + if o != nil && o.bitmap_&1 != 0 { + return o.effect + } + return "" +} + +// GetEffect returns the value of the 'effect' attribute and +// a flag indicating if the attribute has a value. +// +// The effect on the node for the pods matching the taint, i.e: NoSchedule, NoExecute, PreferNoSchedule. +func (o *Taint) GetEffect() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.effect + } + return +} + +// Key returns the value of the 'key' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The key for the taint +func (o *Taint) Key() string { + if o != nil && o.bitmap_&2 != 0 { + return o.key + } + return "" +} + +// GetKey returns the value of the 'key' attribute and +// a flag indicating if the attribute has a value. +// +// The key for the taint +func (o *Taint) GetKey() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.key + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The value for the taint. +func (o *Taint) Value() string { + if o != nil && o.bitmap_&4 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// The value for the taint. +func (o *Taint) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.value + } + return +} + +// TaintListKind is the name of the type used to represent list of objects of +// type 'taint'. +const TaintListKind = "TaintList" + +// TaintListLinkKind is the name of the type used to represent links to list +// of objects of type 'taint'. +const TaintListLinkKind = "TaintListLink" + +// TaintNilKind is the name of the type used to nil lists of objects of +// type 'taint'. +const TaintListNilKind = "TaintListNil" + +// TaintList is a list of values of the 'taint' type. +type TaintList struct { + href string + link bool + items []*Taint +} + +// Len returns the length of the list. +func (l *TaintList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *TaintList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *TaintList) Get(i int) *Taint { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *TaintList) Slice() []*Taint { + var slice []*Taint + if l == nil { + slice = make([]*Taint, 0) + } else { + slice = make([]*Taint, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *TaintList) Each(f func(item *Taint) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *TaintList) Range(f func(index int, item *Taint) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/taint_type_json.go b/clustersmgmt/v2alpha1/taint_type_json.go new file mode 100644 index 00000000..ade2a224 --- /dev/null +++ b/clustersmgmt/v2alpha1/taint_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTaint writes a value of the 'taint' type to the given writer. +func MarshalTaint(object *Taint, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTaint(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTaint writes a value of the 'taint' type to the given stream. +func writeTaint(object *Taint, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("effect") + stream.WriteString(object.effect) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("key") + stream.WriteString(object.key) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalTaint reads a value of the 'taint' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalTaint(source interface{}) (object *Taint, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readTaint(iterator) + err = iterator.Error + return +} + +// readTaint reads a value of the 'taint' type from the given iterator. +func readTaint(iterator *jsoniter.Iterator) *Taint { + object := &Taint{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "effect": + value := iterator.ReadString() + object.effect = value + object.bitmap_ |= 1 + case "key": + value := iterator.ReadString() + object.key = value + object.bitmap_ |= 2 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/token_claim_mappings_builder.go b/clustersmgmt/v2alpha1/token_claim_mappings_builder.go new file mode 100644 index 00000000..6b9c1fbc --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_mappings_builder.go @@ -0,0 +1,101 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenClaimMappingsBuilder contains the data and logic needed to build 'token_claim_mappings' objects. +// +// The claim mappings defined for users and groups. +type TokenClaimMappingsBuilder struct { + bitmap_ uint32 + groups *GroupsClaimBuilder + userName *UsernameClaimBuilder +} + +// NewTokenClaimMappings creates a new builder of 'token_claim_mappings' objects. +func NewTokenClaimMappings() *TokenClaimMappingsBuilder { + return &TokenClaimMappingsBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *TokenClaimMappingsBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Groups sets the value of the 'groups' attribute to the given value. +func (b *TokenClaimMappingsBuilder) Groups(value *GroupsClaimBuilder) *TokenClaimMappingsBuilder { + b.groups = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// UserName sets the value of the 'user_name' attribute to the given value. +// +// The username claim mapping. +func (b *TokenClaimMappingsBuilder) UserName(value *UsernameClaimBuilder) *TokenClaimMappingsBuilder { + b.userName = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *TokenClaimMappingsBuilder) Copy(object *TokenClaimMappings) *TokenClaimMappingsBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.groups != nil { + b.groups = NewGroupsClaim().Copy(object.groups) + } else { + b.groups = nil + } + if object.userName != nil { + b.userName = NewUsernameClaim().Copy(object.userName) + } else { + b.userName = nil + } + return b +} + +// Build creates a 'token_claim_mappings' object using the configuration stored in the builder. +func (b *TokenClaimMappingsBuilder) Build() (object *TokenClaimMappings, err error) { + object = new(TokenClaimMappings) + object.bitmap_ = b.bitmap_ + if b.groups != nil { + object.groups, err = b.groups.Build() + if err != nil { + return + } + } + if b.userName != nil { + object.userName, err = b.userName.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/token_claim_mappings_list_builder.go b/clustersmgmt/v2alpha1/token_claim_mappings_list_builder.go new file mode 100644 index 00000000..80676960 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_mappings_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenClaimMappingsListBuilder contains the data and logic needed to build +// 'token_claim_mappings' objects. +type TokenClaimMappingsListBuilder struct { + items []*TokenClaimMappingsBuilder +} + +// NewTokenClaimMappingsList creates a new builder of 'token_claim_mappings' objects. +func NewTokenClaimMappingsList() *TokenClaimMappingsListBuilder { + return new(TokenClaimMappingsListBuilder) +} + +// Items sets the items of the list. +func (b *TokenClaimMappingsListBuilder) Items(values ...*TokenClaimMappingsBuilder) *TokenClaimMappingsListBuilder { + b.items = make([]*TokenClaimMappingsBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *TokenClaimMappingsListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *TokenClaimMappingsListBuilder) Copy(list *TokenClaimMappingsList) *TokenClaimMappingsListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*TokenClaimMappingsBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewTokenClaimMappings().Copy(v) + } + } + return b +} + +// Build creates a list of 'token_claim_mappings' objects using the +// configuration stored in the builder. +func (b *TokenClaimMappingsListBuilder) Build() (list *TokenClaimMappingsList, err error) { + items := make([]*TokenClaimMappings, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(TokenClaimMappingsList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/token_claim_mappings_list_type_json.go b/clustersmgmt/v2alpha1/token_claim_mappings_list_type_json.go new file mode 100644 index 00000000..efba0a51 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_mappings_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTokenClaimMappingsList writes a list of values of the 'token_claim_mappings' type to +// the given writer. +func MarshalTokenClaimMappingsList(list []*TokenClaimMappings, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTokenClaimMappingsList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTokenClaimMappingsList writes a list of value of the 'token_claim_mappings' type to +// the given stream. +func writeTokenClaimMappingsList(list []*TokenClaimMappings, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeTokenClaimMappings(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalTokenClaimMappingsList reads a list of values of the 'token_claim_mappings' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalTokenClaimMappingsList(source interface{}) (items []*TokenClaimMappings, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readTokenClaimMappingsList(iterator) + err = iterator.Error + return +} + +// readTokenClaimMappingsList reads list of values of the ”token_claim_mappings' type from +// the given iterator. +func readTokenClaimMappingsList(iterator *jsoniter.Iterator) []*TokenClaimMappings { + list := []*TokenClaimMappings{} + for iterator.ReadArray() { + item := readTokenClaimMappings(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/token_claim_mappings_type.go b/clustersmgmt/v2alpha1/token_claim_mappings_type.go new file mode 100644 index 00000000..f824b09d --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_mappings_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenClaimMappings represents the values of the 'token_claim_mappings' type. +// +// The claim mappings defined for users and groups. +type TokenClaimMappings struct { + bitmap_ uint32 + groups *GroupsClaim + userName *UsernameClaim +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *TokenClaimMappings) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Groups returns the value of the 'groups' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Groups is a name of the claim that should be used to construct groups for the cluster identity. +func (o *TokenClaimMappings) Groups() *GroupsClaim { + if o != nil && o.bitmap_&1 != 0 { + return o.groups + } + return nil +} + +// GetGroups returns the value of the 'groups' attribute and +// a flag indicating if the attribute has a value. +// +// Groups is a name of the claim that should be used to construct groups for the cluster identity. +func (o *TokenClaimMappings) GetGroups() (value *GroupsClaim, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.groups + } + return +} + +// UserName returns the value of the 'user_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Username is a name of the claim that should be used to construct usernames for the cluster identity. +func (o *TokenClaimMappings) UserName() *UsernameClaim { + if o != nil && o.bitmap_&2 != 0 { + return o.userName + } + return nil +} + +// GetUserName returns the value of the 'user_name' attribute and +// a flag indicating if the attribute has a value. +// +// Username is a name of the claim that should be used to construct usernames for the cluster identity. +func (o *TokenClaimMappings) GetUserName() (value *UsernameClaim, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.userName + } + return +} + +// TokenClaimMappingsListKind is the name of the type used to represent list of objects of +// type 'token_claim_mappings'. +const TokenClaimMappingsListKind = "TokenClaimMappingsList" + +// TokenClaimMappingsListLinkKind is the name of the type used to represent links to list +// of objects of type 'token_claim_mappings'. +const TokenClaimMappingsListLinkKind = "TokenClaimMappingsListLink" + +// TokenClaimMappingsNilKind is the name of the type used to nil lists of objects of +// type 'token_claim_mappings'. +const TokenClaimMappingsListNilKind = "TokenClaimMappingsListNil" + +// TokenClaimMappingsList is a list of values of the 'token_claim_mappings' type. +type TokenClaimMappingsList struct { + href string + link bool + items []*TokenClaimMappings +} + +// Len returns the length of the list. +func (l *TokenClaimMappingsList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *TokenClaimMappingsList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *TokenClaimMappingsList) Get(i int) *TokenClaimMappings { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *TokenClaimMappingsList) Slice() []*TokenClaimMappings { + var slice []*TokenClaimMappings + if l == nil { + slice = make([]*TokenClaimMappings, 0) + } else { + slice = make([]*TokenClaimMappings, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *TokenClaimMappingsList) Each(f func(item *TokenClaimMappings) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *TokenClaimMappingsList) Range(f func(index int, item *TokenClaimMappings) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/token_claim_mappings_type_json.go b/clustersmgmt/v2alpha1/token_claim_mappings_type_json.go new file mode 100644 index 00000000..5fee72df --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_mappings_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTokenClaimMappings writes a value of the 'token_claim_mappings' type to the given writer. +func MarshalTokenClaimMappings(object *TokenClaimMappings, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTokenClaimMappings(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTokenClaimMappings writes a value of the 'token_claim_mappings' type to the given stream. +func writeTokenClaimMappings(object *TokenClaimMappings, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.groups != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("groups") + writeGroupsClaim(object.groups, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.userName != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("username") + writeUsernameClaim(object.userName, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalTokenClaimMappings reads a value of the 'token_claim_mappings' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalTokenClaimMappings(source interface{}) (object *TokenClaimMappings, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readTokenClaimMappings(iterator) + err = iterator.Error + return +} + +// readTokenClaimMappings reads a value of the 'token_claim_mappings' type from the given iterator. +func readTokenClaimMappings(iterator *jsoniter.Iterator) *TokenClaimMappings { + object := &TokenClaimMappings{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "groups": + value := readGroupsClaim(iterator) + object.groups = value + object.bitmap_ |= 1 + case "username": + value := readUsernameClaim(iterator) + object.userName = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/token_claim_validation_rule_builder.go b/clustersmgmt/v2alpha1/token_claim_validation_rule_builder.go new file mode 100644 index 00000000..b703b60e --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_validation_rule_builder.go @@ -0,0 +1,73 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenClaimValidationRuleBuilder contains the data and logic needed to build 'token_claim_validation_rule' objects. +// +// The rule that is applied to validate token claims to authenticate users. +type TokenClaimValidationRuleBuilder struct { + bitmap_ uint32 + claim string + requiredValue string +} + +// NewTokenClaimValidationRule creates a new builder of 'token_claim_validation_rule' objects. +func NewTokenClaimValidationRule() *TokenClaimValidationRuleBuilder { + return &TokenClaimValidationRuleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *TokenClaimValidationRuleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Claim sets the value of the 'claim' attribute to the given value. +func (b *TokenClaimValidationRuleBuilder) Claim(value string) *TokenClaimValidationRuleBuilder { + b.claim = value + b.bitmap_ |= 1 + return b +} + +// RequiredValue sets the value of the 'required_value' attribute to the given value. +func (b *TokenClaimValidationRuleBuilder) RequiredValue(value string) *TokenClaimValidationRuleBuilder { + b.requiredValue = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *TokenClaimValidationRuleBuilder) Copy(object *TokenClaimValidationRule) *TokenClaimValidationRuleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.claim = object.claim + b.requiredValue = object.requiredValue + return b +} + +// Build creates a 'token_claim_validation_rule' object using the configuration stored in the builder. +func (b *TokenClaimValidationRuleBuilder) Build() (object *TokenClaimValidationRule, err error) { + object = new(TokenClaimValidationRule) + object.bitmap_ = b.bitmap_ + object.claim = b.claim + object.requiredValue = b.requiredValue + return +} diff --git a/clustersmgmt/v2alpha1/token_claim_validation_rule_list_builder.go b/clustersmgmt/v2alpha1/token_claim_validation_rule_list_builder.go new file mode 100644 index 00000000..1d477f1d --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_validation_rule_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenClaimValidationRuleListBuilder contains the data and logic needed to build +// 'token_claim_validation_rule' objects. +type TokenClaimValidationRuleListBuilder struct { + items []*TokenClaimValidationRuleBuilder +} + +// NewTokenClaimValidationRuleList creates a new builder of 'token_claim_validation_rule' objects. +func NewTokenClaimValidationRuleList() *TokenClaimValidationRuleListBuilder { + return new(TokenClaimValidationRuleListBuilder) +} + +// Items sets the items of the list. +func (b *TokenClaimValidationRuleListBuilder) Items(values ...*TokenClaimValidationRuleBuilder) *TokenClaimValidationRuleListBuilder { + b.items = make([]*TokenClaimValidationRuleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *TokenClaimValidationRuleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *TokenClaimValidationRuleListBuilder) Copy(list *TokenClaimValidationRuleList) *TokenClaimValidationRuleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*TokenClaimValidationRuleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewTokenClaimValidationRule().Copy(v) + } + } + return b +} + +// Build creates a list of 'token_claim_validation_rule' objects using the +// configuration stored in the builder. +func (b *TokenClaimValidationRuleListBuilder) Build() (list *TokenClaimValidationRuleList, err error) { + items := make([]*TokenClaimValidationRule, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(TokenClaimValidationRuleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/token_claim_validation_rule_list_type_json.go b/clustersmgmt/v2alpha1/token_claim_validation_rule_list_type_json.go new file mode 100644 index 00000000..086f0d5a --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_validation_rule_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTokenClaimValidationRuleList writes a list of values of the 'token_claim_validation_rule' type to +// the given writer. +func MarshalTokenClaimValidationRuleList(list []*TokenClaimValidationRule, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTokenClaimValidationRuleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTokenClaimValidationRuleList writes a list of value of the 'token_claim_validation_rule' type to +// the given stream. +func writeTokenClaimValidationRuleList(list []*TokenClaimValidationRule, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeTokenClaimValidationRule(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalTokenClaimValidationRuleList reads a list of values of the 'token_claim_validation_rule' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalTokenClaimValidationRuleList(source interface{}) (items []*TokenClaimValidationRule, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readTokenClaimValidationRuleList(iterator) + err = iterator.Error + return +} + +// readTokenClaimValidationRuleList reads list of values of the ”token_claim_validation_rule' type from +// the given iterator. +func readTokenClaimValidationRuleList(iterator *jsoniter.Iterator) []*TokenClaimValidationRule { + list := []*TokenClaimValidationRule{} + for iterator.ReadArray() { + item := readTokenClaimValidationRule(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/token_claim_validation_rule_type.go b/clustersmgmt/v2alpha1/token_claim_validation_rule_type.go new file mode 100644 index 00000000..af635ff6 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_validation_rule_type.go @@ -0,0 +1,166 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenClaimValidationRule represents the values of the 'token_claim_validation_rule' type. +// +// The rule that is applied to validate token claims to authenticate users. +type TokenClaimValidationRule struct { + bitmap_ uint32 + claim string + requiredValue string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *TokenClaimValidationRule) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Claim returns the value of the 'claim' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Claim is a name of a required claim. +func (o *TokenClaimValidationRule) Claim() string { + if o != nil && o.bitmap_&1 != 0 { + return o.claim + } + return "" +} + +// GetClaim returns the value of the 'claim' attribute and +// a flag indicating if the attribute has a value. +// +// Claim is a name of a required claim. +func (o *TokenClaimValidationRule) GetClaim() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.claim + } + return +} + +// RequiredValue returns the value of the 'required_value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// RequiredValue is the required value for the claim. +func (o *TokenClaimValidationRule) RequiredValue() string { + if o != nil && o.bitmap_&2 != 0 { + return o.requiredValue + } + return "" +} + +// GetRequiredValue returns the value of the 'required_value' attribute and +// a flag indicating if the attribute has a value. +// +// RequiredValue is the required value for the claim. +func (o *TokenClaimValidationRule) GetRequiredValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.requiredValue + } + return +} + +// TokenClaimValidationRuleListKind is the name of the type used to represent list of objects of +// type 'token_claim_validation_rule'. +const TokenClaimValidationRuleListKind = "TokenClaimValidationRuleList" + +// TokenClaimValidationRuleListLinkKind is the name of the type used to represent links to list +// of objects of type 'token_claim_validation_rule'. +const TokenClaimValidationRuleListLinkKind = "TokenClaimValidationRuleListLink" + +// TokenClaimValidationRuleNilKind is the name of the type used to nil lists of objects of +// type 'token_claim_validation_rule'. +const TokenClaimValidationRuleListNilKind = "TokenClaimValidationRuleListNil" + +// TokenClaimValidationRuleList is a list of values of the 'token_claim_validation_rule' type. +type TokenClaimValidationRuleList struct { + href string + link bool + items []*TokenClaimValidationRule +} + +// Len returns the length of the list. +func (l *TokenClaimValidationRuleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *TokenClaimValidationRuleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *TokenClaimValidationRuleList) Get(i int) *TokenClaimValidationRule { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *TokenClaimValidationRuleList) Slice() []*TokenClaimValidationRule { + var slice []*TokenClaimValidationRule + if l == nil { + slice = make([]*TokenClaimValidationRule, 0) + } else { + slice = make([]*TokenClaimValidationRule, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *TokenClaimValidationRuleList) Each(f func(item *TokenClaimValidationRule) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *TokenClaimValidationRuleList) Range(f func(index int, item *TokenClaimValidationRule) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/token_claim_validation_rule_type_json.go b/clustersmgmt/v2alpha1/token_claim_validation_rule_type_json.go new file mode 100644 index 00000000..827eaaad --- /dev/null +++ b/clustersmgmt/v2alpha1/token_claim_validation_rule_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTokenClaimValidationRule writes a value of the 'token_claim_validation_rule' type to the given writer. +func MarshalTokenClaimValidationRule(object *TokenClaimValidationRule, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTokenClaimValidationRule(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTokenClaimValidationRule writes a value of the 'token_claim_validation_rule' type to the given stream. +func writeTokenClaimValidationRule(object *TokenClaimValidationRule, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("claim") + stream.WriteString(object.claim) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("required_value") + stream.WriteString(object.requiredValue) + } + stream.WriteObjectEnd() +} + +// UnmarshalTokenClaimValidationRule reads a value of the 'token_claim_validation_rule' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalTokenClaimValidationRule(source interface{}) (object *TokenClaimValidationRule, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readTokenClaimValidationRule(iterator) + err = iterator.Error + return +} + +// readTokenClaimValidationRule reads a value of the 'token_claim_validation_rule' type from the given iterator. +func readTokenClaimValidationRule(iterator *jsoniter.Iterator) *TokenClaimValidationRule { + object := &TokenClaimValidationRule{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "claim": + value := iterator.ReadString() + object.claim = value + object.bitmap_ |= 1 + case "required_value": + value := iterator.ReadString() + object.requiredValue = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/token_issuer_builder.go b/clustersmgmt/v2alpha1/token_issuer_builder.go new file mode 100644 index 00000000..f9fbe139 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_issuer_builder.go @@ -0,0 +1,92 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenIssuerBuilder contains the data and logic needed to build 'token_issuer' objects. +// +// Representation of a token issuer used in an external authentication. +type TokenIssuerBuilder struct { + bitmap_ uint32 + ca string + url string + audiences []string +} + +// NewTokenIssuer creates a new builder of 'token_issuer' objects. +func NewTokenIssuer() *TokenIssuerBuilder { + return &TokenIssuerBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *TokenIssuerBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// CA sets the value of the 'CA' attribute to the given value. +func (b *TokenIssuerBuilder) CA(value string) *TokenIssuerBuilder { + b.ca = value + b.bitmap_ |= 1 + return b +} + +// URL sets the value of the 'URL' attribute to the given value. +func (b *TokenIssuerBuilder) URL(value string) *TokenIssuerBuilder { + b.url = value + b.bitmap_ |= 2 + return b +} + +// Audiences sets the value of the 'audiences' attribute to the given values. +func (b *TokenIssuerBuilder) Audiences(values ...string) *TokenIssuerBuilder { + b.audiences = make([]string, len(values)) + copy(b.audiences, values) + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *TokenIssuerBuilder) Copy(object *TokenIssuer) *TokenIssuerBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.ca = object.ca + b.url = object.url + if object.audiences != nil { + b.audiences = make([]string, len(object.audiences)) + copy(b.audiences, object.audiences) + } else { + b.audiences = nil + } + return b +} + +// Build creates a 'token_issuer' object using the configuration stored in the builder. +func (b *TokenIssuerBuilder) Build() (object *TokenIssuer, err error) { + object = new(TokenIssuer) + object.bitmap_ = b.bitmap_ + object.ca = b.ca + object.url = b.url + if b.audiences != nil { + object.audiences = make([]string, len(b.audiences)) + copy(object.audiences, b.audiences) + } + return +} diff --git a/clustersmgmt/v2alpha1/token_issuer_list_builder.go b/clustersmgmt/v2alpha1/token_issuer_list_builder.go new file mode 100644 index 00000000..df301c98 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_issuer_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenIssuerListBuilder contains the data and logic needed to build +// 'token_issuer' objects. +type TokenIssuerListBuilder struct { + items []*TokenIssuerBuilder +} + +// NewTokenIssuerList creates a new builder of 'token_issuer' objects. +func NewTokenIssuerList() *TokenIssuerListBuilder { + return new(TokenIssuerListBuilder) +} + +// Items sets the items of the list. +func (b *TokenIssuerListBuilder) Items(values ...*TokenIssuerBuilder) *TokenIssuerListBuilder { + b.items = make([]*TokenIssuerBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *TokenIssuerListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *TokenIssuerListBuilder) Copy(list *TokenIssuerList) *TokenIssuerListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*TokenIssuerBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewTokenIssuer().Copy(v) + } + } + return b +} + +// Build creates a list of 'token_issuer' objects using the +// configuration stored in the builder. +func (b *TokenIssuerListBuilder) Build() (list *TokenIssuerList, err error) { + items := make([]*TokenIssuer, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(TokenIssuerList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/token_issuer_list_type_json.go b/clustersmgmt/v2alpha1/token_issuer_list_type_json.go new file mode 100644 index 00000000..5c2394d9 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_issuer_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTokenIssuerList writes a list of values of the 'token_issuer' type to +// the given writer. +func MarshalTokenIssuerList(list []*TokenIssuer, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTokenIssuerList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTokenIssuerList writes a list of value of the 'token_issuer' type to +// the given stream. +func writeTokenIssuerList(list []*TokenIssuer, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeTokenIssuer(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalTokenIssuerList reads a list of values of the 'token_issuer' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalTokenIssuerList(source interface{}) (items []*TokenIssuer, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readTokenIssuerList(iterator) + err = iterator.Error + return +} + +// readTokenIssuerList reads list of values of the ”token_issuer' type from +// the given iterator. +func readTokenIssuerList(iterator *jsoniter.Iterator) []*TokenIssuer { + list := []*TokenIssuer{} + for iterator.ReadArray() { + item := readTokenIssuer(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/token_issuer_type.go b/clustersmgmt/v2alpha1/token_issuer_type.go new file mode 100644 index 00000000..df260724 --- /dev/null +++ b/clustersmgmt/v2alpha1/token_issuer_type.go @@ -0,0 +1,196 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TokenIssuer represents the values of the 'token_issuer' type. +// +// Representation of a token issuer used in an external authentication. +type TokenIssuer struct { + bitmap_ uint32 + ca string + url string + audiences []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *TokenIssuer) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// CA returns the value of the 'CA' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Certificate bundle to use to validate server certificates for the configured URL. +func (o *TokenIssuer) CA() string { + if o != nil && o.bitmap_&1 != 0 { + return o.ca + } + return "" +} + +// GetCA returns the value of the 'CA' attribute and +// a flag indicating if the attribute has a value. +// +// Certificate bundle to use to validate server certificates for the configured URL. +func (o *TokenIssuer) GetCA() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.ca + } + return +} + +// URL returns the value of the 'URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// URL is the serving URL of the token issuer. +func (o *TokenIssuer) URL() string { + if o != nil && o.bitmap_&2 != 0 { + return o.url + } + return "" +} + +// GetURL returns the value of the 'URL' attribute and +// a flag indicating if the attribute has a value. +// +// URL is the serving URL of the token issuer. +func (o *TokenIssuer) GetURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.url + } + return +} + +// Audiences returns the value of the 'audiences' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Audiences is an array of audiences that the token was issued for. +// Valid tokens must include at least one of these values in their +// "aud" claim. +// Must be set to exactly one value. +func (o *TokenIssuer) Audiences() []string { + if o != nil && o.bitmap_&4 != 0 { + return o.audiences + } + return nil +} + +// GetAudiences returns the value of the 'audiences' attribute and +// a flag indicating if the attribute has a value. +// +// Audiences is an array of audiences that the token was issued for. +// Valid tokens must include at least one of these values in their +// "aud" claim. +// Must be set to exactly one value. +func (o *TokenIssuer) GetAudiences() (value []string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.audiences + } + return +} + +// TokenIssuerListKind is the name of the type used to represent list of objects of +// type 'token_issuer'. +const TokenIssuerListKind = "TokenIssuerList" + +// TokenIssuerListLinkKind is the name of the type used to represent links to list +// of objects of type 'token_issuer'. +const TokenIssuerListLinkKind = "TokenIssuerListLink" + +// TokenIssuerNilKind is the name of the type used to nil lists of objects of +// type 'token_issuer'. +const TokenIssuerListNilKind = "TokenIssuerListNil" + +// TokenIssuerList is a list of values of the 'token_issuer' type. +type TokenIssuerList struct { + href string + link bool + items []*TokenIssuer +} + +// Len returns the length of the list. +func (l *TokenIssuerList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *TokenIssuerList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *TokenIssuerList) Get(i int) *TokenIssuer { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *TokenIssuerList) Slice() []*TokenIssuer { + var slice []*TokenIssuer + if l == nil { + slice = make([]*TokenIssuer, 0) + } else { + slice = make([]*TokenIssuer, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *TokenIssuerList) Each(f func(item *TokenIssuer) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *TokenIssuerList) Range(f func(index int, item *TokenIssuer) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/token_issuer_type_json.go b/clustersmgmt/v2alpha1/token_issuer_type_json.go new file mode 100644 index 00000000..00505e0b --- /dev/null +++ b/clustersmgmt/v2alpha1/token_issuer_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTokenIssuer writes a value of the 'token_issuer' type to the given writer. +func MarshalTokenIssuer(object *TokenIssuer, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTokenIssuer(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTokenIssuer writes a value of the 'token_issuer' type to the given stream. +func writeTokenIssuer(object *TokenIssuer, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("ca") + stream.WriteString(object.ca) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("url") + stream.WriteString(object.url) + count++ + } + present_ = object.bitmap_&4 != 0 && object.audiences != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("audiences") + writeStringList(object.audiences, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalTokenIssuer reads a value of the 'token_issuer' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalTokenIssuer(source interface{}) (object *TokenIssuer, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readTokenIssuer(iterator) + err = iterator.Error + return +} + +// readTokenIssuer reads a value of the 'token_issuer' type from the given iterator. +func readTokenIssuer(iterator *jsoniter.Iterator) *TokenIssuer { + object := &TokenIssuer{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "ca": + value := iterator.ReadString() + object.ca = value + object.bitmap_ |= 1 + case "url": + value := iterator.ReadString() + object.url = value + object.bitmap_ |= 2 + case "audiences": + value := readStringList(iterator) + object.audiences = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_builder.go b/clustersmgmt/v2alpha1/trusted_ip_builder.go new file mode 100644 index 00000000..65514062 --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_builder.go @@ -0,0 +1,89 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TrustedIpBuilder contains the data and logic needed to build 'trusted_ip' objects. +// +// Representation of a trusted ip address in clusterdeployment. +type TrustedIpBuilder struct { + bitmap_ uint32 + id string + href string + enabled bool +} + +// NewTrustedIp creates a new builder of 'trusted_ip' objects. +func NewTrustedIp() *TrustedIpBuilder { + return &TrustedIpBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *TrustedIpBuilder) Link(value bool) *TrustedIpBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *TrustedIpBuilder) ID(value string) *TrustedIpBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *TrustedIpBuilder) HREF(value string) *TrustedIpBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *TrustedIpBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *TrustedIpBuilder) Enabled(value bool) *TrustedIpBuilder { + b.enabled = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *TrustedIpBuilder) Copy(object *TrustedIp) *TrustedIpBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.enabled = object.enabled + return b +} + +// Build creates a 'trusted_ip' object using the configuration stored in the builder. +func (b *TrustedIpBuilder) Build() (object *TrustedIp, err error) { + object = new(TrustedIp) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.enabled = b.enabled + return +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_client.go b/clustersmgmt/v2alpha1/trusted_ip_client.go new file mode 100644 index 00000000..f8d47dc0 --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// TrustedIpClient is the client of the 'trusted_ip' resource. +// +// Manages a specific trusted ip address. +type TrustedIpClient struct { + transport http.RoundTripper + path string +} + +// NewTrustedIpClient creates a new client for the 'trusted_ip' +// resource using the given transport to send the requests and receive the +// responses. +func NewTrustedIpClient(transport http.RoundTripper, path string) *TrustedIpClient { + return &TrustedIpClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the trusted ip adresses. +func (c *TrustedIpClient) Get() *TrustedIpGetRequest { + return &TrustedIpGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// TrustedIpPollRequest is the request for the Poll method. +type TrustedIpPollRequest struct { + request *TrustedIpGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *TrustedIpPollRequest) Parameter(name string, value interface{}) *TrustedIpPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *TrustedIpPollRequest) Header(name string, value interface{}) *TrustedIpPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *TrustedIpPollRequest) Interval(value time.Duration) *TrustedIpPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *TrustedIpPollRequest) Status(value int) *TrustedIpPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *TrustedIpPollRequest) Predicate(value func(*TrustedIpGetResponse) bool) *TrustedIpPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*TrustedIpGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *TrustedIpPollRequest) StartContext(ctx context.Context) (response *TrustedIpPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &TrustedIpPollResponse{ + response: result.(*TrustedIpGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *TrustedIpPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// TrustedIpPollResponse is the response for the Poll method. +type TrustedIpPollResponse struct { + response *TrustedIpGetResponse +} + +// Status returns the response status code. +func (r *TrustedIpPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *TrustedIpPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *TrustedIpPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *TrustedIpPollResponse) Body() *TrustedIp { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *TrustedIpPollResponse) GetBody() (value *TrustedIp, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *TrustedIpClient) Poll() *TrustedIpPollRequest { + return &TrustedIpPollRequest{ + request: c.Get(), + } +} + +// TrustedIpGetRequest is the request for the 'get' method. +type TrustedIpGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *TrustedIpGetRequest) Parameter(name string, value interface{}) *TrustedIpGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TrustedIpGetRequest) Header(name string, value interface{}) *TrustedIpGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TrustedIpGetRequest) Impersonate(user string) *TrustedIpGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TrustedIpGetRequest) Send() (result *TrustedIpGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TrustedIpGetRequest) SendContext(ctx context.Context) (result *TrustedIpGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TrustedIpGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readTrustedIpGetResponse(result, reader) + if err != nil { + return + } + return +} + +// TrustedIpGetResponse is the response for the 'get' method. +type TrustedIpGetResponse struct { + status int + header http.Header + err *errors.Error + body *TrustedIp +} + +// Status returns the response status code. +func (r *TrustedIpGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TrustedIpGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TrustedIpGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *TrustedIpGetResponse) Body() *TrustedIp { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *TrustedIpGetResponse) GetBody() (value *TrustedIp, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_list_builder.go b/clustersmgmt/v2alpha1/trusted_ip_list_builder.go new file mode 100644 index 00000000..582950d6 --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TrustedIpListBuilder contains the data and logic needed to build +// 'trusted_ip' objects. +type TrustedIpListBuilder struct { + items []*TrustedIpBuilder +} + +// NewTrustedIpList creates a new builder of 'trusted_ip' objects. +func NewTrustedIpList() *TrustedIpListBuilder { + return new(TrustedIpListBuilder) +} + +// Items sets the items of the list. +func (b *TrustedIpListBuilder) Items(values ...*TrustedIpBuilder) *TrustedIpListBuilder { + b.items = make([]*TrustedIpBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *TrustedIpListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *TrustedIpListBuilder) Copy(list *TrustedIpList) *TrustedIpListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*TrustedIpBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewTrustedIp().Copy(v) + } + } + return b +} + +// Build creates a list of 'trusted_ip' objects using the +// configuration stored in the builder. +func (b *TrustedIpListBuilder) Build() (list *TrustedIpList, err error) { + items := make([]*TrustedIp, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(TrustedIpList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_list_type_json.go b/clustersmgmt/v2alpha1/trusted_ip_list_type_json.go new file mode 100644 index 00000000..558e2f5b --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTrustedIpList writes a list of values of the 'trusted_ip' type to +// the given writer. +func MarshalTrustedIpList(list []*TrustedIp, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTrustedIpList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTrustedIpList writes a list of value of the 'trusted_ip' type to +// the given stream. +func writeTrustedIpList(list []*TrustedIp, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeTrustedIp(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalTrustedIpList reads a list of values of the 'trusted_ip' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalTrustedIpList(source interface{}) (items []*TrustedIp, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readTrustedIpList(iterator) + err = iterator.Error + return +} + +// readTrustedIpList reads list of values of the ”trusted_ip' type from +// the given iterator. +func readTrustedIpList(iterator *jsoniter.Iterator) []*TrustedIp { + list := []*TrustedIp{} + for iterator.ReadArray() { + item := readTrustedIp(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_resource_json.go b/clustersmgmt/v2alpha1/trusted_ip_resource_json.go new file mode 100644 index 00000000..3b877ed2 --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeTrustedIpGetRequest(request *TrustedIpGetRequest, writer io.Writer) error { + return nil +} +func readTrustedIpGetResponse(response *TrustedIpGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalTrustedIp(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_type.go b/clustersmgmt/v2alpha1/trusted_ip_type.go new file mode 100644 index 00000000..ca2f21f8 --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_type.go @@ -0,0 +1,242 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TrustedIpKind is the name of the type used to represent objects +// of type 'trusted_ip'. +const TrustedIpKind = "TrustedIp" + +// TrustedIpLinkKind is the name of the type used to represent links +// to objects of type 'trusted_ip'. +const TrustedIpLinkKind = "TrustedIpLink" + +// TrustedIpNilKind is the name of the type used to nil references +// to objects of type 'trusted_ip'. +const TrustedIpNilKind = "TrustedIpNil" + +// TrustedIp represents the values of the 'trusted_ip' type. +// +// Representation of a trusted ip address in clusterdeployment. +type TrustedIp struct { + bitmap_ uint32 + id string + href string + enabled bool +} + +// Kind returns the name of the type of the object. +func (o *TrustedIp) Kind() string { + if o == nil { + return TrustedIpNilKind + } + if o.bitmap_&1 != 0 { + return TrustedIpLinkKind + } + return TrustedIpKind +} + +// Link returns true iif this is a link. +func (o *TrustedIp) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *TrustedIp) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *TrustedIp) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *TrustedIp) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *TrustedIp) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *TrustedIp) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The boolean set to show if the ip is enabled. +func (o *TrustedIp) Enabled() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// The boolean set to show if the ip is enabled. +func (o *TrustedIp) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.enabled + } + return +} + +// TrustedIpListKind is the name of the type used to represent list of objects of +// type 'trusted_ip'. +const TrustedIpListKind = "TrustedIpList" + +// TrustedIpListLinkKind is the name of the type used to represent links to list +// of objects of type 'trusted_ip'. +const TrustedIpListLinkKind = "TrustedIpListLink" + +// TrustedIpNilKind is the name of the type used to nil lists of objects of +// type 'trusted_ip'. +const TrustedIpListNilKind = "TrustedIpListNil" + +// TrustedIpList is a list of values of the 'trusted_ip' type. +type TrustedIpList struct { + href string + link bool + items []*TrustedIp +} + +// Kind returns the name of the type of the object. +func (l *TrustedIpList) Kind() string { + if l == nil { + return TrustedIpListNilKind + } + if l.link { + return TrustedIpListLinkKind + } + return TrustedIpListKind +} + +// Link returns true iif this is a link. +func (l *TrustedIpList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *TrustedIpList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *TrustedIpList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *TrustedIpList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *TrustedIpList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *TrustedIpList) Get(i int) *TrustedIp { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *TrustedIpList) Slice() []*TrustedIp { + var slice []*TrustedIp + if l == nil { + slice = make([]*TrustedIp, 0) + } else { + slice = make([]*TrustedIp, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *TrustedIpList) Each(f func(item *TrustedIp) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *TrustedIpList) Range(f func(index int, item *TrustedIp) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/trusted_ip_type_json.go b/clustersmgmt/v2alpha1/trusted_ip_type_json.go new file mode 100644 index 00000000..2b98a14b --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ip_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTrustedIp writes a value of the 'trusted_ip' type to the given writer. +func MarshalTrustedIp(object *TrustedIp, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTrustedIp(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTrustedIp writes a value of the 'trusted_ip' type to the given stream. +func writeTrustedIp(object *TrustedIp, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(TrustedIpLinkKind) + } else { + stream.WriteString(TrustedIpKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + } + stream.WriteObjectEnd() +} + +// UnmarshalTrustedIp reads a value of the 'trusted_ip' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalTrustedIp(source interface{}) (object *TrustedIp, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readTrustedIp(iterator) + err = iterator.Error + return +} + +// readTrustedIp reads a value of the 'trusted_ip' type from the given iterator. +func readTrustedIp(iterator *jsoniter.Iterator) *TrustedIp { + object := &TrustedIp{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == TrustedIpLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/trusted_ips_client.go b/clustersmgmt/v2alpha1/trusted_ips_client.go new file mode 100644 index 00000000..8cdbdf5c --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ips_client.go @@ -0,0 +1,286 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// TrustedIpsClient is the client of the 'trusted_ips' resource. +// +// Manages the collection of trusted ip addresses of a cluster. +type TrustedIpsClient struct { + transport http.RoundTripper + path string +} + +// NewTrustedIpsClient creates a new client for the 'trusted_ips' +// resource using the given transport to send the requests and receive the +// responses. +func NewTrustedIpsClient(transport http.RoundTripper, path string) *TrustedIpsClient { + return &TrustedIpsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of trusted ip addresses. +func (c *TrustedIpsClient) List() *TrustedIpsListRequest { + return &TrustedIpsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// TrustedIpsListRequest is the request for the 'list' method. +type TrustedIpsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *TrustedIpsListRequest) Parameter(name string, value interface{}) *TrustedIpsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TrustedIpsListRequest) Header(name string, value interface{}) *TrustedIpsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TrustedIpsListRequest) Impersonate(user string) *TrustedIpsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *TrustedIpsListRequest) Page(value int) *TrustedIpsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *TrustedIpsListRequest) Size(value int) *TrustedIpsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TrustedIpsListRequest) Send() (result *TrustedIpsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TrustedIpsListRequest) SendContext(ctx context.Context) (result *TrustedIpsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TrustedIpsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readTrustedIpsListResponse(result, reader) + if err != nil { + return + } + return +} + +// TrustedIpsListResponse is the response for the 'list' method. +type TrustedIpsListResponse struct { + status int + header http.Header + err *errors.Error + items *TrustedIpList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *TrustedIpsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TrustedIpsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TrustedIpsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of trusted ip addresses. +func (r *TrustedIpsListResponse) Items() *TrustedIpList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of trusted ip addresses. +func (r *TrustedIpsListResponse) GetItems() (value *TrustedIpList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *TrustedIpsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *TrustedIpsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *TrustedIpsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *TrustedIpsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *TrustedIpsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *TrustedIpsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/trusted_ips_resource_json.go b/clustersmgmt/v2alpha1/trusted_ips_resource_json.go new file mode 100644 index 00000000..e3fd7d44 --- /dev/null +++ b/clustersmgmt/v2alpha1/trusted_ips_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeTrustedIpsListRequest(request *TrustedIpsListRequest, writer io.Writer) error { + return nil +} +func readTrustedIpsListResponse(response *TrustedIpsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readTrustedIpList(iterator) + response.items = &TrustedIpList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/tuning_config_builder.go b/clustersmgmt/v2alpha1/tuning_config_builder.go new file mode 100644 index 00000000..2ed1d2db --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_builder.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TuningConfigBuilder contains the data and logic needed to build 'tuning_config' objects. +// +// Representation of a tuning config. +type TuningConfigBuilder struct { + bitmap_ uint32 + id string + href string + name string + spec interface{} +} + +// NewTuningConfig creates a new builder of 'tuning_config' objects. +func NewTuningConfig() *TuningConfigBuilder { + return &TuningConfigBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *TuningConfigBuilder) Link(value bool) *TuningConfigBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *TuningConfigBuilder) ID(value string) *TuningConfigBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *TuningConfigBuilder) HREF(value string) *TuningConfigBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *TuningConfigBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *TuningConfigBuilder) Name(value string) *TuningConfigBuilder { + b.name = value + b.bitmap_ |= 8 + return b +} + +// Spec sets the value of the 'spec' attribute to the given value. +func (b *TuningConfigBuilder) Spec(value interface{}) *TuningConfigBuilder { + b.spec = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *TuningConfigBuilder) Copy(object *TuningConfig) *TuningConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.name = object.name + b.spec = object.spec + return b +} + +// Build creates a 'tuning_config' object using the configuration stored in the builder. +func (b *TuningConfigBuilder) Build() (object *TuningConfig, err error) { + object = new(TuningConfig) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.name = b.name + object.spec = b.spec + return +} diff --git a/clustersmgmt/v2alpha1/tuning_config_client.go b/clustersmgmt/v2alpha1/tuning_config_client.go new file mode 100644 index 00000000..19e7881e --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_client.go @@ -0,0 +1,578 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// TuningConfigClient is the client of the 'tuning_config' resource. +// +// Manages a specific tuning config. +type TuningConfigClient struct { + transport http.RoundTripper + path string +} + +// NewTuningConfigClient creates a new client for the 'tuning_config' +// resource using the given transport to send the requests and receive the +// responses. +func NewTuningConfigClient(transport http.RoundTripper, path string) *TuningConfigClient { + return &TuningConfigClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the tuning config. +func (c *TuningConfigClient) Delete() *TuningConfigDeleteRequest { + return &TuningConfigDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the tuning config. +func (c *TuningConfigClient) Get() *TuningConfigGetRequest { + return &TuningConfigGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Updates the tuning config. +func (c *TuningConfigClient) Update() *TuningConfigUpdateRequest { + return &TuningConfigUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// TuningConfigPollRequest is the request for the Poll method. +type TuningConfigPollRequest struct { + request *TuningConfigGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *TuningConfigPollRequest) Parameter(name string, value interface{}) *TuningConfigPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *TuningConfigPollRequest) Header(name string, value interface{}) *TuningConfigPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *TuningConfigPollRequest) Interval(value time.Duration) *TuningConfigPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *TuningConfigPollRequest) Status(value int) *TuningConfigPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *TuningConfigPollRequest) Predicate(value func(*TuningConfigGetResponse) bool) *TuningConfigPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*TuningConfigGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *TuningConfigPollRequest) StartContext(ctx context.Context) (response *TuningConfigPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &TuningConfigPollResponse{ + response: result.(*TuningConfigGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *TuningConfigPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// TuningConfigPollResponse is the response for the Poll method. +type TuningConfigPollResponse struct { + response *TuningConfigGetResponse +} + +// Status returns the response status code. +func (r *TuningConfigPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *TuningConfigPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *TuningConfigPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *TuningConfigPollResponse) Body() *TuningConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *TuningConfigPollResponse) GetBody() (value *TuningConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *TuningConfigClient) Poll() *TuningConfigPollRequest { + return &TuningConfigPollRequest{ + request: c.Get(), + } +} + +// TuningConfigDeleteRequest is the request for the 'delete' method. +type TuningConfigDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *TuningConfigDeleteRequest) Parameter(name string, value interface{}) *TuningConfigDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TuningConfigDeleteRequest) Header(name string, value interface{}) *TuningConfigDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TuningConfigDeleteRequest) Impersonate(user string) *TuningConfigDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TuningConfigDeleteRequest) Send() (result *TuningConfigDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TuningConfigDeleteRequest) SendContext(ctx context.Context) (result *TuningConfigDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TuningConfigDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// TuningConfigDeleteResponse is the response for the 'delete' method. +type TuningConfigDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *TuningConfigDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TuningConfigDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TuningConfigDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// TuningConfigGetRequest is the request for the 'get' method. +type TuningConfigGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *TuningConfigGetRequest) Parameter(name string, value interface{}) *TuningConfigGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TuningConfigGetRequest) Header(name string, value interface{}) *TuningConfigGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TuningConfigGetRequest) Impersonate(user string) *TuningConfigGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TuningConfigGetRequest) Send() (result *TuningConfigGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TuningConfigGetRequest) SendContext(ctx context.Context) (result *TuningConfigGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TuningConfigGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readTuningConfigGetResponse(result, reader) + if err != nil { + return + } + return +} + +// TuningConfigGetResponse is the response for the 'get' method. +type TuningConfigGetResponse struct { + status int + header http.Header + err *errors.Error + body *TuningConfig +} + +// Status returns the response status code. +func (r *TuningConfigGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TuningConfigGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TuningConfigGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *TuningConfigGetResponse) Body() *TuningConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *TuningConfigGetResponse) GetBody() (value *TuningConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// TuningConfigUpdateRequest is the request for the 'update' method. +type TuningConfigUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *TuningConfig +} + +// Parameter adds a query parameter. +func (r *TuningConfigUpdateRequest) Parameter(name string, value interface{}) *TuningConfigUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TuningConfigUpdateRequest) Header(name string, value interface{}) *TuningConfigUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TuningConfigUpdateRequest) Impersonate(user string) *TuningConfigUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *TuningConfigUpdateRequest) Body(value *TuningConfig) *TuningConfigUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TuningConfigUpdateRequest) Send() (result *TuningConfigUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TuningConfigUpdateRequest) SendContext(ctx context.Context) (result *TuningConfigUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeTuningConfigUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TuningConfigUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readTuningConfigUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// TuningConfigUpdateResponse is the response for the 'update' method. +type TuningConfigUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *TuningConfig +} + +// Status returns the response status code. +func (r *TuningConfigUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TuningConfigUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TuningConfigUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *TuningConfigUpdateResponse) Body() *TuningConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *TuningConfigUpdateResponse) GetBody() (value *TuningConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/tuning_config_list_builder.go b/clustersmgmt/v2alpha1/tuning_config_list_builder.go new file mode 100644 index 00000000..57fcbeaf --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TuningConfigListBuilder contains the data and logic needed to build +// 'tuning_config' objects. +type TuningConfigListBuilder struct { + items []*TuningConfigBuilder +} + +// NewTuningConfigList creates a new builder of 'tuning_config' objects. +func NewTuningConfigList() *TuningConfigListBuilder { + return new(TuningConfigListBuilder) +} + +// Items sets the items of the list. +func (b *TuningConfigListBuilder) Items(values ...*TuningConfigBuilder) *TuningConfigListBuilder { + b.items = make([]*TuningConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *TuningConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *TuningConfigListBuilder) Copy(list *TuningConfigList) *TuningConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*TuningConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewTuningConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'tuning_config' objects using the +// configuration stored in the builder. +func (b *TuningConfigListBuilder) Build() (list *TuningConfigList, err error) { + items := make([]*TuningConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(TuningConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/tuning_config_list_type_json.go b/clustersmgmt/v2alpha1/tuning_config_list_type_json.go new file mode 100644 index 00000000..fd745e03 --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTuningConfigList writes a list of values of the 'tuning_config' type to +// the given writer. +func MarshalTuningConfigList(list []*TuningConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTuningConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTuningConfigList writes a list of value of the 'tuning_config' type to +// the given stream. +func writeTuningConfigList(list []*TuningConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeTuningConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalTuningConfigList reads a list of values of the 'tuning_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalTuningConfigList(source interface{}) (items []*TuningConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readTuningConfigList(iterator) + err = iterator.Error + return +} + +// readTuningConfigList reads list of values of the ”tuning_config' type from +// the given iterator. +func readTuningConfigList(iterator *jsoniter.Iterator) []*TuningConfig { + list := []*TuningConfig{} + for iterator.ReadArray() { + item := readTuningConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/tuning_config_resource_json.go b/clustersmgmt/v2alpha1/tuning_config_resource_json.go new file mode 100644 index 00000000..72c935ff --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeTuningConfigDeleteRequest(request *TuningConfigDeleteRequest, writer io.Writer) error { + return nil +} +func readTuningConfigDeleteResponse(response *TuningConfigDeleteResponse, reader io.Reader) error { + return nil +} +func writeTuningConfigGetRequest(request *TuningConfigGetRequest, writer io.Writer) error { + return nil +} +func readTuningConfigGetResponse(response *TuningConfigGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalTuningConfig(reader) + return err +} +func writeTuningConfigUpdateRequest(request *TuningConfigUpdateRequest, writer io.Writer) error { + return MarshalTuningConfig(request.body, writer) +} +func readTuningConfigUpdateResponse(response *TuningConfigUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalTuningConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/tuning_config_type.go b/clustersmgmt/v2alpha1/tuning_config_type.go new file mode 100644 index 00000000..6556b1c0 --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_type.go @@ -0,0 +1,266 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// TuningConfigKind is the name of the type used to represent objects +// of type 'tuning_config'. +const TuningConfigKind = "TuningConfig" + +// TuningConfigLinkKind is the name of the type used to represent links +// to objects of type 'tuning_config'. +const TuningConfigLinkKind = "TuningConfigLink" + +// TuningConfigNilKind is the name of the type used to nil references +// to objects of type 'tuning_config'. +const TuningConfigNilKind = "TuningConfigNil" + +// TuningConfig represents the values of the 'tuning_config' type. +// +// Representation of a tuning config. +type TuningConfig struct { + bitmap_ uint32 + id string + href string + name string + spec interface{} +} + +// Kind returns the name of the type of the object. +func (o *TuningConfig) Kind() string { + if o == nil { + return TuningConfigNilKind + } + if o.bitmap_&1 != 0 { + return TuningConfigLinkKind + } + return TuningConfigKind +} + +// Link returns true iif this is a link. +func (o *TuningConfig) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *TuningConfig) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *TuningConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *TuningConfig) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *TuningConfig) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *TuningConfig) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the tuning config. +func (o *TuningConfig) Name() string { + if o != nil && o.bitmap_&8 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the tuning config. +func (o *TuningConfig) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.name + } + return +} + +// Spec returns the value of the 'spec' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Spec of the tuning config. +func (o *TuningConfig) Spec() interface{} { + if o != nil && o.bitmap_&16 != 0 { + return o.spec + } + return nil +} + +// GetSpec returns the value of the 'spec' attribute and +// a flag indicating if the attribute has a value. +// +// Spec of the tuning config. +func (o *TuningConfig) GetSpec() (value interface{}, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.spec + } + return +} + +// TuningConfigListKind is the name of the type used to represent list of objects of +// type 'tuning_config'. +const TuningConfigListKind = "TuningConfigList" + +// TuningConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'tuning_config'. +const TuningConfigListLinkKind = "TuningConfigListLink" + +// TuningConfigNilKind is the name of the type used to nil lists of objects of +// type 'tuning_config'. +const TuningConfigListNilKind = "TuningConfigListNil" + +// TuningConfigList is a list of values of the 'tuning_config' type. +type TuningConfigList struct { + href string + link bool + items []*TuningConfig +} + +// Kind returns the name of the type of the object. +func (l *TuningConfigList) Kind() string { + if l == nil { + return TuningConfigListNilKind + } + if l.link { + return TuningConfigListLinkKind + } + return TuningConfigListKind +} + +// Link returns true iif this is a link. +func (l *TuningConfigList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *TuningConfigList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *TuningConfigList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *TuningConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *TuningConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *TuningConfigList) Get(i int) *TuningConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *TuningConfigList) Slice() []*TuningConfig { + var slice []*TuningConfig + if l == nil { + slice = make([]*TuningConfig, 0) + } else { + slice = make([]*TuningConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *TuningConfigList) Each(f func(item *TuningConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *TuningConfigList) Range(f func(index int, item *TuningConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/tuning_config_type_json.go b/clustersmgmt/v2alpha1/tuning_config_type_json.go new file mode 100644 index 00000000..fa4ed9ed --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_config_type_json.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalTuningConfig writes a value of the 'tuning_config' type to the given writer. +func MarshalTuningConfig(object *TuningConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeTuningConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeTuningConfig writes a value of the 'tuning_config' type to the given stream. +func writeTuningConfig(object *TuningConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(TuningConfigLinkKind) + } else { + stream.WriteString(TuningConfigKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("spec") + stream.WriteVal(object.spec) + } + stream.WriteObjectEnd() +} + +// UnmarshalTuningConfig reads a value of the 'tuning_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalTuningConfig(source interface{}) (object *TuningConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readTuningConfig(iterator) + err = iterator.Error + return +} + +// readTuningConfig reads a value of the 'tuning_config' type from the given iterator. +func readTuningConfig(iterator *jsoniter.Iterator) *TuningConfig { + object := &TuningConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == TuningConfigLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 8 + case "spec": + var value interface{} + iterator.ReadVal(&value) + object.spec = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/tuning_configs_client.go b/clustersmgmt/v2alpha1/tuning_configs_client.go new file mode 100644 index 00000000..dd2956ce --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_configs_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// TuningConfigsClient is the client of the 'tuning_configs' resource. +// +// Manages the collection of tuning configs for a cluster. +type TuningConfigsClient struct { + transport http.RoundTripper + path string +} + +// NewTuningConfigsClient creates a new client for the 'tuning_configs' +// resource using the given transport to send the requests and receive the +// responses. +func NewTuningConfigsClient(transport http.RoundTripper, path string) *TuningConfigsClient { + return &TuningConfigsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new tuning config to the cluster. +func (c *TuningConfigsClient) Add() *TuningConfigsAddRequest { + return &TuningConfigsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of tuning configs. +func (c *TuningConfigsClient) List() *TuningConfigsListRequest { + return &TuningConfigsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// TuningConfig returns the target 'tuning_config' resource for the given identifier. +// +// Reference to the service that manages a specific tuning config. +func (c *TuningConfigsClient) TuningConfig(id string) *TuningConfigClient { + return NewTuningConfigClient( + c.transport, + path.Join(c.path, id), + ) +} + +// TuningConfigsAddRequest is the request for the 'add' method. +type TuningConfigsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *TuningConfig +} + +// Parameter adds a query parameter. +func (r *TuningConfigsAddRequest) Parameter(name string, value interface{}) *TuningConfigsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TuningConfigsAddRequest) Header(name string, value interface{}) *TuningConfigsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TuningConfigsAddRequest) Impersonate(user string) *TuningConfigsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the tuning config. +func (r *TuningConfigsAddRequest) Body(value *TuningConfig) *TuningConfigsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TuningConfigsAddRequest) Send() (result *TuningConfigsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TuningConfigsAddRequest) SendContext(ctx context.Context) (result *TuningConfigsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeTuningConfigsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TuningConfigsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readTuningConfigsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// TuningConfigsAddResponse is the response for the 'add' method. +type TuningConfigsAddResponse struct { + status int + header http.Header + err *errors.Error + body *TuningConfig +} + +// Status returns the response status code. +func (r *TuningConfigsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TuningConfigsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TuningConfigsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the tuning config. +func (r *TuningConfigsAddResponse) Body() *TuningConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the tuning config. +func (r *TuningConfigsAddResponse) GetBody() (value *TuningConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// TuningConfigsListRequest is the request for the 'list' method. +type TuningConfigsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *TuningConfigsListRequest) Parameter(name string, value interface{}) *TuningConfigsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *TuningConfigsListRequest) Header(name string, value interface{}) *TuningConfigsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *TuningConfigsListRequest) Impersonate(user string) *TuningConfigsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *TuningConfigsListRequest) Page(value int) *TuningConfigsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *TuningConfigsListRequest) Size(value int) *TuningConfigsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *TuningConfigsListRequest) Send() (result *TuningConfigsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *TuningConfigsListRequest) SendContext(ctx context.Context) (result *TuningConfigsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &TuningConfigsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readTuningConfigsListResponse(result, reader) + if err != nil { + return + } + return +} + +// TuningConfigsListResponse is the response for the 'list' method. +type TuningConfigsListResponse struct { + status int + header http.Header + err *errors.Error + items *TuningConfigList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *TuningConfigsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *TuningConfigsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *TuningConfigsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of tuning configs. +func (r *TuningConfigsListResponse) Items() *TuningConfigList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of tuning configs. +func (r *TuningConfigsListResponse) GetItems() (value *TuningConfigList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *TuningConfigsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *TuningConfigsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *TuningConfigsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *TuningConfigsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *TuningConfigsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *TuningConfigsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/tuning_configs_resource_json.go b/clustersmgmt/v2alpha1/tuning_configs_resource_json.go new file mode 100644 index 00000000..ca18c2e4 --- /dev/null +++ b/clustersmgmt/v2alpha1/tuning_configs_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeTuningConfigsAddRequest(request *TuningConfigsAddRequest, writer io.Writer) error { + return MarshalTuningConfig(request.body, writer) +} +func readTuningConfigsAddResponse(response *TuningConfigsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalTuningConfig(reader) + return err +} +func writeTuningConfigsListRequest(request *TuningConfigsListRequest, writer io.Writer) error { + return nil +} +func readTuningConfigsListResponse(response *TuningConfigsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readTuningConfigList(iterator) + response.items = &TuningConfigList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/upgrade_policies_client.go b/clustersmgmt/v2alpha1/upgrade_policies_client.go new file mode 100644 index 00000000..ade07369 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policies_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// UpgradePoliciesClient is the client of the 'upgrade_policies' resource. +// +// Manages the collection of upgrade policies of a cluster. +type UpgradePoliciesClient struct { + transport http.RoundTripper + path string +} + +// NewUpgradePoliciesClient creates a new client for the 'upgrade_policies' +// resource using the given transport to send the requests and receive the +// responses. +func NewUpgradePoliciesClient(transport http.RoundTripper, path string) *UpgradePoliciesClient { + return &UpgradePoliciesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new upgrade policy to the cluster. +func (c *UpgradePoliciesClient) Add() *UpgradePoliciesAddRequest { + return &UpgradePoliciesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of upgrade policies. +func (c *UpgradePoliciesClient) List() *UpgradePoliciesListRequest { + return &UpgradePoliciesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// UpgradePolicy returns the target 'upgrade_policy' resource for the given identifier. +// +// Reference to the service that manages an specific upgrade policy. +func (c *UpgradePoliciesClient) UpgradePolicy(id string) *UpgradePolicyClient { + return NewUpgradePolicyClient( + c.transport, + path.Join(c.path, id), + ) +} + +// UpgradePoliciesAddRequest is the request for the 'add' method. +type UpgradePoliciesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *UpgradePolicy +} + +// Parameter adds a query parameter. +func (r *UpgradePoliciesAddRequest) Parameter(name string, value interface{}) *UpgradePoliciesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePoliciesAddRequest) Header(name string, value interface{}) *UpgradePoliciesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePoliciesAddRequest) Impersonate(user string) *UpgradePoliciesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *UpgradePoliciesAddRequest) Body(value *UpgradePolicy) *UpgradePoliciesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePoliciesAddRequest) Send() (result *UpgradePoliciesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePoliciesAddRequest) SendContext(ctx context.Context) (result *UpgradePoliciesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeUpgradePoliciesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePoliciesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUpgradePoliciesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// UpgradePoliciesAddResponse is the response for the 'add' method. +type UpgradePoliciesAddResponse struct { + status int + header http.Header + err *errors.Error + body *UpgradePolicy +} + +// Status returns the response status code. +func (r *UpgradePoliciesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePoliciesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePoliciesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the upgrade policy. +func (r *UpgradePoliciesAddResponse) Body() *UpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the upgrade policy. +func (r *UpgradePoliciesAddResponse) GetBody() (value *UpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// UpgradePoliciesListRequest is the request for the 'list' method. +type UpgradePoliciesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *UpgradePoliciesListRequest) Parameter(name string, value interface{}) *UpgradePoliciesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePoliciesListRequest) Header(name string, value interface{}) *UpgradePoliciesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePoliciesListRequest) Impersonate(user string) *UpgradePoliciesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *UpgradePoliciesListRequest) Page(value int) *UpgradePoliciesListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *UpgradePoliciesListRequest) Size(value int) *UpgradePoliciesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePoliciesListRequest) Send() (result *UpgradePoliciesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePoliciesListRequest) SendContext(ctx context.Context) (result *UpgradePoliciesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePoliciesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUpgradePoliciesListResponse(result, reader) + if err != nil { + return + } + return +} + +// UpgradePoliciesListResponse is the response for the 'list' method. +type UpgradePoliciesListResponse struct { + status int + header http.Header + err *errors.Error + items *UpgradePolicyList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *UpgradePoliciesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePoliciesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePoliciesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of upgrade policy. +func (r *UpgradePoliciesListResponse) Items() *UpgradePolicyList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of upgrade policy. +func (r *UpgradePoliciesListResponse) GetItems() (value *UpgradePolicyList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *UpgradePoliciesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *UpgradePoliciesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *UpgradePoliciesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *UpgradePoliciesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *UpgradePoliciesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *UpgradePoliciesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policies_resource_json.go b/clustersmgmt/v2alpha1/upgrade_policies_resource_json.go new file mode 100644 index 00000000..3e037147 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policies_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeUpgradePoliciesAddRequest(request *UpgradePoliciesAddRequest, writer io.Writer) error { + return MarshalUpgradePolicy(request.body, writer) +} +func readUpgradePoliciesAddResponse(response *UpgradePoliciesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUpgradePolicy(reader) + return err +} +func writeUpgradePoliciesListRequest(request *UpgradePoliciesListRequest, writer io.Writer) error { + return nil +} +func readUpgradePoliciesListResponse(response *UpgradePoliciesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readUpgradePolicyList(iterator) + response.items = &UpgradePolicyList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_builder.go b/clustersmgmt/v2alpha1/upgrade_policy_builder.go new file mode 100644 index 00000000..3e66cd93 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_builder.go @@ -0,0 +1,157 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// UpgradePolicyBuilder contains the data and logic needed to build 'upgrade_policy' objects. +// +// Representation of an upgrade policy that can be set for a cluster. +type UpgradePolicyBuilder struct { + bitmap_ uint32 + id string + href string + clusterID string + nextRun time.Time + schedule string + scheduleType ScheduleType + upgradeType UpgradeType + version string + enableMinorVersionUpgrades bool +} + +// NewUpgradePolicy creates a new builder of 'upgrade_policy' objects. +func NewUpgradePolicy() *UpgradePolicyBuilder { + return &UpgradePolicyBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *UpgradePolicyBuilder) Link(value bool) *UpgradePolicyBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *UpgradePolicyBuilder) ID(value string) *UpgradePolicyBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *UpgradePolicyBuilder) HREF(value string) *UpgradePolicyBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *UpgradePolicyBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ClusterID sets the value of the 'cluster_ID' attribute to the given value. +func (b *UpgradePolicyBuilder) ClusterID(value string) *UpgradePolicyBuilder { + b.clusterID = value + b.bitmap_ |= 8 + return b +} + +// EnableMinorVersionUpgrades sets the value of the 'enable_minor_version_upgrades' attribute to the given value. +func (b *UpgradePolicyBuilder) EnableMinorVersionUpgrades(value bool) *UpgradePolicyBuilder { + b.enableMinorVersionUpgrades = value + b.bitmap_ |= 16 + return b +} + +// NextRun sets the value of the 'next_run' attribute to the given value. +func (b *UpgradePolicyBuilder) NextRun(value time.Time) *UpgradePolicyBuilder { + b.nextRun = value + b.bitmap_ |= 32 + return b +} + +// Schedule sets the value of the 'schedule' attribute to the given value. +func (b *UpgradePolicyBuilder) Schedule(value string) *UpgradePolicyBuilder { + b.schedule = value + b.bitmap_ |= 64 + return b +} + +// ScheduleType sets the value of the 'schedule_type' attribute to the given value. +// +// ScheduleType defines which type of scheduling should be used for the upgrade policy. +func (b *UpgradePolicyBuilder) ScheduleType(value ScheduleType) *UpgradePolicyBuilder { + b.scheduleType = value + b.bitmap_ |= 128 + return b +} + +// UpgradeType sets the value of the 'upgrade_type' attribute to the given value. +// +// UpgradeType defines which type of upgrade should be used. +func (b *UpgradePolicyBuilder) UpgradeType(value UpgradeType) *UpgradePolicyBuilder { + b.upgradeType = value + b.bitmap_ |= 256 + return b +} + +// Version sets the value of the 'version' attribute to the given value. +func (b *UpgradePolicyBuilder) Version(value string) *UpgradePolicyBuilder { + b.version = value + b.bitmap_ |= 512 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *UpgradePolicyBuilder) Copy(object *UpgradePolicy) *UpgradePolicyBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.clusterID = object.clusterID + b.enableMinorVersionUpgrades = object.enableMinorVersionUpgrades + b.nextRun = object.nextRun + b.schedule = object.schedule + b.scheduleType = object.scheduleType + b.upgradeType = object.upgradeType + b.version = object.version + return b +} + +// Build creates a 'upgrade_policy' object using the configuration stored in the builder. +func (b *UpgradePolicyBuilder) Build() (object *UpgradePolicy, err error) { + object = new(UpgradePolicy) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.clusterID = b.clusterID + object.enableMinorVersionUpgrades = b.enableMinorVersionUpgrades + object.nextRun = b.nextRun + object.schedule = b.schedule + object.scheduleType = b.scheduleType + object.upgradeType = b.upgradeType + object.version = b.version + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_client.go b/clustersmgmt/v2alpha1/upgrade_policy_client.go new file mode 100644 index 00000000..3f463a47 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_client.go @@ -0,0 +1,589 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// UpgradePolicyClient is the client of the 'upgrade_policy' resource. +// +// Manages a specific upgrade policy. +type UpgradePolicyClient struct { + transport http.RoundTripper + path string +} + +// NewUpgradePolicyClient creates a new client for the 'upgrade_policy' +// resource using the given transport to send the requests and receive the +// responses. +func NewUpgradePolicyClient(transport http.RoundTripper, path string) *UpgradePolicyClient { + return &UpgradePolicyClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the upgrade policy. +func (c *UpgradePolicyClient) Delete() *UpgradePolicyDeleteRequest { + return &UpgradePolicyDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the upgrade policy. +func (c *UpgradePolicyClient) Get() *UpgradePolicyGetRequest { + return &UpgradePolicyGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the upgrade policy. +func (c *UpgradePolicyClient) Update() *UpgradePolicyUpdateRequest { + return &UpgradePolicyUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// State returns the target 'upgrade_policy_state' resource. +// +// Reference to the state of the upgrade policy. +func (c *UpgradePolicyClient) State() *UpgradePolicyStateClient { + return NewUpgradePolicyStateClient( + c.transport, + path.Join(c.path, "state"), + ) +} + +// UpgradePolicyPollRequest is the request for the Poll method. +type UpgradePolicyPollRequest struct { + request *UpgradePolicyGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *UpgradePolicyPollRequest) Parameter(name string, value interface{}) *UpgradePolicyPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *UpgradePolicyPollRequest) Header(name string, value interface{}) *UpgradePolicyPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *UpgradePolicyPollRequest) Interval(value time.Duration) *UpgradePolicyPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *UpgradePolicyPollRequest) Status(value int) *UpgradePolicyPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *UpgradePolicyPollRequest) Predicate(value func(*UpgradePolicyGetResponse) bool) *UpgradePolicyPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*UpgradePolicyGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *UpgradePolicyPollRequest) StartContext(ctx context.Context) (response *UpgradePolicyPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &UpgradePolicyPollResponse{ + response: result.(*UpgradePolicyGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *UpgradePolicyPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// UpgradePolicyPollResponse is the response for the Poll method. +type UpgradePolicyPollResponse struct { + response *UpgradePolicyGetResponse +} + +// Status returns the response status code. +func (r *UpgradePolicyPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *UpgradePolicyPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *UpgradePolicyPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *UpgradePolicyPollResponse) Body() *UpgradePolicy { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UpgradePolicyPollResponse) GetBody() (value *UpgradePolicy, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *UpgradePolicyClient) Poll() *UpgradePolicyPollRequest { + return &UpgradePolicyPollRequest{ + request: c.Get(), + } +} + +// UpgradePolicyDeleteRequest is the request for the 'delete' method. +type UpgradePolicyDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *UpgradePolicyDeleteRequest) Parameter(name string, value interface{}) *UpgradePolicyDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePolicyDeleteRequest) Header(name string, value interface{}) *UpgradePolicyDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePolicyDeleteRequest) Impersonate(user string) *UpgradePolicyDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePolicyDeleteRequest) Send() (result *UpgradePolicyDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePolicyDeleteRequest) SendContext(ctx context.Context) (result *UpgradePolicyDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePolicyDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// UpgradePolicyDeleteResponse is the response for the 'delete' method. +type UpgradePolicyDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *UpgradePolicyDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePolicyDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePolicyDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// UpgradePolicyGetRequest is the request for the 'get' method. +type UpgradePolicyGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *UpgradePolicyGetRequest) Parameter(name string, value interface{}) *UpgradePolicyGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePolicyGetRequest) Header(name string, value interface{}) *UpgradePolicyGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePolicyGetRequest) Impersonate(user string) *UpgradePolicyGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePolicyGetRequest) Send() (result *UpgradePolicyGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePolicyGetRequest) SendContext(ctx context.Context) (result *UpgradePolicyGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePolicyGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUpgradePolicyGetResponse(result, reader) + if err != nil { + return + } + return +} + +// UpgradePolicyGetResponse is the response for the 'get' method. +type UpgradePolicyGetResponse struct { + status int + header http.Header + err *errors.Error + body *UpgradePolicy +} + +// Status returns the response status code. +func (r *UpgradePolicyGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePolicyGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePolicyGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *UpgradePolicyGetResponse) Body() *UpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UpgradePolicyGetResponse) GetBody() (value *UpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// UpgradePolicyUpdateRequest is the request for the 'update' method. +type UpgradePolicyUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *UpgradePolicy +} + +// Parameter adds a query parameter. +func (r *UpgradePolicyUpdateRequest) Parameter(name string, value interface{}) *UpgradePolicyUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePolicyUpdateRequest) Header(name string, value interface{}) *UpgradePolicyUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePolicyUpdateRequest) Impersonate(user string) *UpgradePolicyUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *UpgradePolicyUpdateRequest) Body(value *UpgradePolicy) *UpgradePolicyUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePolicyUpdateRequest) Send() (result *UpgradePolicyUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePolicyUpdateRequest) SendContext(ctx context.Context) (result *UpgradePolicyUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeUpgradePolicyUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePolicyUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUpgradePolicyUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// UpgradePolicyUpdateResponse is the response for the 'update' method. +type UpgradePolicyUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *UpgradePolicy +} + +// Status returns the response status code. +func (r *UpgradePolicyUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePolicyUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePolicyUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *UpgradePolicyUpdateResponse) Body() *UpgradePolicy { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UpgradePolicyUpdateResponse) GetBody() (value *UpgradePolicy, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_list_builder.go b/clustersmgmt/v2alpha1/upgrade_policy_list_builder.go new file mode 100644 index 00000000..27febbbf --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UpgradePolicyListBuilder contains the data and logic needed to build +// 'upgrade_policy' objects. +type UpgradePolicyListBuilder struct { + items []*UpgradePolicyBuilder +} + +// NewUpgradePolicyList creates a new builder of 'upgrade_policy' objects. +func NewUpgradePolicyList() *UpgradePolicyListBuilder { + return new(UpgradePolicyListBuilder) +} + +// Items sets the items of the list. +func (b *UpgradePolicyListBuilder) Items(values ...*UpgradePolicyBuilder) *UpgradePolicyListBuilder { + b.items = make([]*UpgradePolicyBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *UpgradePolicyListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *UpgradePolicyListBuilder) Copy(list *UpgradePolicyList) *UpgradePolicyListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*UpgradePolicyBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewUpgradePolicy().Copy(v) + } + } + return b +} + +// Build creates a list of 'upgrade_policy' objects using the +// configuration stored in the builder. +func (b *UpgradePolicyListBuilder) Build() (list *UpgradePolicyList, err error) { + items := make([]*UpgradePolicy, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(UpgradePolicyList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_list_type_json.go b/clustersmgmt/v2alpha1/upgrade_policy_list_type_json.go new file mode 100644 index 00000000..8a114761 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUpgradePolicyList writes a list of values of the 'upgrade_policy' type to +// the given writer. +func MarshalUpgradePolicyList(list []*UpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUpgradePolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUpgradePolicyList writes a list of value of the 'upgrade_policy' type to +// the given stream. +func writeUpgradePolicyList(list []*UpgradePolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeUpgradePolicy(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalUpgradePolicyList reads a list of values of the 'upgrade_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalUpgradePolicyList(source interface{}) (items []*UpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readUpgradePolicyList(iterator) + err = iterator.Error + return +} + +// readUpgradePolicyList reads list of values of the ”upgrade_policy' type from +// the given iterator. +func readUpgradePolicyList(iterator *jsoniter.Iterator) []*UpgradePolicy { + list := []*UpgradePolicy{} + for iterator.ReadArray() { + item := readUpgradePolicy(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_resource_json.go b/clustersmgmt/v2alpha1/upgrade_policy_resource_json.go new file mode 100644 index 00000000..72687cb1 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_resource_json.go @@ -0,0 +1,45 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeUpgradePolicyDeleteRequest(request *UpgradePolicyDeleteRequest, writer io.Writer) error { + return nil +} +func readUpgradePolicyDeleteResponse(response *UpgradePolicyDeleteResponse, reader io.Reader) error { + return nil +} +func writeUpgradePolicyGetRequest(request *UpgradePolicyGetRequest, writer io.Writer) error { + return nil +} +func readUpgradePolicyGetResponse(response *UpgradePolicyGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUpgradePolicy(reader) + return err +} +func writeUpgradePolicyUpdateRequest(request *UpgradePolicyUpdateRequest, writer io.Writer) error { + return MarshalUpgradePolicy(request.body, writer) +} +func readUpgradePolicyUpdateResponse(response *UpgradePolicyUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUpgradePolicy(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_builder.go b/clustersmgmt/v2alpha1/upgrade_policy_state_builder.go new file mode 100644 index 00000000..af5cd956 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_builder.go @@ -0,0 +1,101 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UpgradePolicyStateBuilder contains the data and logic needed to build 'upgrade_policy_state' objects. +// +// Representation of an upgrade policy state that that is set for a cluster. +type UpgradePolicyStateBuilder struct { + bitmap_ uint32 + id string + href string + description string + value UpgradePolicyStateValue +} + +// NewUpgradePolicyState creates a new builder of 'upgrade_policy_state' objects. +func NewUpgradePolicyState() *UpgradePolicyStateBuilder { + return &UpgradePolicyStateBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *UpgradePolicyStateBuilder) Link(value bool) *UpgradePolicyStateBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *UpgradePolicyStateBuilder) ID(value string) *UpgradePolicyStateBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *UpgradePolicyStateBuilder) HREF(value string) *UpgradePolicyStateBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *UpgradePolicyStateBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *UpgradePolicyStateBuilder) Description(value string) *UpgradePolicyStateBuilder { + b.description = value + b.bitmap_ |= 8 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +// +// Overall state of a cluster upgrade policy. +func (b *UpgradePolicyStateBuilder) Value(value UpgradePolicyStateValue) *UpgradePolicyStateBuilder { + b.value = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *UpgradePolicyStateBuilder) Copy(object *UpgradePolicyState) *UpgradePolicyStateBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.description = object.description + b.value = object.value + return b +} + +// Build creates a 'upgrade_policy_state' object using the configuration stored in the builder. +func (b *UpgradePolicyStateBuilder) Build() (object *UpgradePolicyState, err error) { + object = new(UpgradePolicyState) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.description = b.description + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_client.go b/clustersmgmt/v2alpha1/upgrade_policy_state_client.go new file mode 100644 index 00000000..d5f20769 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_client.go @@ -0,0 +1,461 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// UpgradePolicyStateClient is the client of the 'upgrade_policy_state' resource. +// +// Manages a specific upgrade policy state. +type UpgradePolicyStateClient struct { + transport http.RoundTripper + path string +} + +// NewUpgradePolicyStateClient creates a new client for the 'upgrade_policy_state' +// resource using the given transport to send the requests and receive the +// responses. +func NewUpgradePolicyStateClient(transport http.RoundTripper, path string) *UpgradePolicyStateClient { + return &UpgradePolicyStateClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the upgrade policy state. +func (c *UpgradePolicyStateClient) Get() *UpgradePolicyStateGetRequest { + return &UpgradePolicyStateGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// Update creates a request for the 'update' method. +// +// Update the upgrade policy state. +func (c *UpgradePolicyStateClient) Update() *UpgradePolicyStateUpdateRequest { + return &UpgradePolicyStateUpdateRequest{ + transport: c.transport, + path: c.path, + } +} + +// UpgradePolicyStatePollRequest is the request for the Poll method. +type UpgradePolicyStatePollRequest struct { + request *UpgradePolicyStateGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *UpgradePolicyStatePollRequest) Parameter(name string, value interface{}) *UpgradePolicyStatePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *UpgradePolicyStatePollRequest) Header(name string, value interface{}) *UpgradePolicyStatePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *UpgradePolicyStatePollRequest) Interval(value time.Duration) *UpgradePolicyStatePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *UpgradePolicyStatePollRequest) Status(value int) *UpgradePolicyStatePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *UpgradePolicyStatePollRequest) Predicate(value func(*UpgradePolicyStateGetResponse) bool) *UpgradePolicyStatePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*UpgradePolicyStateGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *UpgradePolicyStatePollRequest) StartContext(ctx context.Context) (response *UpgradePolicyStatePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &UpgradePolicyStatePollResponse{ + response: result.(*UpgradePolicyStateGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *UpgradePolicyStatePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// UpgradePolicyStatePollResponse is the response for the Poll method. +type UpgradePolicyStatePollResponse struct { + response *UpgradePolicyStateGetResponse +} + +// Status returns the response status code. +func (r *UpgradePolicyStatePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *UpgradePolicyStatePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *UpgradePolicyStatePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *UpgradePolicyStatePollResponse) Body() *UpgradePolicyState { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UpgradePolicyStatePollResponse) GetBody() (value *UpgradePolicyState, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *UpgradePolicyStateClient) Poll() *UpgradePolicyStatePollRequest { + return &UpgradePolicyStatePollRequest{ + request: c.Get(), + } +} + +// UpgradePolicyStateGetRequest is the request for the 'get' method. +type UpgradePolicyStateGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *UpgradePolicyStateGetRequest) Parameter(name string, value interface{}) *UpgradePolicyStateGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePolicyStateGetRequest) Header(name string, value interface{}) *UpgradePolicyStateGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePolicyStateGetRequest) Impersonate(user string) *UpgradePolicyStateGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePolicyStateGetRequest) Send() (result *UpgradePolicyStateGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePolicyStateGetRequest) SendContext(ctx context.Context) (result *UpgradePolicyStateGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePolicyStateGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUpgradePolicyStateGetResponse(result, reader) + if err != nil { + return + } + return +} + +// UpgradePolicyStateGetResponse is the response for the 'get' method. +type UpgradePolicyStateGetResponse struct { + status int + header http.Header + err *errors.Error + body *UpgradePolicyState +} + +// Status returns the response status code. +func (r *UpgradePolicyStateGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePolicyStateGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePolicyStateGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *UpgradePolicyStateGetResponse) Body() *UpgradePolicyState { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UpgradePolicyStateGetResponse) GetBody() (value *UpgradePolicyState, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// UpgradePolicyStateUpdateRequest is the request for the 'update' method. +type UpgradePolicyStateUpdateRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *UpgradePolicyState +} + +// Parameter adds a query parameter. +func (r *UpgradePolicyStateUpdateRequest) Parameter(name string, value interface{}) *UpgradePolicyStateUpdateRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UpgradePolicyStateUpdateRequest) Header(name string, value interface{}) *UpgradePolicyStateUpdateRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UpgradePolicyStateUpdateRequest) Impersonate(user string) *UpgradePolicyStateUpdateRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +func (r *UpgradePolicyStateUpdateRequest) Body(value *UpgradePolicyState) *UpgradePolicyStateUpdateRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UpgradePolicyStateUpdateRequest) Send() (result *UpgradePolicyStateUpdateResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UpgradePolicyStateUpdateRequest) SendContext(ctx context.Context) (result *UpgradePolicyStateUpdateResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeUpgradePolicyStateUpdateRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "PATCH", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UpgradePolicyStateUpdateResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUpgradePolicyStateUpdateResponse(result, reader) + if err != nil { + return + } + return +} + +// UpgradePolicyStateUpdateResponse is the response for the 'update' method. +type UpgradePolicyStateUpdateResponse struct { + status int + header http.Header + err *errors.Error + body *UpgradePolicyState +} + +// Status returns the response status code. +func (r *UpgradePolicyStateUpdateResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UpgradePolicyStateUpdateResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UpgradePolicyStateUpdateResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *UpgradePolicyStateUpdateResponse) Body() *UpgradePolicyState { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UpgradePolicyStateUpdateResponse) GetBody() (value *UpgradePolicyState, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_list_builder.go b/clustersmgmt/v2alpha1/upgrade_policy_state_list_builder.go new file mode 100644 index 00000000..b4925997 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UpgradePolicyStateListBuilder contains the data and logic needed to build +// 'upgrade_policy_state' objects. +type UpgradePolicyStateListBuilder struct { + items []*UpgradePolicyStateBuilder +} + +// NewUpgradePolicyStateList creates a new builder of 'upgrade_policy_state' objects. +func NewUpgradePolicyStateList() *UpgradePolicyStateListBuilder { + return new(UpgradePolicyStateListBuilder) +} + +// Items sets the items of the list. +func (b *UpgradePolicyStateListBuilder) Items(values ...*UpgradePolicyStateBuilder) *UpgradePolicyStateListBuilder { + b.items = make([]*UpgradePolicyStateBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *UpgradePolicyStateListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *UpgradePolicyStateListBuilder) Copy(list *UpgradePolicyStateList) *UpgradePolicyStateListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*UpgradePolicyStateBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewUpgradePolicyState().Copy(v) + } + } + return b +} + +// Build creates a list of 'upgrade_policy_state' objects using the +// configuration stored in the builder. +func (b *UpgradePolicyStateListBuilder) Build() (list *UpgradePolicyStateList, err error) { + items := make([]*UpgradePolicyState, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(UpgradePolicyStateList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_list_type_json.go b/clustersmgmt/v2alpha1/upgrade_policy_state_list_type_json.go new file mode 100644 index 00000000..09156fcb --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUpgradePolicyStateList writes a list of values of the 'upgrade_policy_state' type to +// the given writer. +func MarshalUpgradePolicyStateList(list []*UpgradePolicyState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUpgradePolicyStateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUpgradePolicyStateList writes a list of value of the 'upgrade_policy_state' type to +// the given stream. +func writeUpgradePolicyStateList(list []*UpgradePolicyState, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeUpgradePolicyState(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalUpgradePolicyStateList reads a list of values of the 'upgrade_policy_state' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalUpgradePolicyStateList(source interface{}) (items []*UpgradePolicyState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readUpgradePolicyStateList(iterator) + err = iterator.Error + return +} + +// readUpgradePolicyStateList reads list of values of the ”upgrade_policy_state' type from +// the given iterator. +func readUpgradePolicyStateList(iterator *jsoniter.Iterator) []*UpgradePolicyState { + list := []*UpgradePolicyState{} + for iterator.ReadArray() { + item := readUpgradePolicyState(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_resource_json.go b/clustersmgmt/v2alpha1/upgrade_policy_state_resource_json.go new file mode 100644 index 00000000..10f4d400 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_resource_json.go @@ -0,0 +1,39 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeUpgradePolicyStateGetRequest(request *UpgradePolicyStateGetRequest, writer io.Writer) error { + return nil +} +func readUpgradePolicyStateGetResponse(response *UpgradePolicyStateGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUpgradePolicyState(reader) + return err +} +func writeUpgradePolicyStateUpdateRequest(request *UpgradePolicyStateUpdateRequest, writer io.Writer) error { + return MarshalUpgradePolicyState(request.body, writer) +} +func readUpgradePolicyStateUpdateResponse(response *UpgradePolicyStateUpdateResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUpgradePolicyState(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_type.go b/clustersmgmt/v2alpha1/upgrade_policy_state_type.go new file mode 100644 index 00000000..b74f5c13 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_type.go @@ -0,0 +1,268 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UpgradePolicyStateKind is the name of the type used to represent objects +// of type 'upgrade_policy_state'. +const UpgradePolicyStateKind = "UpgradePolicyState" + +// UpgradePolicyStateLinkKind is the name of the type used to represent links +// to objects of type 'upgrade_policy_state'. +const UpgradePolicyStateLinkKind = "UpgradePolicyStateLink" + +// UpgradePolicyStateNilKind is the name of the type used to nil references +// to objects of type 'upgrade_policy_state'. +const UpgradePolicyStateNilKind = "UpgradePolicyStateNil" + +// UpgradePolicyState represents the values of the 'upgrade_policy_state' type. +// +// Representation of an upgrade policy state that that is set for a cluster. +type UpgradePolicyState struct { + bitmap_ uint32 + id string + href string + description string + value UpgradePolicyStateValue +} + +// Kind returns the name of the type of the object. +func (o *UpgradePolicyState) Kind() string { + if o == nil { + return UpgradePolicyStateNilKind + } + if o.bitmap_&1 != 0 { + return UpgradePolicyStateLinkKind + } + return UpgradePolicyStateKind +} + +// Link returns true iif this is a link. +func (o *UpgradePolicyState) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *UpgradePolicyState) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *UpgradePolicyState) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *UpgradePolicyState) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *UpgradePolicyState) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *UpgradePolicyState) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the state. +func (o *UpgradePolicyState) Description() string { + if o != nil && o.bitmap_&8 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the state. +func (o *UpgradePolicyState) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.description + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// State value can be 'pending', 'scheduled', 'cancelled', 'started', 'delayed', +// 'failed' or 'completed'. +func (o *UpgradePolicyState) Value() UpgradePolicyStateValue { + if o != nil && o.bitmap_&16 != 0 { + return o.value + } + return UpgradePolicyStateValue("") +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// State value can be 'pending', 'scheduled', 'cancelled', 'started', 'delayed', +// 'failed' or 'completed'. +func (o *UpgradePolicyState) GetValue() (value UpgradePolicyStateValue, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.value + } + return +} + +// UpgradePolicyStateListKind is the name of the type used to represent list of objects of +// type 'upgrade_policy_state'. +const UpgradePolicyStateListKind = "UpgradePolicyStateList" + +// UpgradePolicyStateListLinkKind is the name of the type used to represent links to list +// of objects of type 'upgrade_policy_state'. +const UpgradePolicyStateListLinkKind = "UpgradePolicyStateListLink" + +// UpgradePolicyStateNilKind is the name of the type used to nil lists of objects of +// type 'upgrade_policy_state'. +const UpgradePolicyStateListNilKind = "UpgradePolicyStateListNil" + +// UpgradePolicyStateList is a list of values of the 'upgrade_policy_state' type. +type UpgradePolicyStateList struct { + href string + link bool + items []*UpgradePolicyState +} + +// Kind returns the name of the type of the object. +func (l *UpgradePolicyStateList) Kind() string { + if l == nil { + return UpgradePolicyStateListNilKind + } + if l.link { + return UpgradePolicyStateListLinkKind + } + return UpgradePolicyStateListKind +} + +// Link returns true iif this is a link. +func (l *UpgradePolicyStateList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *UpgradePolicyStateList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *UpgradePolicyStateList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *UpgradePolicyStateList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *UpgradePolicyStateList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *UpgradePolicyStateList) Get(i int) *UpgradePolicyState { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *UpgradePolicyStateList) Slice() []*UpgradePolicyState { + var slice []*UpgradePolicyState + if l == nil { + slice = make([]*UpgradePolicyState, 0) + } else { + slice = make([]*UpgradePolicyState, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *UpgradePolicyStateList) Each(f func(item *UpgradePolicyState) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *UpgradePolicyStateList) Range(f func(index int, item *UpgradePolicyState) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_type_json.go b/clustersmgmt/v2alpha1/upgrade_policy_state_type_json.go new file mode 100644 index 00000000..798f591c --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_type_json.go @@ -0,0 +1,134 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUpgradePolicyState writes a value of the 'upgrade_policy_state' type to the given writer. +func MarshalUpgradePolicyState(object *UpgradePolicyState, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUpgradePolicyState(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUpgradePolicyState writes a value of the 'upgrade_policy_state' type to the given stream. +func writeUpgradePolicyState(object *UpgradePolicyState, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(UpgradePolicyStateLinkKind) + } else { + stream.WriteString(UpgradePolicyStateKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(string(object.value)) + } + stream.WriteObjectEnd() +} + +// UnmarshalUpgradePolicyState reads a value of the 'upgrade_policy_state' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalUpgradePolicyState(source interface{}) (object *UpgradePolicyState, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readUpgradePolicyState(iterator) + err = iterator.Error + return +} + +// readUpgradePolicyState reads a value of the 'upgrade_policy_state' type from the given iterator. +func readUpgradePolicyState(iterator *jsoniter.Iterator) *UpgradePolicyState { + object := &UpgradePolicyState{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == UpgradePolicyStateLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 8 + case "value": + text := iterator.ReadString() + value := UpgradePolicyStateValue(text) + object.value = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_value_list_type_json.go b/clustersmgmt/v2alpha1/upgrade_policy_state_value_list_type_json.go new file mode 100644 index 00000000..1d551bbc --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_value_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUpgradePolicyStateValueList writes a list of values of the 'upgrade_policy_state_value' type to +// the given writer. +func MarshalUpgradePolicyStateValueList(list []UpgradePolicyStateValue, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUpgradePolicyStateValueList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUpgradePolicyStateValueList writes a list of value of the 'upgrade_policy_state_value' type to +// the given stream. +func writeUpgradePolicyStateValueList(list []UpgradePolicyStateValue, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalUpgradePolicyStateValueList reads a list of values of the 'upgrade_policy_state_value' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalUpgradePolicyStateValueList(source interface{}) (items []UpgradePolicyStateValue, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readUpgradePolicyStateValueList(iterator) + err = iterator.Error + return +} + +// readUpgradePolicyStateValueList reads list of values of the ”upgrade_policy_state_value' type from +// the given iterator. +func readUpgradePolicyStateValueList(iterator *jsoniter.Iterator) []UpgradePolicyStateValue { + list := []UpgradePolicyStateValue{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := UpgradePolicyStateValue(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_state_value_type.go b/clustersmgmt/v2alpha1/upgrade_policy_state_value_type.go new file mode 100644 index 00000000..1bd41973 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_state_value_type.go @@ -0,0 +1,41 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UpgradePolicyStateValue represents the values of the 'upgrade_policy_state_value' enumerated type. +type UpgradePolicyStateValue string + +const ( + // Upgrade got cancelled (temporary state - the policy will get removed). + UpgradePolicyStateValueCancelled UpgradePolicyStateValue = "cancelled" + // Upgrade completed (temporary state - the policy will be removed in case of + // manual upgrade, or move back to pending in case of automatic upgrade) + UpgradePolicyStateValueCompleted UpgradePolicyStateValue = "completed" + // Upgrade is taking longer than expected + UpgradePolicyStateValueDelayed UpgradePolicyStateValue = "delayed" + // Upgrade failed + UpgradePolicyStateValueFailed UpgradePolicyStateValue = "failed" + // Upgrade policy set but an upgrade wasn't scheduled yet + UpgradePolicyStateValuePending UpgradePolicyStateValue = "pending" + // Upgrade policy set and was scheduled + UpgradePolicyStateValueScheduled UpgradePolicyStateValue = "scheduled" + // Upgrade started + UpgradePolicyStateValueStarted UpgradePolicyStateValue = "started" +) diff --git a/clustersmgmt/v2alpha1/upgrade_policy_type.go b/clustersmgmt/v2alpha1/upgrade_policy_type.go new file mode 100644 index 00000000..3abd22cc --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_type.go @@ -0,0 +1,390 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// UpgradePolicyKind is the name of the type used to represent objects +// of type 'upgrade_policy'. +const UpgradePolicyKind = "UpgradePolicy" + +// UpgradePolicyLinkKind is the name of the type used to represent links +// to objects of type 'upgrade_policy'. +const UpgradePolicyLinkKind = "UpgradePolicyLink" + +// UpgradePolicyNilKind is the name of the type used to nil references +// to objects of type 'upgrade_policy'. +const UpgradePolicyNilKind = "UpgradePolicyNil" + +// UpgradePolicy represents the values of the 'upgrade_policy' type. +// +// Representation of an upgrade policy that can be set for a cluster. +type UpgradePolicy struct { + bitmap_ uint32 + id string + href string + clusterID string + nextRun time.Time + schedule string + scheduleType ScheduleType + upgradeType UpgradeType + version string + enableMinorVersionUpgrades bool +} + +// Kind returns the name of the type of the object. +func (o *UpgradePolicy) Kind() string { + if o == nil { + return UpgradePolicyNilKind + } + if o.bitmap_&1 != 0 { + return UpgradePolicyLinkKind + } + return UpgradePolicyKind +} + +// Link returns true iif this is a link. +func (o *UpgradePolicy) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *UpgradePolicy) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *UpgradePolicy) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *UpgradePolicy) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *UpgradePolicy) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *UpgradePolicy) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ClusterID returns the value of the 'cluster_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Cluster ID this upgrade policy is defined for. +func (o *UpgradePolicy) ClusterID() string { + if o != nil && o.bitmap_&8 != 0 { + return o.clusterID + } + return "" +} + +// GetClusterID returns the value of the 'cluster_ID' attribute and +// a flag indicating if the attribute has a value. +// +// Cluster ID this upgrade policy is defined for. +func (o *UpgradePolicy) GetClusterID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.clusterID + } + return +} + +// EnableMinorVersionUpgrades returns the value of the 'enable_minor_version_upgrades' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed). +func (o *UpgradePolicy) EnableMinorVersionUpgrades() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.enableMinorVersionUpgrades + } + return false +} + +// GetEnableMinorVersionUpgrades returns the value of the 'enable_minor_version_upgrades' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed). +func (o *UpgradePolicy) GetEnableMinorVersionUpgrades() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.enableMinorVersionUpgrades + } + return +} + +// NextRun returns the value of the 'next_run' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Next time the upgrade should run. +func (o *UpgradePolicy) NextRun() time.Time { + if o != nil && o.bitmap_&32 != 0 { + return o.nextRun + } + return time.Time{} +} + +// GetNextRun returns the value of the 'next_run' attribute and +// a flag indicating if the attribute has a value. +// +// Next time the upgrade should run. +func (o *UpgradePolicy) GetNextRun() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.nextRun + } + return +} + +// Schedule returns the value of the 'schedule' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *UpgradePolicy) Schedule() string { + if o != nil && o.bitmap_&64 != 0 { + return o.schedule + } + return "" +} + +// GetSchedule returns the value of the 'schedule' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule cron expression that defines automatic upgrade scheduling. +func (o *UpgradePolicy) GetSchedule() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.schedule + } + return +} + +// ScheduleType returns the value of the 'schedule_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Schedule type of the upgrade. +func (o *UpgradePolicy) ScheduleType() ScheduleType { + if o != nil && o.bitmap_&128 != 0 { + return o.scheduleType + } + return ScheduleType("") +} + +// GetScheduleType returns the value of the 'schedule_type' attribute and +// a flag indicating if the attribute has a value. +// +// Schedule type of the upgrade. +func (o *UpgradePolicy) GetScheduleType() (value ScheduleType, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.scheduleType + } + return +} + +// UpgradeType returns the value of the 'upgrade_type' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Upgrade type specify the type of the upgrade. +func (o *UpgradePolicy) UpgradeType() UpgradeType { + if o != nil && o.bitmap_&256 != 0 { + return o.upgradeType + } + return UpgradeType("") +} + +// GetUpgradeType returns the value of the 'upgrade_type' attribute and +// a flag indicating if the attribute has a value. +// +// Upgrade type specify the type of the upgrade. +func (o *UpgradePolicy) GetUpgradeType() (value UpgradeType, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.upgradeType + } + return +} + +// Version returns the value of the 'version' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Version is the desired upgrade version. +func (o *UpgradePolicy) Version() string { + if o != nil && o.bitmap_&512 != 0 { + return o.version + } + return "" +} + +// GetVersion returns the value of the 'version' attribute and +// a flag indicating if the attribute has a value. +// +// Version is the desired upgrade version. +func (o *UpgradePolicy) GetVersion() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.version + } + return +} + +// UpgradePolicyListKind is the name of the type used to represent list of objects of +// type 'upgrade_policy'. +const UpgradePolicyListKind = "UpgradePolicyList" + +// UpgradePolicyListLinkKind is the name of the type used to represent links to list +// of objects of type 'upgrade_policy'. +const UpgradePolicyListLinkKind = "UpgradePolicyListLink" + +// UpgradePolicyNilKind is the name of the type used to nil lists of objects of +// type 'upgrade_policy'. +const UpgradePolicyListNilKind = "UpgradePolicyListNil" + +// UpgradePolicyList is a list of values of the 'upgrade_policy' type. +type UpgradePolicyList struct { + href string + link bool + items []*UpgradePolicy +} + +// Kind returns the name of the type of the object. +func (l *UpgradePolicyList) Kind() string { + if l == nil { + return UpgradePolicyListNilKind + } + if l.link { + return UpgradePolicyListLinkKind + } + return UpgradePolicyListKind +} + +// Link returns true iif this is a link. +func (l *UpgradePolicyList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *UpgradePolicyList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *UpgradePolicyList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *UpgradePolicyList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *UpgradePolicyList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *UpgradePolicyList) Get(i int) *UpgradePolicy { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *UpgradePolicyList) Slice() []*UpgradePolicy { + var slice []*UpgradePolicy + if l == nil { + slice = make([]*UpgradePolicy, 0) + } else { + slice = make([]*UpgradePolicy, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *UpgradePolicyList) Each(f func(item *UpgradePolicy) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *UpgradePolicyList) Range(f func(index int, item *UpgradePolicy) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/upgrade_policy_type_json.go b/clustersmgmt/v2alpha1/upgrade_policy_type_json.go new file mode 100644 index 00000000..f2b3c03b --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_policy_type_json.go @@ -0,0 +1,205 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUpgradePolicy writes a value of the 'upgrade_policy' type to the given writer. +func MarshalUpgradePolicy(object *UpgradePolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUpgradePolicy(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUpgradePolicy writes a value of the 'upgrade_policy' type to the given stream. +func writeUpgradePolicy(object *UpgradePolicy, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(UpgradePolicyLinkKind) + } else { + stream.WriteString(UpgradePolicyKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("cluster_id") + stream.WriteString(object.clusterID) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enable_minor_version_upgrades") + stream.WriteBool(object.enableMinorVersionUpgrades) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("next_run") + stream.WriteString((object.nextRun).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule") + stream.WriteString(object.schedule) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("schedule_type") + stream.WriteString(string(object.scheduleType)) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("upgrade_type") + stream.WriteString(string(object.upgradeType)) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version") + stream.WriteString(object.version) + } + stream.WriteObjectEnd() +} + +// UnmarshalUpgradePolicy reads a value of the 'upgrade_policy' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalUpgradePolicy(source interface{}) (object *UpgradePolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readUpgradePolicy(iterator) + err = iterator.Error + return +} + +// readUpgradePolicy reads a value of the 'upgrade_policy' type from the given iterator. +func readUpgradePolicy(iterator *jsoniter.Iterator) *UpgradePolicy { + object := &UpgradePolicy{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == UpgradePolicyLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "cluster_id": + value := iterator.ReadString() + object.clusterID = value + object.bitmap_ |= 8 + case "enable_minor_version_upgrades": + value := iterator.ReadBool() + object.enableMinorVersionUpgrades = value + object.bitmap_ |= 16 + case "next_run": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.nextRun = value + object.bitmap_ |= 32 + case "schedule": + value := iterator.ReadString() + object.schedule = value + object.bitmap_ |= 64 + case "schedule_type": + text := iterator.ReadString() + value := ScheduleType(text) + object.scheduleType = value + object.bitmap_ |= 128 + case "upgrade_type": + text := iterator.ReadString() + value := UpgradeType(text) + object.upgradeType = value + object.bitmap_ |= 256 + case "version": + value := iterator.ReadString() + object.version = value + object.bitmap_ |= 512 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/upgrade_type_list_type_json.go b/clustersmgmt/v2alpha1/upgrade_type_list_type_json.go new file mode 100644 index 00000000..b3ae4e83 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_type_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUpgradeTypeList writes a list of values of the 'upgrade_type' type to +// the given writer. +func MarshalUpgradeTypeList(list []UpgradeType, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUpgradeTypeList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUpgradeTypeList writes a list of value of the 'upgrade_type' type to +// the given stream. +func writeUpgradeTypeList(list []UpgradeType, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalUpgradeTypeList reads a list of values of the 'upgrade_type' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalUpgradeTypeList(source interface{}) (items []UpgradeType, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readUpgradeTypeList(iterator) + err = iterator.Error + return +} + +// readUpgradeTypeList reads list of values of the ”upgrade_type' type from +// the given iterator. +func readUpgradeTypeList(iterator *jsoniter.Iterator) []UpgradeType { + list := []UpgradeType{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := UpgradeType(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/upgrade_type_type.go b/clustersmgmt/v2alpha1/upgrade_type_type.go new file mode 100644 index 00000000..138e45f9 --- /dev/null +++ b/clustersmgmt/v2alpha1/upgrade_type_type.go @@ -0,0 +1,34 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UpgradeType represents the values of the 'upgrade_type' enumerated type. +type UpgradeType string + +const ( + // Upgrade of OSD cluster, which will upgrade the cluster's control plane, and all the node pools. + UpgradeTypeOSD UpgradeType = "OSD" + // Upgrade of an AddOn + UpgradeTypeAddOn UpgradeType = "ADDON" + // Control plane upgrade, relevant only for hosted control plane clusters. + UpgradeTypeControlPlane UpgradeType = "ControlPlane" + // Node pool upgrade, relevant only for hosted control plane clusters. + UpgradeTypeNodePool UpgradeType = "NodePool" +) diff --git a/clustersmgmt/v2alpha1/user_builder.go b/clustersmgmt/v2alpha1/user_builder.go new file mode 100644 index 00000000..a09de4c8 --- /dev/null +++ b/clustersmgmt/v2alpha1/user_builder.go @@ -0,0 +1,79 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UserBuilder contains the data and logic needed to build 'user' objects. +// +// Representation of a user. +type UserBuilder struct { + bitmap_ uint32 + id string + href string +} + +// NewUser creates a new builder of 'user' objects. +func NewUser() *UserBuilder { + return &UserBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *UserBuilder) Link(value bool) *UserBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *UserBuilder) ID(value string) *UserBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *UserBuilder) HREF(value string) *UserBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *UserBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *UserBuilder) Copy(object *User) *UserBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + return b +} + +// Build creates a 'user' object using the configuration stored in the builder. +func (b *UserBuilder) Build() (object *User, err error) { + object = new(User) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + return +} diff --git a/clustersmgmt/v2alpha1/user_client.go b/clustersmgmt/v2alpha1/user_client.go new file mode 100644 index 00000000..5d420df7 --- /dev/null +++ b/clustersmgmt/v2alpha1/user_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// UserClient is the client of the 'user' resource. +// +// Manages a specific user. +type UserClient struct { + transport http.RoundTripper + path string +} + +// NewUserClient creates a new client for the 'user' +// resource using the given transport to send the requests and receive the +// responses. +func NewUserClient(transport http.RoundTripper, path string) *UserClient { + return &UserClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the user. +func (c *UserClient) Delete() *UserDeleteRequest { + return &UserDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the user. +func (c *UserClient) Get() *UserGetRequest { + return &UserGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// UserPollRequest is the request for the Poll method. +type UserPollRequest struct { + request *UserGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *UserPollRequest) Parameter(name string, value interface{}) *UserPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *UserPollRequest) Header(name string, value interface{}) *UserPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *UserPollRequest) Interval(value time.Duration) *UserPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *UserPollRequest) Status(value int) *UserPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *UserPollRequest) Predicate(value func(*UserGetResponse) bool) *UserPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*UserGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *UserPollRequest) StartContext(ctx context.Context) (response *UserPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &UserPollResponse{ + response: result.(*UserGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *UserPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// UserPollResponse is the response for the Poll method. +type UserPollResponse struct { + response *UserGetResponse +} + +// Status returns the response status code. +func (r *UserPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *UserPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *UserPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *UserPollResponse) Body() *User { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UserPollResponse) GetBody() (value *User, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *UserClient) Poll() *UserPollRequest { + return &UserPollRequest{ + request: c.Get(), + } +} + +// UserDeleteRequest is the request for the 'delete' method. +type UserDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *UserDeleteRequest) Parameter(name string, value interface{}) *UserDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UserDeleteRequest) Header(name string, value interface{}) *UserDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UserDeleteRequest) Impersonate(user string) *UserDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UserDeleteRequest) Send() (result *UserDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UserDeleteRequest) SendContext(ctx context.Context) (result *UserDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UserDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// UserDeleteResponse is the response for the 'delete' method. +type UserDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *UserDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UserDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UserDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// UserGetRequest is the request for the 'get' method. +type UserGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *UserGetRequest) Parameter(name string, value interface{}) *UserGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UserGetRequest) Header(name string, value interface{}) *UserGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UserGetRequest) Impersonate(user string) *UserGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UserGetRequest) Send() (result *UserGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UserGetRequest) SendContext(ctx context.Context) (result *UserGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UserGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUserGetResponse(result, reader) + if err != nil { + return + } + return +} + +// UserGetResponse is the response for the 'get' method. +type UserGetResponse struct { + status int + header http.Header + err *errors.Error + body *User +} + +// Status returns the response status code. +func (r *UserGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UserGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UserGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *UserGetResponse) Body() *User { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *UserGetResponse) GetBody() (value *User, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/user_list_builder.go b/clustersmgmt/v2alpha1/user_list_builder.go new file mode 100644 index 00000000..498301fd --- /dev/null +++ b/clustersmgmt/v2alpha1/user_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UserListBuilder contains the data and logic needed to build +// 'user' objects. +type UserListBuilder struct { + items []*UserBuilder +} + +// NewUserList creates a new builder of 'user' objects. +func NewUserList() *UserListBuilder { + return new(UserListBuilder) +} + +// Items sets the items of the list. +func (b *UserListBuilder) Items(values ...*UserBuilder) *UserListBuilder { + b.items = make([]*UserBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *UserListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *UserListBuilder) Copy(list *UserList) *UserListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*UserBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewUser().Copy(v) + } + } + return b +} + +// Build creates a list of 'user' objects using the +// configuration stored in the builder. +func (b *UserListBuilder) Build() (list *UserList, err error) { + items := make([]*User, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(UserList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/user_list_type_json.go b/clustersmgmt/v2alpha1/user_list_type_json.go new file mode 100644 index 00000000..52301875 --- /dev/null +++ b/clustersmgmt/v2alpha1/user_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUserList writes a list of values of the 'user' type to +// the given writer. +func MarshalUserList(list []*User, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUserList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUserList writes a list of value of the 'user' type to +// the given stream. +func writeUserList(list []*User, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeUser(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalUserList reads a list of values of the 'user' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalUserList(source interface{}) (items []*User, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readUserList(iterator) + err = iterator.Error + return +} + +// readUserList reads list of values of the ”user' type from +// the given iterator. +func readUserList(iterator *jsoniter.Iterator) []*User { + list := []*User{} + for iterator.ReadArray() { + item := readUser(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/user_resource_json.go b/clustersmgmt/v2alpha1/user_resource_json.go new file mode 100644 index 00000000..3e30c580 --- /dev/null +++ b/clustersmgmt/v2alpha1/user_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeUserDeleteRequest(request *UserDeleteRequest, writer io.Writer) error { + return nil +} +func readUserDeleteResponse(response *UserDeleteResponse, reader io.Reader) error { + return nil +} +func writeUserGetRequest(request *UserGetRequest, writer io.Writer) error { + return nil +} +func readUserGetResponse(response *UserGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUser(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/user_type.go b/clustersmgmt/v2alpha1/user_type.go new file mode 100644 index 00000000..d59f5845 --- /dev/null +++ b/clustersmgmt/v2alpha1/user_type.go @@ -0,0 +1,218 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UserKind is the name of the type used to represent objects +// of type 'user'. +const UserKind = "User" + +// UserLinkKind is the name of the type used to represent links +// to objects of type 'user'. +const UserLinkKind = "UserLink" + +// UserNilKind is the name of the type used to nil references +// to objects of type 'user'. +const UserNilKind = "UserNil" + +// User represents the values of the 'user' type. +// +// Representation of a user. +type User struct { + bitmap_ uint32 + id string + href string +} + +// Kind returns the name of the type of the object. +func (o *User) Kind() string { + if o == nil { + return UserNilKind + } + if o.bitmap_&1 != 0 { + return UserLinkKind + } + return UserKind +} + +// Link returns true iif this is a link. +func (o *User) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *User) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *User) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *User) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *User) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *User) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// UserListKind is the name of the type used to represent list of objects of +// type 'user'. +const UserListKind = "UserList" + +// UserListLinkKind is the name of the type used to represent links to list +// of objects of type 'user'. +const UserListLinkKind = "UserListLink" + +// UserNilKind is the name of the type used to nil lists of objects of +// type 'user'. +const UserListNilKind = "UserListNil" + +// UserList is a list of values of the 'user' type. +type UserList struct { + href string + link bool + items []*User +} + +// Kind returns the name of the type of the object. +func (l *UserList) Kind() string { + if l == nil { + return UserListNilKind + } + if l.link { + return UserListLinkKind + } + return UserListKind +} + +// Link returns true iif this is a link. +func (l *UserList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *UserList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *UserList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *UserList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *UserList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *UserList) Get(i int) *User { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *UserList) Slice() []*User { + var slice []*User + if l == nil { + slice = make([]*User, 0) + } else { + slice = make([]*User, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *UserList) Each(f func(item *User) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *UserList) Range(f func(index int, item *User) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/user_type_json.go b/clustersmgmt/v2alpha1/user_type_json.go new file mode 100644 index 00000000..2ee7e7e0 --- /dev/null +++ b/clustersmgmt/v2alpha1/user_type_json.go @@ -0,0 +1,106 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUser writes a value of the 'user' type to the given writer. +func MarshalUser(object *User, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUser(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUser writes a value of the 'user' type to the given stream. +func writeUser(object *User, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(UserLinkKind) + } else { + stream.WriteString(UserKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + } + stream.WriteObjectEnd() +} + +// UnmarshalUser reads a value of the 'user' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalUser(source interface{}) (object *User, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readUser(iterator) + err = iterator.Error + return +} + +// readUser reads a value of the 'user' type from the given iterator. +func readUser(iterator *jsoniter.Iterator) *User { + object := &User{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == UserLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/username_claim_builder.go b/clustersmgmt/v2alpha1/username_claim_builder.go new file mode 100644 index 00000000..12c8e989 --- /dev/null +++ b/clustersmgmt/v2alpha1/username_claim_builder.go @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UsernameClaimBuilder contains the data and logic needed to build 'username_claim' objects. +// +// The username claim mapping. +type UsernameClaimBuilder struct { + bitmap_ uint32 + claim string + prefix string + prefixPolicy string +} + +// NewUsernameClaim creates a new builder of 'username_claim' objects. +func NewUsernameClaim() *UsernameClaimBuilder { + return &UsernameClaimBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *UsernameClaimBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Claim sets the value of the 'claim' attribute to the given value. +func (b *UsernameClaimBuilder) Claim(value string) *UsernameClaimBuilder { + b.claim = value + b.bitmap_ |= 1 + return b +} + +// Prefix sets the value of the 'prefix' attribute to the given value. +func (b *UsernameClaimBuilder) Prefix(value string) *UsernameClaimBuilder { + b.prefix = value + b.bitmap_ |= 2 + return b +} + +// PrefixPolicy sets the value of the 'prefix_policy' attribute to the given value. +func (b *UsernameClaimBuilder) PrefixPolicy(value string) *UsernameClaimBuilder { + b.prefixPolicy = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *UsernameClaimBuilder) Copy(object *UsernameClaim) *UsernameClaimBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.claim = object.claim + b.prefix = object.prefix + b.prefixPolicy = object.prefixPolicy + return b +} + +// Build creates a 'username_claim' object using the configuration stored in the builder. +func (b *UsernameClaimBuilder) Build() (object *UsernameClaim, err error) { + object = new(UsernameClaim) + object.bitmap_ = b.bitmap_ + object.claim = b.claim + object.prefix = b.prefix + object.prefixPolicy = b.prefixPolicy + return +} diff --git a/clustersmgmt/v2alpha1/username_claim_list_builder.go b/clustersmgmt/v2alpha1/username_claim_list_builder.go new file mode 100644 index 00000000..9da2b7e0 --- /dev/null +++ b/clustersmgmt/v2alpha1/username_claim_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UsernameClaimListBuilder contains the data and logic needed to build +// 'username_claim' objects. +type UsernameClaimListBuilder struct { + items []*UsernameClaimBuilder +} + +// NewUsernameClaimList creates a new builder of 'username_claim' objects. +func NewUsernameClaimList() *UsernameClaimListBuilder { + return new(UsernameClaimListBuilder) +} + +// Items sets the items of the list. +func (b *UsernameClaimListBuilder) Items(values ...*UsernameClaimBuilder) *UsernameClaimListBuilder { + b.items = make([]*UsernameClaimBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *UsernameClaimListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *UsernameClaimListBuilder) Copy(list *UsernameClaimList) *UsernameClaimListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*UsernameClaimBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewUsernameClaim().Copy(v) + } + } + return b +} + +// Build creates a list of 'username_claim' objects using the +// configuration stored in the builder. +func (b *UsernameClaimListBuilder) Build() (list *UsernameClaimList, err error) { + items := make([]*UsernameClaim, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(UsernameClaimList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/username_claim_list_type_json.go b/clustersmgmt/v2alpha1/username_claim_list_type_json.go new file mode 100644 index 00000000..8911fda9 --- /dev/null +++ b/clustersmgmt/v2alpha1/username_claim_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUsernameClaimList writes a list of values of the 'username_claim' type to +// the given writer. +func MarshalUsernameClaimList(list []*UsernameClaim, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUsernameClaimList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUsernameClaimList writes a list of value of the 'username_claim' type to +// the given stream. +func writeUsernameClaimList(list []*UsernameClaim, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeUsernameClaim(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalUsernameClaimList reads a list of values of the 'username_claim' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalUsernameClaimList(source interface{}) (items []*UsernameClaim, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readUsernameClaimList(iterator) + err = iterator.Error + return +} + +// readUsernameClaimList reads list of values of the ”username_claim' type from +// the given iterator. +func readUsernameClaimList(iterator *jsoniter.Iterator) []*UsernameClaim { + list := []*UsernameClaim{} + for iterator.ReadArray() { + item := readUsernameClaim(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/username_claim_type.go b/clustersmgmt/v2alpha1/username_claim_type.go new file mode 100644 index 00000000..eb50d72e --- /dev/null +++ b/clustersmgmt/v2alpha1/username_claim_type.go @@ -0,0 +1,200 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// UsernameClaim represents the values of the 'username_claim' type. +// +// The username claim mapping. +type UsernameClaim struct { + bitmap_ uint32 + claim string + prefix string + prefixPolicy string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *UsernameClaim) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Claim returns the value of the 'claim' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The claim used in the token. +func (o *UsernameClaim) Claim() string { + if o != nil && o.bitmap_&1 != 0 { + return o.claim + } + return "" +} + +// GetClaim returns the value of the 'claim' attribute and +// a flag indicating if the attribute has a value. +// +// The claim used in the token. +func (o *UsernameClaim) GetClaim() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.claim + } + return +} + +// Prefix returns the value of the 'prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// A prefix contatenated in the claim (Optional). +func (o *UsernameClaim) Prefix() string { + if o != nil && o.bitmap_&2 != 0 { + return o.prefix + } + return "" +} + +// GetPrefix returns the value of the 'prefix' attribute and +// a flag indicating if the attribute has a value. +// +// A prefix contatenated in the claim (Optional). +func (o *UsernameClaim) GetPrefix() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.prefix + } + return +} + +// PrefixPolicy returns the value of the 'prefix_policy' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// PrefixPolicy specifies how a prefix should apply. +// +// By default, claims other than `email` will be prefixed with the issuer URL to +// prevent naming clashes with other plugins. +// +// Set to "NoPrefix" to disable prefixing. +func (o *UsernameClaim) PrefixPolicy() string { + if o != nil && o.bitmap_&4 != 0 { + return o.prefixPolicy + } + return "" +} + +// GetPrefixPolicy returns the value of the 'prefix_policy' attribute and +// a flag indicating if the attribute has a value. +// +// PrefixPolicy specifies how a prefix should apply. +// +// By default, claims other than `email` will be prefixed with the issuer URL to +// prevent naming clashes with other plugins. +// +// Set to "NoPrefix" to disable prefixing. +func (o *UsernameClaim) GetPrefixPolicy() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.prefixPolicy + } + return +} + +// UsernameClaimListKind is the name of the type used to represent list of objects of +// type 'username_claim'. +const UsernameClaimListKind = "UsernameClaimList" + +// UsernameClaimListLinkKind is the name of the type used to represent links to list +// of objects of type 'username_claim'. +const UsernameClaimListLinkKind = "UsernameClaimListLink" + +// UsernameClaimNilKind is the name of the type used to nil lists of objects of +// type 'username_claim'. +const UsernameClaimListNilKind = "UsernameClaimListNil" + +// UsernameClaimList is a list of values of the 'username_claim' type. +type UsernameClaimList struct { + href string + link bool + items []*UsernameClaim +} + +// Len returns the length of the list. +func (l *UsernameClaimList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *UsernameClaimList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *UsernameClaimList) Get(i int) *UsernameClaim { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *UsernameClaimList) Slice() []*UsernameClaim { + var slice []*UsernameClaim + if l == nil { + slice = make([]*UsernameClaim, 0) + } else { + slice = make([]*UsernameClaim, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *UsernameClaimList) Each(f func(item *UsernameClaim) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *UsernameClaimList) Range(f func(index int, item *UsernameClaim) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/username_claim_type_json.go b/clustersmgmt/v2alpha1/username_claim_type_json.go new file mode 100644 index 00000000..92ed7345 --- /dev/null +++ b/clustersmgmt/v2alpha1/username_claim_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalUsernameClaim writes a value of the 'username_claim' type to the given writer. +func MarshalUsernameClaim(object *UsernameClaim, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeUsernameClaim(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeUsernameClaim writes a value of the 'username_claim' type to the given stream. +func writeUsernameClaim(object *UsernameClaim, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("claim") + stream.WriteString(object.claim) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("prefix") + stream.WriteString(object.prefix) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("prefix_policy") + stream.WriteString(object.prefixPolicy) + } + stream.WriteObjectEnd() +} + +// UnmarshalUsernameClaim reads a value of the 'username_claim' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalUsernameClaim(source interface{}) (object *UsernameClaim, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readUsernameClaim(iterator) + err = iterator.Error + return +} + +// readUsernameClaim reads a value of the 'username_claim' type from the given iterator. +func readUsernameClaim(iterator *jsoniter.Iterator) *UsernameClaim { + object := &UsernameClaim{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "claim": + value := iterator.ReadString() + object.claim = value + object.bitmap_ |= 1 + case "prefix": + value := iterator.ReadString() + object.prefix = value + object.bitmap_ |= 2 + case "prefix_policy": + value := iterator.ReadString() + object.prefixPolicy = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/users_client.go b/clustersmgmt/v2alpha1/users_client.go new file mode 100644 index 00000000..c49d2773 --- /dev/null +++ b/clustersmgmt/v2alpha1/users_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// UsersClient is the client of the 'users' resource. +// +// Manages the collection of users of a group. +type UsersClient struct { + transport http.RoundTripper + path string +} + +// NewUsersClient creates a new client for the 'users' +// resource using the given transport to send the requests and receive the +// responses. +func NewUsersClient(transport http.RoundTripper, path string) *UsersClient { + return &UsersClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new user to the group. +func (c *UsersClient) Add() *UsersAddRequest { + return &UsersAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of users. +func (c *UsersClient) List() *UsersListRequest { + return &UsersListRequest{ + transport: c.transport, + path: c.path, + } +} + +// User returns the target 'user' resource for the given identifier. +// +// Reference to the service that manages an specific user. +func (c *UsersClient) User(id string) *UserClient { + return NewUserClient( + c.transport, + path.Join(c.path, id), + ) +} + +// UsersAddRequest is the request for the 'add' method. +type UsersAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *User +} + +// Parameter adds a query parameter. +func (r *UsersAddRequest) Parameter(name string, value interface{}) *UsersAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UsersAddRequest) Header(name string, value interface{}) *UsersAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UsersAddRequest) Impersonate(user string) *UsersAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the user. +func (r *UsersAddRequest) Body(value *User) *UsersAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UsersAddRequest) Send() (result *UsersAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UsersAddRequest) SendContext(ctx context.Context) (result *UsersAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeUsersAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UsersAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUsersAddResponse(result, reader) + if err != nil { + return + } + return +} + +// UsersAddResponse is the response for the 'add' method. +type UsersAddResponse struct { + status int + header http.Header + err *errors.Error + body *User +} + +// Status returns the response status code. +func (r *UsersAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UsersAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UsersAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the user. +func (r *UsersAddResponse) Body() *User { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the user. +func (r *UsersAddResponse) GetBody() (value *User, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// UsersListRequest is the request for the 'list' method. +type UsersListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *UsersListRequest) Parameter(name string, value interface{}) *UsersListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *UsersListRequest) Header(name string, value interface{}) *UsersListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *UsersListRequest) Impersonate(user string) *UsersListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *UsersListRequest) Page(value int) *UsersListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *UsersListRequest) Size(value int) *UsersListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *UsersListRequest) Send() (result *UsersListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *UsersListRequest) SendContext(ctx context.Context) (result *UsersListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &UsersListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readUsersListResponse(result, reader) + if err != nil { + return + } + return +} + +// UsersListResponse is the response for the 'list' method. +type UsersListResponse struct { + status int + header http.Header + err *errors.Error + items *UserList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *UsersListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *UsersListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *UsersListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of users. +func (r *UsersListResponse) Items() *UserList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of users. +func (r *UsersListResponse) GetItems() (value *UserList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *UsersListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *UsersListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *UsersListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *UsersListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *UsersListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *UsersListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/users_resource_json.go b/clustersmgmt/v2alpha1/users_resource_json.go new file mode 100644 index 00000000..e6a94343 --- /dev/null +++ b/clustersmgmt/v2alpha1/users_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeUsersAddRequest(request *UsersAddRequest, writer io.Writer) error { + return MarshalUser(request.body, writer) +} +func readUsersAddResponse(response *UsersAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalUser(reader) + return err +} +func writeUsersListRequest(request *UsersListRequest, writer io.Writer) error { + return nil +} +func readUsersListResponse(response *UsersListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readUserList(iterator) + response.items = &UserList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/value_builder.go b/clustersmgmt/v2alpha1/value_builder.go new file mode 100644 index 00000000..e134c293 --- /dev/null +++ b/clustersmgmt/v2alpha1/value_builder.go @@ -0,0 +1,90 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ValueBuilder contains the data and logic needed to build 'value' objects. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +type ValueBuilder struct { + bitmap_ uint32 + unit string + value float64 +} + +// NewValue creates a new builder of 'value' objects. +func NewValue() *ValueBuilder { + return &ValueBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *ValueBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Unit sets the value of the 'unit' attribute to the given value. +func (b *ValueBuilder) Unit(value string) *ValueBuilder { + b.unit = value + b.bitmap_ |= 1 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *ValueBuilder) Value(value float64) *ValueBuilder { + b.value = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *ValueBuilder) Copy(object *Value) *ValueBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.unit = object.unit + b.value = object.value + return b +} + +// Build creates a 'value' object using the configuration stored in the builder. +func (b *ValueBuilder) Build() (object *Value, err error) { + object = new(Value) + object.bitmap_ = b.bitmap_ + object.unit = b.unit + object.value = b.value + return +} diff --git a/clustersmgmt/v2alpha1/value_list_builder.go b/clustersmgmt/v2alpha1/value_list_builder.go new file mode 100644 index 00000000..13e7a9b3 --- /dev/null +++ b/clustersmgmt/v2alpha1/value_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// ValueListBuilder contains the data and logic needed to build +// 'value' objects. +type ValueListBuilder struct { + items []*ValueBuilder +} + +// NewValueList creates a new builder of 'value' objects. +func NewValueList() *ValueListBuilder { + return new(ValueListBuilder) +} + +// Items sets the items of the list. +func (b *ValueListBuilder) Items(values ...*ValueBuilder) *ValueListBuilder { + b.items = make([]*ValueBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *ValueListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *ValueListBuilder) Copy(list *ValueList) *ValueListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*ValueBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewValue().Copy(v) + } + } + return b +} + +// Build creates a list of 'value' objects using the +// configuration stored in the builder. +func (b *ValueListBuilder) Build() (list *ValueList, err error) { + items := make([]*Value, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(ValueList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/value_list_type_json.go b/clustersmgmt/v2alpha1/value_list_type_json.go new file mode 100644 index 00000000..abb09219 --- /dev/null +++ b/clustersmgmt/v2alpha1/value_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalValueList writes a list of values of the 'value' type to +// the given writer. +func MarshalValueList(list []*Value, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeValueList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeValueList writes a list of value of the 'value' type to +// the given stream. +func writeValueList(list []*Value, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeValue(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalValueList reads a list of values of the 'value' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalValueList(source interface{}) (items []*Value, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readValueList(iterator) + err = iterator.Error + return +} + +// readValueList reads list of values of the ”value' type from +// the given iterator. +func readValueList(iterator *jsoniter.Iterator) []*Value { + list := []*Value{} + for iterator.ReadArray() { + item := readValue(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/value_type.go b/clustersmgmt/v2alpha1/value_type.go new file mode 100644 index 00000000..fa8165b2 --- /dev/null +++ b/clustersmgmt/v2alpha1/value_type.go @@ -0,0 +1,183 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// Value represents the values of the 'value' type. +// +// Numeric value and the unit used to measure it. +// +// Units are not mandatory, and they're not specified for some resources. For +// resources that use bytes, the accepted units are: +// +// - 1 B = 1 byte +// - 1 KB = 10^3 bytes +// - 1 MB = 10^6 bytes +// - 1 GB = 10^9 bytes +// - 1 TB = 10^12 bytes +// - 1 PB = 10^15 bytes +// +// - 1 B = 1 byte +// - 1 KiB = 2^10 bytes +// - 1 MiB = 2^20 bytes +// - 1 GiB = 2^30 bytes +// - 1 TiB = 2^40 bytes +// - 1 PiB = 2^50 bytes +type Value struct { + bitmap_ uint32 + unit string + value float64 +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Value) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Unit returns the value of the 'unit' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Name of the unit used to measure the value. +func (o *Value) Unit() string { + if o != nil && o.bitmap_&1 != 0 { + return o.unit + } + return "" +} + +// GetUnit returns the value of the 'unit' attribute and +// a flag indicating if the attribute has a value. +// +// Name of the unit used to measure the value. +func (o *Value) GetUnit() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.unit + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Numeric value. +func (o *Value) Value() float64 { + if o != nil && o.bitmap_&2 != 0 { + return o.value + } + return 0.0 +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// Numeric value. +func (o *Value) GetValue() (value float64, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.value + } + return +} + +// ValueListKind is the name of the type used to represent list of objects of +// type 'value'. +const ValueListKind = "ValueList" + +// ValueListLinkKind is the name of the type used to represent links to list +// of objects of type 'value'. +const ValueListLinkKind = "ValueListLink" + +// ValueNilKind is the name of the type used to nil lists of objects of +// type 'value'. +const ValueListNilKind = "ValueListNil" + +// ValueList is a list of values of the 'value' type. +type ValueList struct { + href string + link bool + items []*Value +} + +// Len returns the length of the list. +func (l *ValueList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *ValueList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *ValueList) Get(i int) *Value { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *ValueList) Slice() []*Value { + var slice []*Value + if l == nil { + slice = make([]*Value, 0) + } else { + slice = make([]*Value, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *ValueList) Each(f func(item *Value) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *ValueList) Range(f func(index int, item *Value) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/value_type_json.go b/clustersmgmt/v2alpha1/value_type_json.go new file mode 100644 index 00000000..8c56e619 --- /dev/null +++ b/clustersmgmt/v2alpha1/value_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalValue writes a value of the 'value' type to the given writer. +func MarshalValue(object *Value, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeValue(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeValue writes a value of the 'value' type to the given stream. +func writeValue(object *Value, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("unit") + stream.WriteString(object.unit) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteFloat64(object.value) + } + stream.WriteObjectEnd() +} + +// UnmarshalValue reads a value of the 'value' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalValue(source interface{}) (object *Value, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readValue(iterator) + err = iterator.Error + return +} + +// readValue reads a value of the 'value' type from the given iterator. +func readValue(iterator *jsoniter.Iterator) *Value { + object := &Value{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "unit": + value := iterator.ReadString() + object.unit = value + object.bitmap_ |= 1 + case "value": + value := iterator.ReadFloat64() + object.value = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/version_builder.go b/clustersmgmt/v2alpha1/version_builder.go new file mode 100644 index 00000000..1c46cdd3 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_builder.go @@ -0,0 +1,250 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// VersionBuilder contains the data and logic needed to build 'version' objects. +// +// Representation of an _OpenShift_ version. +type VersionBuilder struct { + bitmap_ uint32 + id string + href string + availableUpgrades []string + channelGroup string + endOfLifeTimestamp time.Time + imageOverrides *ImageOverridesBuilder + rawID string + releaseImage string + releaseImages *ReleaseImagesBuilder + gcpMarketplaceEnabled bool + rosaEnabled bool + default_ bool + enabled bool + hostedControlPlaneDefault bool + hostedControlPlaneEnabled bool +} + +// NewVersion creates a new builder of 'version' objects. +func NewVersion() *VersionBuilder { + return &VersionBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *VersionBuilder) Link(value bool) *VersionBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *VersionBuilder) ID(value string) *VersionBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *VersionBuilder) HREF(value string) *VersionBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *VersionBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// GCPMarketplaceEnabled sets the value of the 'GCP_marketplace_enabled' attribute to the given value. +func (b *VersionBuilder) GCPMarketplaceEnabled(value bool) *VersionBuilder { + b.gcpMarketplaceEnabled = value + b.bitmap_ |= 8 + return b +} + +// ROSAEnabled sets the value of the 'ROSA_enabled' attribute to the given value. +func (b *VersionBuilder) ROSAEnabled(value bool) *VersionBuilder { + b.rosaEnabled = value + b.bitmap_ |= 16 + return b +} + +// AvailableUpgrades sets the value of the 'available_upgrades' attribute to the given values. +func (b *VersionBuilder) AvailableUpgrades(values ...string) *VersionBuilder { + b.availableUpgrades = make([]string, len(values)) + copy(b.availableUpgrades, values) + b.bitmap_ |= 32 + return b +} + +// ChannelGroup sets the value of the 'channel_group' attribute to the given value. +func (b *VersionBuilder) ChannelGroup(value string) *VersionBuilder { + b.channelGroup = value + b.bitmap_ |= 64 + return b +} + +// Default sets the value of the 'default' attribute to the given value. +func (b *VersionBuilder) Default(value bool) *VersionBuilder { + b.default_ = value + b.bitmap_ |= 128 + return b +} + +// Enabled sets the value of the 'enabled' attribute to the given value. +func (b *VersionBuilder) Enabled(value bool) *VersionBuilder { + b.enabled = value + b.bitmap_ |= 256 + return b +} + +// EndOfLifeTimestamp sets the value of the 'end_of_life_timestamp' attribute to the given value. +func (b *VersionBuilder) EndOfLifeTimestamp(value time.Time) *VersionBuilder { + b.endOfLifeTimestamp = value + b.bitmap_ |= 512 + return b +} + +// HostedControlPlaneDefault sets the value of the 'hosted_control_plane_default' attribute to the given value. +func (b *VersionBuilder) HostedControlPlaneDefault(value bool) *VersionBuilder { + b.hostedControlPlaneDefault = value + b.bitmap_ |= 1024 + return b +} + +// HostedControlPlaneEnabled sets the value of the 'hosted_control_plane_enabled' attribute to the given value. +func (b *VersionBuilder) HostedControlPlaneEnabled(value bool) *VersionBuilder { + b.hostedControlPlaneEnabled = value + b.bitmap_ |= 2048 + return b +} + +// ImageOverrides sets the value of the 'image_overrides' attribute to the given value. +// +// ImageOverrides holds the lists of available images per cloud provider. +func (b *VersionBuilder) ImageOverrides(value *ImageOverridesBuilder) *VersionBuilder { + b.imageOverrides = value + if value != nil { + b.bitmap_ |= 4096 + } else { + b.bitmap_ &^= 4096 + } + return b +} + +// RawID sets the value of the 'raw_ID' attribute to the given value. +func (b *VersionBuilder) RawID(value string) *VersionBuilder { + b.rawID = value + b.bitmap_ |= 8192 + return b +} + +// ReleaseImage sets the value of the 'release_image' attribute to the given value. +func (b *VersionBuilder) ReleaseImage(value string) *VersionBuilder { + b.releaseImage = value + b.bitmap_ |= 16384 + return b +} + +// ReleaseImages sets the value of the 'release_images' attribute to the given value. +func (b *VersionBuilder) ReleaseImages(value *ReleaseImagesBuilder) *VersionBuilder { + b.releaseImages = value + if value != nil { + b.bitmap_ |= 32768 + } else { + b.bitmap_ &^= 32768 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *VersionBuilder) Copy(object *Version) *VersionBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.gcpMarketplaceEnabled = object.gcpMarketplaceEnabled + b.rosaEnabled = object.rosaEnabled + if object.availableUpgrades != nil { + b.availableUpgrades = make([]string, len(object.availableUpgrades)) + copy(b.availableUpgrades, object.availableUpgrades) + } else { + b.availableUpgrades = nil + } + b.channelGroup = object.channelGroup + b.default_ = object.default_ + b.enabled = object.enabled + b.endOfLifeTimestamp = object.endOfLifeTimestamp + b.hostedControlPlaneDefault = object.hostedControlPlaneDefault + b.hostedControlPlaneEnabled = object.hostedControlPlaneEnabled + if object.imageOverrides != nil { + b.imageOverrides = NewImageOverrides().Copy(object.imageOverrides) + } else { + b.imageOverrides = nil + } + b.rawID = object.rawID + b.releaseImage = object.releaseImage + if object.releaseImages != nil { + b.releaseImages = NewReleaseImages().Copy(object.releaseImages) + } else { + b.releaseImages = nil + } + return b +} + +// Build creates a 'version' object using the configuration stored in the builder. +func (b *VersionBuilder) Build() (object *Version, err error) { + object = new(Version) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.gcpMarketplaceEnabled = b.gcpMarketplaceEnabled + object.rosaEnabled = b.rosaEnabled + if b.availableUpgrades != nil { + object.availableUpgrades = make([]string, len(b.availableUpgrades)) + copy(object.availableUpgrades, b.availableUpgrades) + } + object.channelGroup = b.channelGroup + object.default_ = b.default_ + object.enabled = b.enabled + object.endOfLifeTimestamp = b.endOfLifeTimestamp + object.hostedControlPlaneDefault = b.hostedControlPlaneDefault + object.hostedControlPlaneEnabled = b.hostedControlPlaneEnabled + if b.imageOverrides != nil { + object.imageOverrides, err = b.imageOverrides.Build() + if err != nil { + return + } + } + object.rawID = b.rawID + object.releaseImage = b.releaseImage + if b.releaseImages != nil { + object.releaseImages, err = b.releaseImages.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/version_client.go b/clustersmgmt/v2alpha1/version_client.go new file mode 100644 index 00000000..c2dad111 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VersionClient is the client of the 'version' resource. +// +// Manages a specific version. +type VersionClient struct { + transport http.RoundTripper + path string +} + +// NewVersionClient creates a new client for the 'version' +// resource using the given transport to send the requests and receive the +// responses. +func NewVersionClient(transport http.RoundTripper, path string) *VersionClient { + return &VersionClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the version. +func (c *VersionClient) Get() *VersionGetRequest { + return &VersionGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// VersionPollRequest is the request for the Poll method. +type VersionPollRequest struct { + request *VersionGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *VersionPollRequest) Parameter(name string, value interface{}) *VersionPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *VersionPollRequest) Header(name string, value interface{}) *VersionPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *VersionPollRequest) Interval(value time.Duration) *VersionPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *VersionPollRequest) Status(value int) *VersionPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *VersionPollRequest) Predicate(value func(*VersionGetResponse) bool) *VersionPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*VersionGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *VersionPollRequest) StartContext(ctx context.Context) (response *VersionPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &VersionPollResponse{ + response: result.(*VersionGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *VersionPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// VersionPollResponse is the response for the Poll method. +type VersionPollResponse struct { + response *VersionGetResponse +} + +// Status returns the response status code. +func (r *VersionPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *VersionPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *VersionPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *VersionPollResponse) Body() *Version { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VersionPollResponse) GetBody() (value *Version, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *VersionClient) Poll() *VersionPollRequest { + return &VersionPollRequest{ + request: c.Get(), + } +} + +// VersionGetRequest is the request for the 'get' method. +type VersionGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *VersionGetRequest) Parameter(name string, value interface{}) *VersionGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGetRequest) Header(name string, value interface{}) *VersionGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGetRequest) Impersonate(user string) *VersionGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGetRequest) Send() (result *VersionGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGetRequest) SendContext(ctx context.Context) (result *VersionGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGetResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGetResponse is the response for the 'get' method. +type VersionGetResponse struct { + status int + header http.Header + err *errors.Error + body *Version +} + +// Status returns the response status code. +func (r *VersionGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *VersionGetResponse) Body() *Version { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VersionGetResponse) GetBody() (value *Version, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_builder.go b/clustersmgmt/v2alpha1/version_gate_agreement_builder.go new file mode 100644 index 00000000..6d6beafd --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_builder.go @@ -0,0 +1,118 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// VersionGateAgreementBuilder contains the data and logic needed to build 'version_gate_agreement' objects. +// +// VersionGateAgreement represents a version gate that the user agreed to for a specific cluster. +type VersionGateAgreementBuilder struct { + bitmap_ uint32 + id string + href string + agreedTimestamp time.Time + versionGate *VersionGateBuilder +} + +// NewVersionGateAgreement creates a new builder of 'version_gate_agreement' objects. +func NewVersionGateAgreement() *VersionGateAgreementBuilder { + return &VersionGateAgreementBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *VersionGateAgreementBuilder) Link(value bool) *VersionGateAgreementBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *VersionGateAgreementBuilder) ID(value string) *VersionGateAgreementBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *VersionGateAgreementBuilder) HREF(value string) *VersionGateAgreementBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *VersionGateAgreementBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// AgreedTimestamp sets the value of the 'agreed_timestamp' attribute to the given value. +func (b *VersionGateAgreementBuilder) AgreedTimestamp(value time.Time) *VersionGateAgreementBuilder { + b.agreedTimestamp = value + b.bitmap_ |= 8 + return b +} + +// VersionGate sets the value of the 'version_gate' attribute to the given value. +// +// Representation of an _OpenShift_ version gate. +func (b *VersionGateAgreementBuilder) VersionGate(value *VersionGateBuilder) *VersionGateAgreementBuilder { + b.versionGate = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *VersionGateAgreementBuilder) Copy(object *VersionGateAgreement) *VersionGateAgreementBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.agreedTimestamp = object.agreedTimestamp + if object.versionGate != nil { + b.versionGate = NewVersionGate().Copy(object.versionGate) + } else { + b.versionGate = nil + } + return b +} + +// Build creates a 'version_gate_agreement' object using the configuration stored in the builder. +func (b *VersionGateAgreementBuilder) Build() (object *VersionGateAgreement, err error) { + object = new(VersionGateAgreement) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.agreedTimestamp = b.agreedTimestamp + if b.versionGate != nil { + object.versionGate, err = b.versionGate.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_client.go b/clustersmgmt/v2alpha1/version_gate_agreement_client.go new file mode 100644 index 00000000..841bd6bc --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VersionGateAgreementClient is the client of the 'version_gate_agreement' resource. +// +// Manages a specific version gate agreement. +type VersionGateAgreementClient struct { + transport http.RoundTripper + path string +} + +// NewVersionGateAgreementClient creates a new client for the 'version_gate_agreement' +// resource using the given transport to send the requests and receive the +// responses. +func NewVersionGateAgreementClient(transport http.RoundTripper, path string) *VersionGateAgreementClient { + return &VersionGateAgreementClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the version gate agreement. +func (c *VersionGateAgreementClient) Delete() *VersionGateAgreementDeleteRequest { + return &VersionGateAgreementDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the version gate agreement. +func (c *VersionGateAgreementClient) Get() *VersionGateAgreementGetRequest { + return &VersionGateAgreementGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// VersionGateAgreementPollRequest is the request for the Poll method. +type VersionGateAgreementPollRequest struct { + request *VersionGateAgreementGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *VersionGateAgreementPollRequest) Parameter(name string, value interface{}) *VersionGateAgreementPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *VersionGateAgreementPollRequest) Header(name string, value interface{}) *VersionGateAgreementPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *VersionGateAgreementPollRequest) Interval(value time.Duration) *VersionGateAgreementPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *VersionGateAgreementPollRequest) Status(value int) *VersionGateAgreementPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *VersionGateAgreementPollRequest) Predicate(value func(*VersionGateAgreementGetResponse) bool) *VersionGateAgreementPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*VersionGateAgreementGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *VersionGateAgreementPollRequest) StartContext(ctx context.Context) (response *VersionGateAgreementPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &VersionGateAgreementPollResponse{ + response: result.(*VersionGateAgreementGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *VersionGateAgreementPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// VersionGateAgreementPollResponse is the response for the Poll method. +type VersionGateAgreementPollResponse struct { + response *VersionGateAgreementGetResponse +} + +// Status returns the response status code. +func (r *VersionGateAgreementPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *VersionGateAgreementPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *VersionGateAgreementPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *VersionGateAgreementPollResponse) Body() *VersionGateAgreement { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VersionGateAgreementPollResponse) GetBody() (value *VersionGateAgreement, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *VersionGateAgreementClient) Poll() *VersionGateAgreementPollRequest { + return &VersionGateAgreementPollRequest{ + request: c.Get(), + } +} + +// VersionGateAgreementDeleteRequest is the request for the 'delete' method. +type VersionGateAgreementDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *VersionGateAgreementDeleteRequest) Parameter(name string, value interface{}) *VersionGateAgreementDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGateAgreementDeleteRequest) Header(name string, value interface{}) *VersionGateAgreementDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGateAgreementDeleteRequest) Impersonate(user string) *VersionGateAgreementDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGateAgreementDeleteRequest) Send() (result *VersionGateAgreementDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGateAgreementDeleteRequest) SendContext(ctx context.Context) (result *VersionGateAgreementDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGateAgreementDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// VersionGateAgreementDeleteResponse is the response for the 'delete' method. +type VersionGateAgreementDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *VersionGateAgreementDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGateAgreementDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGateAgreementDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// VersionGateAgreementGetRequest is the request for the 'get' method. +type VersionGateAgreementGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *VersionGateAgreementGetRequest) Parameter(name string, value interface{}) *VersionGateAgreementGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGateAgreementGetRequest) Header(name string, value interface{}) *VersionGateAgreementGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGateAgreementGetRequest) Impersonate(user string) *VersionGateAgreementGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGateAgreementGetRequest) Send() (result *VersionGateAgreementGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGateAgreementGetRequest) SendContext(ctx context.Context) (result *VersionGateAgreementGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGateAgreementGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGateAgreementGetResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGateAgreementGetResponse is the response for the 'get' method. +type VersionGateAgreementGetResponse struct { + status int + header http.Header + err *errors.Error + body *VersionGateAgreement +} + +// Status returns the response status code. +func (r *VersionGateAgreementGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGateAgreementGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGateAgreementGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *VersionGateAgreementGetResponse) Body() *VersionGateAgreement { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VersionGateAgreementGetResponse) GetBody() (value *VersionGateAgreement, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_list_builder.go b/clustersmgmt/v2alpha1/version_gate_agreement_list_builder.go new file mode 100644 index 00000000..4d013c4e --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// VersionGateAgreementListBuilder contains the data and logic needed to build +// 'version_gate_agreement' objects. +type VersionGateAgreementListBuilder struct { + items []*VersionGateAgreementBuilder +} + +// NewVersionGateAgreementList creates a new builder of 'version_gate_agreement' objects. +func NewVersionGateAgreementList() *VersionGateAgreementListBuilder { + return new(VersionGateAgreementListBuilder) +} + +// Items sets the items of the list. +func (b *VersionGateAgreementListBuilder) Items(values ...*VersionGateAgreementBuilder) *VersionGateAgreementListBuilder { + b.items = make([]*VersionGateAgreementBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *VersionGateAgreementListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *VersionGateAgreementListBuilder) Copy(list *VersionGateAgreementList) *VersionGateAgreementListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*VersionGateAgreementBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewVersionGateAgreement().Copy(v) + } + } + return b +} + +// Build creates a list of 'version_gate_agreement' objects using the +// configuration stored in the builder. +func (b *VersionGateAgreementListBuilder) Build() (list *VersionGateAgreementList, err error) { + items := make([]*VersionGateAgreement, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(VersionGateAgreementList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_list_type_json.go b/clustersmgmt/v2alpha1/version_gate_agreement_list_type_json.go new file mode 100644 index 00000000..7dbe2bce --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalVersionGateAgreementList writes a list of values of the 'version_gate_agreement' type to +// the given writer. +func MarshalVersionGateAgreementList(list []*VersionGateAgreement, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeVersionGateAgreementList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeVersionGateAgreementList writes a list of value of the 'version_gate_agreement' type to +// the given stream. +func writeVersionGateAgreementList(list []*VersionGateAgreement, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeVersionGateAgreement(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalVersionGateAgreementList reads a list of values of the 'version_gate_agreement' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalVersionGateAgreementList(source interface{}) (items []*VersionGateAgreement, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readVersionGateAgreementList(iterator) + err = iterator.Error + return +} + +// readVersionGateAgreementList reads list of values of the ”version_gate_agreement' type from +// the given iterator. +func readVersionGateAgreementList(iterator *jsoniter.Iterator) []*VersionGateAgreement { + list := []*VersionGateAgreement{} + for iterator.ReadArray() { + item := readVersionGateAgreement(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_resource_json.go b/clustersmgmt/v2alpha1/version_gate_agreement_resource_json.go new file mode 100644 index 00000000..80b9bed0 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeVersionGateAgreementDeleteRequest(request *VersionGateAgreementDeleteRequest, writer io.Writer) error { + return nil +} +func readVersionGateAgreementDeleteResponse(response *VersionGateAgreementDeleteResponse, reader io.Reader) error { + return nil +} +func writeVersionGateAgreementGetRequest(request *VersionGateAgreementGetRequest, writer io.Writer) error { + return nil +} +func readVersionGateAgreementGetResponse(response *VersionGateAgreementGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalVersionGateAgreement(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_type.go b/clustersmgmt/v2alpha1/version_gate_agreement_type.go new file mode 100644 index 00000000..3ef74ad9 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_type.go @@ -0,0 +1,270 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// VersionGateAgreementKind is the name of the type used to represent objects +// of type 'version_gate_agreement'. +const VersionGateAgreementKind = "VersionGateAgreement" + +// VersionGateAgreementLinkKind is the name of the type used to represent links +// to objects of type 'version_gate_agreement'. +const VersionGateAgreementLinkKind = "VersionGateAgreementLink" + +// VersionGateAgreementNilKind is the name of the type used to nil references +// to objects of type 'version_gate_agreement'. +const VersionGateAgreementNilKind = "VersionGateAgreementNil" + +// VersionGateAgreement represents the values of the 'version_gate_agreement' type. +// +// VersionGateAgreement represents a version gate that the user agreed to for a specific cluster. +type VersionGateAgreement struct { + bitmap_ uint32 + id string + href string + agreedTimestamp time.Time + versionGate *VersionGate +} + +// Kind returns the name of the type of the object. +func (o *VersionGateAgreement) Kind() string { + if o == nil { + return VersionGateAgreementNilKind + } + if o.bitmap_&1 != 0 { + return VersionGateAgreementLinkKind + } + return VersionGateAgreementKind +} + +// Link returns true iif this is a link. +func (o *VersionGateAgreement) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *VersionGateAgreement) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *VersionGateAgreement) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *VersionGateAgreement) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *VersionGateAgreement) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *VersionGateAgreement) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// AgreedTimestamp returns the value of the 'agreed_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The time the user agreed to the version gate +func (o *VersionGateAgreement) AgreedTimestamp() time.Time { + if o != nil && o.bitmap_&8 != 0 { + return o.agreedTimestamp + } + return time.Time{} +} + +// GetAgreedTimestamp returns the value of the 'agreed_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// The time the user agreed to the version gate +func (o *VersionGateAgreement) GetAgreedTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.agreedTimestamp + } + return +} + +// VersionGate returns the value of the 'version_gate' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// link to the version gate that the user agreed to +func (o *VersionGateAgreement) VersionGate() *VersionGate { + if o != nil && o.bitmap_&16 != 0 { + return o.versionGate + } + return nil +} + +// GetVersionGate returns the value of the 'version_gate' attribute and +// a flag indicating if the attribute has a value. +// +// link to the version gate that the user agreed to +func (o *VersionGateAgreement) GetVersionGate() (value *VersionGate, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.versionGate + } + return +} + +// VersionGateAgreementListKind is the name of the type used to represent list of objects of +// type 'version_gate_agreement'. +const VersionGateAgreementListKind = "VersionGateAgreementList" + +// VersionGateAgreementListLinkKind is the name of the type used to represent links to list +// of objects of type 'version_gate_agreement'. +const VersionGateAgreementListLinkKind = "VersionGateAgreementListLink" + +// VersionGateAgreementNilKind is the name of the type used to nil lists of objects of +// type 'version_gate_agreement'. +const VersionGateAgreementListNilKind = "VersionGateAgreementListNil" + +// VersionGateAgreementList is a list of values of the 'version_gate_agreement' type. +type VersionGateAgreementList struct { + href string + link bool + items []*VersionGateAgreement +} + +// Kind returns the name of the type of the object. +func (l *VersionGateAgreementList) Kind() string { + if l == nil { + return VersionGateAgreementListNilKind + } + if l.link { + return VersionGateAgreementListLinkKind + } + return VersionGateAgreementListKind +} + +// Link returns true iif this is a link. +func (l *VersionGateAgreementList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *VersionGateAgreementList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *VersionGateAgreementList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *VersionGateAgreementList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *VersionGateAgreementList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *VersionGateAgreementList) Get(i int) *VersionGateAgreement { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *VersionGateAgreementList) Slice() []*VersionGateAgreement { + var slice []*VersionGateAgreement + if l == nil { + slice = make([]*VersionGateAgreement, 0) + } else { + slice = make([]*VersionGateAgreement, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *VersionGateAgreementList) Each(f func(item *VersionGateAgreement) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *VersionGateAgreementList) Range(f func(index int, item *VersionGateAgreement) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreement_type_json.go b/clustersmgmt/v2alpha1/version_gate_agreement_type_json.go new file mode 100644 index 00000000..eb3f3d42 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreement_type_json.go @@ -0,0 +1,138 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalVersionGateAgreement writes a value of the 'version_gate_agreement' type to the given writer. +func MarshalVersionGateAgreement(object *VersionGateAgreement, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeVersionGateAgreement(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeVersionGateAgreement writes a value of the 'version_gate_agreement' type to the given stream. +func writeVersionGateAgreement(object *VersionGateAgreement, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(VersionGateAgreementLinkKind) + } else { + stream.WriteString(VersionGateAgreementKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("agreed_timestamp") + stream.WriteString((object.agreedTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&16 != 0 && object.versionGate != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version_gate") + writeVersionGate(object.versionGate, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalVersionGateAgreement reads a value of the 'version_gate_agreement' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalVersionGateAgreement(source interface{}) (object *VersionGateAgreement, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readVersionGateAgreement(iterator) + err = iterator.Error + return +} + +// readVersionGateAgreement reads a value of the 'version_gate_agreement' type from the given iterator. +func readVersionGateAgreement(iterator *jsoniter.Iterator) *VersionGateAgreement { + object := &VersionGateAgreement{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == VersionGateAgreementLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "agreed_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.agreedTimestamp = value + object.bitmap_ |= 8 + case "version_gate": + value := readVersionGate(iterator) + object.versionGate = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreements_client.go b/clustersmgmt/v2alpha1/version_gate_agreements_client.go new file mode 100644 index 00000000..d37017f0 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreements_client.go @@ -0,0 +1,457 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VersionGateAgreementsClient is the client of the 'version_gate_agreements' resource. +// +// Manages the collection of version gates agreements for a cluster. +type VersionGateAgreementsClient struct { + transport http.RoundTripper + path string +} + +// NewVersionGateAgreementsClient creates a new client for the 'version_gate_agreements' +// resource using the given transport to send the requests and receive the +// responses. +func NewVersionGateAgreementsClient(transport http.RoundTripper, path string) *VersionGateAgreementsClient { + return &VersionGateAgreementsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new agreed version gate to the cluster. +func (c *VersionGateAgreementsClient) Add() *VersionGateAgreementsAddRequest { + return &VersionGateAgreementsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of reasons. +func (c *VersionGateAgreementsClient) List() *VersionGateAgreementsListRequest { + return &VersionGateAgreementsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// VersionGateAgreement returns the target 'version_gate_agreement' resource for the given identifier. +// +// Reference to the service that manages a specific version gate agreement. +func (c *VersionGateAgreementsClient) VersionGateAgreement(id string) *VersionGateAgreementClient { + return NewVersionGateAgreementClient( + c.transport, + path.Join(c.path, id), + ) +} + +// VersionGateAgreementsAddRequest is the request for the 'add' method. +type VersionGateAgreementsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *VersionGateAgreement +} + +// Parameter adds a query parameter. +func (r *VersionGateAgreementsAddRequest) Parameter(name string, value interface{}) *VersionGateAgreementsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGateAgreementsAddRequest) Header(name string, value interface{}) *VersionGateAgreementsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGateAgreementsAddRequest) Impersonate(user string) *VersionGateAgreementsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Details of the version gate agreement. +func (r *VersionGateAgreementsAddRequest) Body(value *VersionGateAgreement) *VersionGateAgreementsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGateAgreementsAddRequest) Send() (result *VersionGateAgreementsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGateAgreementsAddRequest) SendContext(ctx context.Context) (result *VersionGateAgreementsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeVersionGateAgreementsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGateAgreementsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGateAgreementsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGateAgreementsAddResponse is the response for the 'add' method. +type VersionGateAgreementsAddResponse struct { + status int + header http.Header + err *errors.Error + body *VersionGateAgreement +} + +// Status returns the response status code. +func (r *VersionGateAgreementsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGateAgreementsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGateAgreementsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Details of the version gate agreement. +func (r *VersionGateAgreementsAddResponse) Body() *VersionGateAgreement { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Details of the version gate agreement. +func (r *VersionGateAgreementsAddResponse) GetBody() (value *VersionGateAgreement, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// VersionGateAgreementsListRequest is the request for the 'list' method. +type VersionGateAgreementsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *VersionGateAgreementsListRequest) Parameter(name string, value interface{}) *VersionGateAgreementsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGateAgreementsListRequest) Header(name string, value interface{}) *VersionGateAgreementsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGateAgreementsListRequest) Impersonate(user string) *VersionGateAgreementsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionGateAgreementsListRequest) Page(value int) *VersionGateAgreementsListRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *VersionGateAgreementsListRequest) Size(value int) *VersionGateAgreementsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGateAgreementsListRequest) Send() (result *VersionGateAgreementsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGateAgreementsListRequest) SendContext(ctx context.Context) (result *VersionGateAgreementsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGateAgreementsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGateAgreementsListResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGateAgreementsListResponse is the response for the 'list' method. +type VersionGateAgreementsListResponse struct { + status int + header http.Header + err *errors.Error + items *VersionGateAgreementList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *VersionGateAgreementsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGateAgreementsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGateAgreementsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of version gate agreement. +func (r *VersionGateAgreementsListResponse) Items() *VersionGateAgreementList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of version gate agreement. +func (r *VersionGateAgreementsListResponse) GetItems() (value *VersionGateAgreementList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionGateAgreementsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionGateAgreementsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items contained in the returned page. +func (r *VersionGateAgreementsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items contained in the returned page. +func (r *VersionGateAgreementsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection. +func (r *VersionGateAgreementsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection. +func (r *VersionGateAgreementsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_agreements_resource_json.go b/clustersmgmt/v2alpha1/version_gate_agreements_resource_json.go new file mode 100644 index 00000000..5e064826 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_agreements_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeVersionGateAgreementsAddRequest(request *VersionGateAgreementsAddRequest, writer io.Writer) error { + return MarshalVersionGateAgreement(request.body, writer) +} +func readVersionGateAgreementsAddResponse(response *VersionGateAgreementsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalVersionGateAgreement(reader) + return err +} +func writeVersionGateAgreementsListRequest(request *VersionGateAgreementsListRequest, writer io.Writer) error { + return nil +} +func readVersionGateAgreementsListResponse(response *VersionGateAgreementsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readVersionGateAgreementList(iterator) + response.items = &VersionGateAgreementList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/version_gate_builder.go b/clustersmgmt/v2alpha1/version_gate_builder.go new file mode 100644 index 00000000..c0747602 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_builder.go @@ -0,0 +1,163 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// VersionGateBuilder contains the data and logic needed to build 'version_gate' objects. +// +// Representation of an _OpenShift_ version gate. +type VersionGateBuilder struct { + bitmap_ uint32 + id string + href string + creationTimestamp time.Time + description string + documentationURL string + label string + value string + versionRawIDPrefix string + warningMessage string + stsOnly bool +} + +// NewVersionGate creates a new builder of 'version_gate' objects. +func NewVersionGate() *VersionGateBuilder { + return &VersionGateBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *VersionGateBuilder) Link(value bool) *VersionGateBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *VersionGateBuilder) ID(value string) *VersionGateBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *VersionGateBuilder) HREF(value string) *VersionGateBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *VersionGateBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// STSOnly sets the value of the 'STS_only' attribute to the given value. +func (b *VersionGateBuilder) STSOnly(value bool) *VersionGateBuilder { + b.stsOnly = value + b.bitmap_ |= 8 + return b +} + +// CreationTimestamp sets the value of the 'creation_timestamp' attribute to the given value. +func (b *VersionGateBuilder) CreationTimestamp(value time.Time) *VersionGateBuilder { + b.creationTimestamp = value + b.bitmap_ |= 16 + return b +} + +// Description sets the value of the 'description' attribute to the given value. +func (b *VersionGateBuilder) Description(value string) *VersionGateBuilder { + b.description = value + b.bitmap_ |= 32 + return b +} + +// DocumentationURL sets the value of the 'documentation_URL' attribute to the given value. +func (b *VersionGateBuilder) DocumentationURL(value string) *VersionGateBuilder { + b.documentationURL = value + b.bitmap_ |= 64 + return b +} + +// Label sets the value of the 'label' attribute to the given value. +func (b *VersionGateBuilder) Label(value string) *VersionGateBuilder { + b.label = value + b.bitmap_ |= 128 + return b +} + +// Value sets the value of the 'value' attribute to the given value. +func (b *VersionGateBuilder) Value(value string) *VersionGateBuilder { + b.value = value + b.bitmap_ |= 256 + return b +} + +// VersionRawIDPrefix sets the value of the 'version_raw_ID_prefix' attribute to the given value. +func (b *VersionGateBuilder) VersionRawIDPrefix(value string) *VersionGateBuilder { + b.versionRawIDPrefix = value + b.bitmap_ |= 512 + return b +} + +// WarningMessage sets the value of the 'warning_message' attribute to the given value. +func (b *VersionGateBuilder) WarningMessage(value string) *VersionGateBuilder { + b.warningMessage = value + b.bitmap_ |= 1024 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *VersionGateBuilder) Copy(object *VersionGate) *VersionGateBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.stsOnly = object.stsOnly + b.creationTimestamp = object.creationTimestamp + b.description = object.description + b.documentationURL = object.documentationURL + b.label = object.label + b.value = object.value + b.versionRawIDPrefix = object.versionRawIDPrefix + b.warningMessage = object.warningMessage + return b +} + +// Build creates a 'version_gate' object using the configuration stored in the builder. +func (b *VersionGateBuilder) Build() (object *VersionGate, err error) { + object = new(VersionGate) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.stsOnly = b.stsOnly + object.creationTimestamp = b.creationTimestamp + object.description = b.description + object.documentationURL = b.documentationURL + object.label = b.label + object.value = b.value + object.versionRawIDPrefix = b.versionRawIDPrefix + object.warningMessage = b.warningMessage + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_client.go b/clustersmgmt/v2alpha1/version_gate_client.go new file mode 100644 index 00000000..1fc6fbd8 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_client.go @@ -0,0 +1,424 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VersionGateClient is the client of the 'version_gate' resource. +// +// Manages a specific version gate. +type VersionGateClient struct { + transport http.RoundTripper + path string +} + +// NewVersionGateClient creates a new client for the 'version_gate' +// resource using the given transport to send the requests and receive the +// responses. +func NewVersionGateClient(transport http.RoundTripper, path string) *VersionGateClient { + return &VersionGateClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the version gate. +func (c *VersionGateClient) Delete() *VersionGateDeleteRequest { + return &VersionGateDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the version gate. +func (c *VersionGateClient) Get() *VersionGateGetRequest { + return &VersionGateGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// VersionGatePollRequest is the request for the Poll method. +type VersionGatePollRequest struct { + request *VersionGateGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *VersionGatePollRequest) Parameter(name string, value interface{}) *VersionGatePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *VersionGatePollRequest) Header(name string, value interface{}) *VersionGatePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *VersionGatePollRequest) Interval(value time.Duration) *VersionGatePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *VersionGatePollRequest) Status(value int) *VersionGatePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *VersionGatePollRequest) Predicate(value func(*VersionGateGetResponse) bool) *VersionGatePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*VersionGateGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *VersionGatePollRequest) StartContext(ctx context.Context) (response *VersionGatePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &VersionGatePollResponse{ + response: result.(*VersionGateGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *VersionGatePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// VersionGatePollResponse is the response for the Poll method. +type VersionGatePollResponse struct { + response *VersionGateGetResponse +} + +// Status returns the response status code. +func (r *VersionGatePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *VersionGatePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *VersionGatePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *VersionGatePollResponse) Body() *VersionGate { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VersionGatePollResponse) GetBody() (value *VersionGate, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *VersionGateClient) Poll() *VersionGatePollRequest { + return &VersionGatePollRequest{ + request: c.Get(), + } +} + +// VersionGateDeleteRequest is the request for the 'delete' method. +type VersionGateDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *VersionGateDeleteRequest) Parameter(name string, value interface{}) *VersionGateDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGateDeleteRequest) Header(name string, value interface{}) *VersionGateDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGateDeleteRequest) Impersonate(user string) *VersionGateDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGateDeleteRequest) Send() (result *VersionGateDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGateDeleteRequest) SendContext(ctx context.Context) (result *VersionGateDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGateDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// VersionGateDeleteResponse is the response for the 'delete' method. +type VersionGateDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *VersionGateDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGateDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGateDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// VersionGateGetRequest is the request for the 'get' method. +type VersionGateGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *VersionGateGetRequest) Parameter(name string, value interface{}) *VersionGateGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGateGetRequest) Header(name string, value interface{}) *VersionGateGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGateGetRequest) Impersonate(user string) *VersionGateGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGateGetRequest) Send() (result *VersionGateGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGateGetRequest) SendContext(ctx context.Context) (result *VersionGateGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGateGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGateGetResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGateGetResponse is the response for the 'get' method. +type VersionGateGetResponse struct { + status int + header http.Header + err *errors.Error + body *VersionGate +} + +// Status returns the response status code. +func (r *VersionGateGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGateGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGateGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *VersionGateGetResponse) Body() *VersionGate { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VersionGateGetResponse) GetBody() (value *VersionGate, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_list_builder.go b/clustersmgmt/v2alpha1/version_gate_list_builder.go new file mode 100644 index 00000000..b6cd0d93 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// VersionGateListBuilder contains the data and logic needed to build +// 'version_gate' objects. +type VersionGateListBuilder struct { + items []*VersionGateBuilder +} + +// NewVersionGateList creates a new builder of 'version_gate' objects. +func NewVersionGateList() *VersionGateListBuilder { + return new(VersionGateListBuilder) +} + +// Items sets the items of the list. +func (b *VersionGateListBuilder) Items(values ...*VersionGateBuilder) *VersionGateListBuilder { + b.items = make([]*VersionGateBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *VersionGateListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *VersionGateListBuilder) Copy(list *VersionGateList) *VersionGateListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*VersionGateBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewVersionGate().Copy(v) + } + } + return b +} + +// Build creates a list of 'version_gate' objects using the +// configuration stored in the builder. +func (b *VersionGateListBuilder) Build() (list *VersionGateList, err error) { + items := make([]*VersionGate, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(VersionGateList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/version_gate_list_type_json.go b/clustersmgmt/v2alpha1/version_gate_list_type_json.go new file mode 100644 index 00000000..40e645ee --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalVersionGateList writes a list of values of the 'version_gate' type to +// the given writer. +func MarshalVersionGateList(list []*VersionGate, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeVersionGateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeVersionGateList writes a list of value of the 'version_gate' type to +// the given stream. +func writeVersionGateList(list []*VersionGate, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeVersionGate(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalVersionGateList reads a list of values of the 'version_gate' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalVersionGateList(source interface{}) (items []*VersionGate, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readVersionGateList(iterator) + err = iterator.Error + return +} + +// readVersionGateList reads list of values of the ”version_gate' type from +// the given iterator. +func readVersionGateList(iterator *jsoniter.Iterator) []*VersionGate { + list := []*VersionGate{} + for iterator.ReadArray() { + item := readVersionGate(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/version_gate_resource_json.go b/clustersmgmt/v2alpha1/version_gate_resource_json.go new file mode 100644 index 00000000..6c53f181 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeVersionGateDeleteRequest(request *VersionGateDeleteRequest, writer io.Writer) error { + return nil +} +func readVersionGateDeleteResponse(response *VersionGateDeleteResponse, reader io.Reader) error { + return nil +} +func writeVersionGateGetRequest(request *VersionGateGetRequest, writer io.Writer) error { + return nil +} +func readVersionGateGetResponse(response *VersionGateGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalVersionGate(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/version_gate_type.go b/clustersmgmt/v2alpha1/version_gate_type.go new file mode 100644 index 00000000..8b7c5f79 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_type.go @@ -0,0 +1,416 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// VersionGateKind is the name of the type used to represent objects +// of type 'version_gate'. +const VersionGateKind = "VersionGate" + +// VersionGateLinkKind is the name of the type used to represent links +// to objects of type 'version_gate'. +const VersionGateLinkKind = "VersionGateLink" + +// VersionGateNilKind is the name of the type used to nil references +// to objects of type 'version_gate'. +const VersionGateNilKind = "VersionGateNil" + +// VersionGate represents the values of the 'version_gate' type. +// +// Representation of an _OpenShift_ version gate. +type VersionGate struct { + bitmap_ uint32 + id string + href string + creationTimestamp time.Time + description string + documentationURL string + label string + value string + versionRawIDPrefix string + warningMessage string + stsOnly bool +} + +// Kind returns the name of the type of the object. +func (o *VersionGate) Kind() string { + if o == nil { + return VersionGateNilKind + } + if o.bitmap_&1 != 0 { + return VersionGateLinkKind + } + return VersionGateKind +} + +// Link returns true iif this is a link. +func (o *VersionGate) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *VersionGate) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *VersionGate) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *VersionGate) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *VersionGate) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *VersionGate) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// STSOnly returns the value of the 'STS_only' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// STSOnly indicates if this version gate is for STS clusters only +func (o *VersionGate) STSOnly() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.stsOnly + } + return false +} + +// GetSTSOnly returns the value of the 'STS_only' attribute and +// a flag indicating if the attribute has a value. +// +// STSOnly indicates if this version gate is for STS clusters only +func (o *VersionGate) GetSTSOnly() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.stsOnly + } + return +} + +// CreationTimestamp returns the value of the 'creation_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// CreationTimestamp is the date and time when the version gate was created, +// format defined in https://www.ietf.org/rfc/rfc3339.txt[RC3339]. +func (o *VersionGate) CreationTimestamp() time.Time { + if o != nil && o.bitmap_&16 != 0 { + return o.creationTimestamp + } + return time.Time{} +} + +// GetCreationTimestamp returns the value of the 'creation_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// CreationTimestamp is the date and time when the version gate was created, +// format defined in https://www.ietf.org/rfc/rfc3339.txt[RC3339]. +func (o *VersionGate) GetCreationTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.creationTimestamp + } + return +} + +// Description returns the value of the 'description' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Description of the version gate. +func (o *VersionGate) Description() string { + if o != nil && o.bitmap_&32 != 0 { + return o.description + } + return "" +} + +// GetDescription returns the value of the 'description' attribute and +// a flag indicating if the attribute has a value. +// +// Description of the version gate. +func (o *VersionGate) GetDescription() (value string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.description + } + return +} + +// DocumentationURL returns the value of the 'documentation_URL' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// DocumentationURL is the URL for the documentation of the version gate. +func (o *VersionGate) DocumentationURL() string { + if o != nil && o.bitmap_&64 != 0 { + return o.documentationURL + } + return "" +} + +// GetDocumentationURL returns the value of the 'documentation_URL' attribute and +// a flag indicating if the attribute has a value. +// +// DocumentationURL is the URL for the documentation of the version gate. +func (o *VersionGate) GetDocumentationURL() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.documentationURL + } + return +} + +// Label returns the value of the 'label' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Label representing the version gate in OpenShift. +func (o *VersionGate) Label() string { + if o != nil && o.bitmap_&128 != 0 { + return o.label + } + return "" +} + +// GetLabel returns the value of the 'label' attribute and +// a flag indicating if the attribute has a value. +// +// Label representing the version gate in OpenShift. +func (o *VersionGate) GetLabel() (value string, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.label + } + return +} + +// Value returns the value of the 'value' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Value represents the required value of the label. +func (o *VersionGate) Value() string { + if o != nil && o.bitmap_&256 != 0 { + return o.value + } + return "" +} + +// GetValue returns the value of the 'value' attribute and +// a flag indicating if the attribute has a value. +// +// Value represents the required value of the label. +func (o *VersionGate) GetValue() (value string, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.value + } + return +} + +// VersionRawIDPrefix returns the value of the 'version_raw_ID_prefix' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// VersionRawIDPrefix represents the versions prefix that the gate applies to. +func (o *VersionGate) VersionRawIDPrefix() string { + if o != nil && o.bitmap_&512 != 0 { + return o.versionRawIDPrefix + } + return "" +} + +// GetVersionRawIDPrefix returns the value of the 'version_raw_ID_prefix' attribute and +// a flag indicating if the attribute has a value. +// +// VersionRawIDPrefix represents the versions prefix that the gate applies to. +func (o *VersionGate) GetVersionRawIDPrefix() (value string, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.versionRawIDPrefix + } + return +} + +// WarningMessage returns the value of the 'warning_message' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// WarningMessage is a warning that will be displayed to the user before they acknowledge the gate +func (o *VersionGate) WarningMessage() string { + if o != nil && o.bitmap_&1024 != 0 { + return o.warningMessage + } + return "" +} + +// GetWarningMessage returns the value of the 'warning_message' attribute and +// a flag indicating if the attribute has a value. +// +// WarningMessage is a warning that will be displayed to the user before they acknowledge the gate +func (o *VersionGate) GetWarningMessage() (value string, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.warningMessage + } + return +} + +// VersionGateListKind is the name of the type used to represent list of objects of +// type 'version_gate'. +const VersionGateListKind = "VersionGateList" + +// VersionGateListLinkKind is the name of the type used to represent links to list +// of objects of type 'version_gate'. +const VersionGateListLinkKind = "VersionGateListLink" + +// VersionGateNilKind is the name of the type used to nil lists of objects of +// type 'version_gate'. +const VersionGateListNilKind = "VersionGateListNil" + +// VersionGateList is a list of values of the 'version_gate' type. +type VersionGateList struct { + href string + link bool + items []*VersionGate +} + +// Kind returns the name of the type of the object. +func (l *VersionGateList) Kind() string { + if l == nil { + return VersionGateListNilKind + } + if l.link { + return VersionGateListLinkKind + } + return VersionGateListKind +} + +// Link returns true iif this is a link. +func (l *VersionGateList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *VersionGateList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *VersionGateList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *VersionGateList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *VersionGateList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *VersionGateList) Get(i int) *VersionGate { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *VersionGateList) Slice() []*VersionGate { + var slice []*VersionGate + if l == nil { + slice = make([]*VersionGate, 0) + } else { + slice = make([]*VersionGate, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *VersionGateList) Each(f func(item *VersionGate) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *VersionGateList) Range(f func(index int, item *VersionGate) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/version_gate_type_json.go b/clustersmgmt/v2alpha1/version_gate_type_json.go new file mode 100644 index 00000000..c7a404a7 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gate_type_json.go @@ -0,0 +1,216 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalVersionGate writes a value of the 'version_gate' type to the given writer. +func MarshalVersionGate(object *VersionGate, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeVersionGate(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeVersionGate writes a value of the 'version_gate' type to the given stream. +func writeVersionGate(object *VersionGate, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(VersionGateLinkKind) + } else { + stream.WriteString(VersionGateKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("sts_only") + stream.WriteBool(object.stsOnly) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("creation_timestamp") + stream.WriteString((object.creationTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&32 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("description") + stream.WriteString(object.description) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("documentation_url") + stream.WriteString(object.documentationURL) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("label") + stream.WriteString(object.label) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("value") + stream.WriteString(object.value) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("version_raw_id_prefix") + stream.WriteString(object.versionRawIDPrefix) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("warning_message") + stream.WriteString(object.warningMessage) + } + stream.WriteObjectEnd() +} + +// UnmarshalVersionGate reads a value of the 'version_gate' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalVersionGate(source interface{}) (object *VersionGate, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readVersionGate(iterator) + err = iterator.Error + return +} + +// readVersionGate reads a value of the 'version_gate' type from the given iterator. +func readVersionGate(iterator *jsoniter.Iterator) *VersionGate { + object := &VersionGate{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == VersionGateLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "sts_only": + value := iterator.ReadBool() + object.stsOnly = value + object.bitmap_ |= 8 + case "creation_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.creationTimestamp = value + object.bitmap_ |= 16 + case "description": + value := iterator.ReadString() + object.description = value + object.bitmap_ |= 32 + case "documentation_url": + value := iterator.ReadString() + object.documentationURL = value + object.bitmap_ |= 64 + case "label": + value := iterator.ReadString() + object.label = value + object.bitmap_ |= 128 + case "value": + value := iterator.ReadString() + object.value = value + object.bitmap_ |= 256 + case "version_raw_id_prefix": + value := iterator.ReadString() + object.versionRawIDPrefix = value + object.bitmap_ |= 512 + case "warning_message": + value := iterator.ReadString() + object.warningMessage = value + object.bitmap_ |= 1024 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/version_gates_client.go b/clustersmgmt/v2alpha1/version_gates_client.go new file mode 100644 index 00000000..9900d5ce --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gates_client.go @@ -0,0 +1,508 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VersionGatesClient is the client of the 'version_gates' resource. +// +// Manages the collection of version gates. +type VersionGatesClient struct { + transport http.RoundTripper + path string +} + +// NewVersionGatesClient creates a new client for the 'version_gates' +// resource using the given transport to send the requests and receive the +// responses. +func NewVersionGatesClient(transport http.RoundTripper, path string) *VersionGatesClient { + return &VersionGatesClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Adds a new version gate +func (c *VersionGatesClient) Add() *VersionGatesAddRequest { + return &VersionGatesAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves a list of version gates. +func (c *VersionGatesClient) List() *VersionGatesListRequest { + return &VersionGatesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// VersionGate returns the target 'version_gate' resource for the given identifier. +// +// Reference to the resource that manages a specific version gate. +func (c *VersionGatesClient) VersionGate(id string) *VersionGateClient { + return NewVersionGateClient( + c.transport, + path.Join(c.path, id), + ) +} + +// VersionGatesAddRequest is the request for the 'add' method. +type VersionGatesAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *VersionGate +} + +// Parameter adds a query parameter. +func (r *VersionGatesAddRequest) Parameter(name string, value interface{}) *VersionGatesAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGatesAddRequest) Header(name string, value interface{}) *VersionGatesAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGatesAddRequest) Impersonate(user string) *VersionGatesAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Details of the version gate +func (r *VersionGatesAddRequest) Body(value *VersionGate) *VersionGatesAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGatesAddRequest) Send() (result *VersionGatesAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGatesAddRequest) SendContext(ctx context.Context) (result *VersionGatesAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeVersionGatesAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGatesAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGatesAddResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGatesAddResponse is the response for the 'add' method. +type VersionGatesAddResponse struct { + status int + header http.Header + err *errors.Error + body *VersionGate +} + +// Status returns the response status code. +func (r *VersionGatesAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGatesAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGatesAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Details of the version gate +func (r *VersionGatesAddResponse) Body() *VersionGate { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Details of the version gate +func (r *VersionGatesAddResponse) GetBody() (value *VersionGate, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// VersionGatesListRequest is the request for the 'list' method. +type VersionGatesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *VersionGatesListRequest) Parameter(name string, value interface{}) *VersionGatesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionGatesListRequest) Header(name string, value interface{}) *VersionGatesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionGatesListRequest) Impersonate(user string) *VersionGatesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// an SQL statement, but using the names of the attributes of the version gate instead of +// the names of the columns of a table. For example, in order to sort the version gates +// descending by identifier the value should be: +// +// ```sql +// id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *VersionGatesListRequest) Order(value string) *VersionGatesListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionGatesListRequest) Page(value int) *VersionGatesListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of an +// SQL statement, but using the names of the attributes of the version gate instead of +// the names of the columns of a table. +// +// If the parameter isn't provided, or if the value is empty, then all the version gates +// that the user has permission to see will be returned. +func (r *VersionGatesListRequest) Search(value string) *VersionGatesListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +// +// Default value is `100`. +func (r *VersionGatesListRequest) Size(value int) *VersionGatesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionGatesListRequest) Send() (result *VersionGatesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionGatesListRequest) SendContext(ctx context.Context) (result *VersionGatesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionGatesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionGatesListResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionGatesListResponse is the response for the 'list' method. +type VersionGatesListResponse struct { + status int + header http.Header + err *errors.Error + items *VersionGateList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *VersionGatesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionGatesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionGatesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of version gates. +func (r *VersionGatesListResponse) Items() *VersionGateList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of version gates. +func (r *VersionGatesListResponse) GetItems() (value *VersionGateList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionGatesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionGatesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +// +// Default value is `100`. +func (r *VersionGatesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +// +// Default value is `100`. +func (r *VersionGatesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *VersionGatesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *VersionGatesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/version_gates_resource_json.go b/clustersmgmt/v2alpha1/version_gates_resource_json.go new file mode 100644 index 00000000..9018b192 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_gates_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeVersionGatesAddRequest(request *VersionGatesAddRequest, writer io.Writer) error { + return MarshalVersionGate(request.body, writer) +} +func readVersionGatesAddResponse(response *VersionGatesAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalVersionGate(reader) + return err +} +func writeVersionGatesListRequest(request *VersionGatesListRequest, writer io.Writer) error { + return nil +} +func readVersionGatesListResponse(response *VersionGatesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readVersionGateList(iterator) + response.items = &VersionGateList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/version_list_builder.go b/clustersmgmt/v2alpha1/version_list_builder.go new file mode 100644 index 00000000..d56f1262 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// VersionListBuilder contains the data and logic needed to build +// 'version' objects. +type VersionListBuilder struct { + items []*VersionBuilder +} + +// NewVersionList creates a new builder of 'version' objects. +func NewVersionList() *VersionListBuilder { + return new(VersionListBuilder) +} + +// Items sets the items of the list. +func (b *VersionListBuilder) Items(values ...*VersionBuilder) *VersionListBuilder { + b.items = make([]*VersionBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *VersionListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *VersionListBuilder) Copy(list *VersionList) *VersionListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*VersionBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewVersion().Copy(v) + } + } + return b +} + +// Build creates a list of 'version' objects using the +// configuration stored in the builder. +func (b *VersionListBuilder) Build() (list *VersionList, err error) { + items := make([]*Version, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(VersionList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/version_list_type_json.go b/clustersmgmt/v2alpha1/version_list_type_json.go new file mode 100644 index 00000000..8e4b60d7 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalVersionList writes a list of values of the 'version' type to +// the given writer. +func MarshalVersionList(list []*Version, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeVersionList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeVersionList writes a list of value of the 'version' type to +// the given stream. +func writeVersionList(list []*Version, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeVersion(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalVersionList reads a list of values of the 'version' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalVersionList(source interface{}) (items []*Version, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readVersionList(iterator) + err = iterator.Error + return +} + +// readVersionList reads list of values of the ”version' type from +// the given iterator. +func readVersionList(iterator *jsoniter.Iterator) []*Version { + list := []*Version{} + for iterator.ReadArray() { + item := readVersion(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/version_resource_json.go b/clustersmgmt/v2alpha1/version_resource_json.go new file mode 100644 index 00000000..bbb05846 --- /dev/null +++ b/clustersmgmt/v2alpha1/version_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeVersionGetRequest(request *VersionGetRequest, writer io.Writer) error { + return nil +} +func readVersionGetResponse(response *VersionGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalVersion(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/version_type.go b/clustersmgmt/v2alpha1/version_type.go new file mode 100644 index 00000000..25bbf93e --- /dev/null +++ b/clustersmgmt/v2alpha1/version_type.go @@ -0,0 +1,544 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + time "time" +) + +// VersionKind is the name of the type used to represent objects +// of type 'version'. +const VersionKind = "Version" + +// VersionLinkKind is the name of the type used to represent links +// to objects of type 'version'. +const VersionLinkKind = "VersionLink" + +// VersionNilKind is the name of the type used to nil references +// to objects of type 'version'. +const VersionNilKind = "VersionNil" + +// Version represents the values of the 'version' type. +// +// Representation of an _OpenShift_ version. +type Version struct { + bitmap_ uint32 + id string + href string + availableUpgrades []string + channelGroup string + endOfLifeTimestamp time.Time + imageOverrides *ImageOverrides + rawID string + releaseImage string + releaseImages *ReleaseImages + gcpMarketplaceEnabled bool + rosaEnabled bool + default_ bool + enabled bool + hostedControlPlaneDefault bool + hostedControlPlaneEnabled bool +} + +// Kind returns the name of the type of the object. +func (o *Version) Kind() string { + if o == nil { + return VersionNilKind + } + if o.bitmap_&1 != 0 { + return VersionLinkKind + } + return VersionKind +} + +// Link returns true iif this is a link. +func (o *Version) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *Version) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *Version) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *Version) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *Version) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *Version) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// GCPMarketplaceEnabled returns the value of the 'GCP_marketplace_enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// GCPMarketplaceEnabled indicates if this version can be used to create GCP Marketplace clusters. +func (o *Version) GCPMarketplaceEnabled() bool { + if o != nil && o.bitmap_&8 != 0 { + return o.gcpMarketplaceEnabled + } + return false +} + +// GetGCPMarketplaceEnabled returns the value of the 'GCP_marketplace_enabled' attribute and +// a flag indicating if the attribute has a value. +// +// GCPMarketplaceEnabled indicates if this version can be used to create GCP Marketplace clusters. +func (o *Version) GetGCPMarketplaceEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.gcpMarketplaceEnabled + } + return +} + +// ROSAEnabled returns the value of the 'ROSA_enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ROSAEnabled indicates whether this version can be used to create ROSA clusters. +func (o *Version) ROSAEnabled() bool { + if o != nil && o.bitmap_&16 != 0 { + return o.rosaEnabled + } + return false +} + +// GetROSAEnabled returns the value of the 'ROSA_enabled' attribute and +// a flag indicating if the attribute has a value. +// +// ROSAEnabled indicates whether this version can be used to create ROSA clusters. +func (o *Version) GetROSAEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.rosaEnabled + } + return +} + +// AvailableUpgrades returns the value of the 'available_upgrades' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// AvailableUpgrades is the list of versions this version can be upgraded to. +func (o *Version) AvailableUpgrades() []string { + if o != nil && o.bitmap_&32 != 0 { + return o.availableUpgrades + } + return nil +} + +// GetAvailableUpgrades returns the value of the 'available_upgrades' attribute and +// a flag indicating if the attribute has a value. +// +// AvailableUpgrades is the list of versions this version can be upgraded to. +func (o *Version) GetAvailableUpgrades() (value []string, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.availableUpgrades + } + return +} + +// ChannelGroup returns the value of the 'channel_group' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ChannelGroup is the name of the group where this image belongs. +// ChannelGroup is a mechanism to partition the images to different groups, +// each image belongs to only a single group. +func (o *Version) ChannelGroup() string { + if o != nil && o.bitmap_&64 != 0 { + return o.channelGroup + } + return "" +} + +// GetChannelGroup returns the value of the 'channel_group' attribute and +// a flag indicating if the attribute has a value. +// +// ChannelGroup is the name of the group where this image belongs. +// ChannelGroup is a mechanism to partition the images to different groups, +// each image belongs to only a single group. +func (o *Version) GetChannelGroup() (value string, ok bool) { + ok = o != nil && o.bitmap_&64 != 0 + if ok { + value = o.channelGroup + } + return +} + +// Default returns the value of the 'default' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this should be selected as the default version when a cluster is created +// without specifying explicitly the version. +func (o *Version) Default() bool { + if o != nil && o.bitmap_&128 != 0 { + return o.default_ + } + return false +} + +// GetDefault returns the value of the 'default' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this should be selected as the default version when a cluster is created +// without specifying explicitly the version. +func (o *Version) GetDefault() (value bool, ok bool) { + ok = o != nil && o.bitmap_&128 != 0 + if ok { + value = o.default_ + } + return +} + +// Enabled returns the value of the 'enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Indicates if this version can be used to create clusters. +func (o *Version) Enabled() bool { + if o != nil && o.bitmap_&256 != 0 { + return o.enabled + } + return false +} + +// GetEnabled returns the value of the 'enabled' attribute and +// a flag indicating if the attribute has a value. +// +// Indicates if this version can be used to create clusters. +func (o *Version) GetEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&256 != 0 + if ok { + value = o.enabled + } + return +} + +// EndOfLifeTimestamp returns the value of the 'end_of_life_timestamp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// EndOfLifeTimestamp is the date and time when the version will get to End of Life, using the +// format defined in https://www.ietf.org/rfc/rfc3339.txt[RC3339]. +func (o *Version) EndOfLifeTimestamp() time.Time { + if o != nil && o.bitmap_&512 != 0 { + return o.endOfLifeTimestamp + } + return time.Time{} +} + +// GetEndOfLifeTimestamp returns the value of the 'end_of_life_timestamp' attribute and +// a flag indicating if the attribute has a value. +// +// EndOfLifeTimestamp is the date and time when the version will get to End of Life, using the +// format defined in https://www.ietf.org/rfc/rfc3339.txt[RC3339]. +func (o *Version) GetEndOfLifeTimestamp() (value time.Time, ok bool) { + ok = o != nil && o.bitmap_&512 != 0 + if ok { + value = o.endOfLifeTimestamp + } + return +} + +// HostedControlPlaneDefault returns the value of the 'hosted_control_plane_default' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HostedControlPlaneDefault is a flag that indicates if this should be selected as the default version when a +// HCP cluster is created without specifying explicitly the version. +func (o *Version) HostedControlPlaneDefault() bool { + if o != nil && o.bitmap_&1024 != 0 { + return o.hostedControlPlaneDefault + } + return false +} + +// GetHostedControlPlaneDefault returns the value of the 'hosted_control_plane_default' attribute and +// a flag indicating if the attribute has a value. +// +// HostedControlPlaneDefault is a flag that indicates if this should be selected as the default version when a +// HCP cluster is created without specifying explicitly the version. +func (o *Version) GetHostedControlPlaneDefault() (value bool, ok bool) { + ok = o != nil && o.bitmap_&1024 != 0 + if ok { + value = o.hostedControlPlaneDefault + } + return +} + +// HostedControlPlaneEnabled returns the value of the 'hosted_control_plane_enabled' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// HostedControlPlaneEnabled indicates whether this version can be used to create HCP clusters. +func (o *Version) HostedControlPlaneEnabled() bool { + if o != nil && o.bitmap_&2048 != 0 { + return o.hostedControlPlaneEnabled + } + return false +} + +// GetHostedControlPlaneEnabled returns the value of the 'hosted_control_plane_enabled' attribute and +// a flag indicating if the attribute has a value. +// +// HostedControlPlaneEnabled indicates whether this version can be used to create HCP clusters. +func (o *Version) GetHostedControlPlaneEnabled() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2048 != 0 + if ok { + value = o.hostedControlPlaneEnabled + } + return +} + +// ImageOverrides returns the value of the 'image_overrides' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ImageOverrides contains the lists of images per cloud provider. +func (o *Version) ImageOverrides() *ImageOverrides { + if o != nil && o.bitmap_&4096 != 0 { + return o.imageOverrides + } + return nil +} + +// GetImageOverrides returns the value of the 'image_overrides' attribute and +// a flag indicating if the attribute has a value. +// +// ImageOverrides contains the lists of images per cloud provider. +func (o *Version) GetImageOverrides() (value *ImageOverrides, ok bool) { + ok = o != nil && o.bitmap_&4096 != 0 + if ok { + value = o.imageOverrides + } + return +} + +// RawID returns the value of the 'raw_ID' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// RawID is the id of the version - without channel group and prefix. +func (o *Version) RawID() string { + if o != nil && o.bitmap_&8192 != 0 { + return o.rawID + } + return "" +} + +// GetRawID returns the value of the 'raw_ID' attribute and +// a flag indicating if the attribute has a value. +// +// RawID is the id of the version - without channel group and prefix. +func (o *Version) GetRawID() (value string, ok bool) { + ok = o != nil && o.bitmap_&8192 != 0 + if ok { + value = o.rawID + } + return +} + +// ReleaseImage returns the value of the 'release_image' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ReleaseImage contains the URI of Openshift release image for amd64 architecture. +func (o *Version) ReleaseImage() string { + if o != nil && o.bitmap_&16384 != 0 { + return o.releaseImage + } + return "" +} + +// GetReleaseImage returns the value of the 'release_image' attribute and +// a flag indicating if the attribute has a value. +// +// ReleaseImage contains the URI of Openshift release image for amd64 architecture. +func (o *Version) GetReleaseImage() (value string, ok bool) { + ok = o != nil && o.bitmap_&16384 != 0 + if ok { + value = o.releaseImage + } + return +} + +// ReleaseImages returns the value of the 'release_images' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// ReleaseImages contains the URI of OpenShift release images for arm64 and multi architectures. +func (o *Version) ReleaseImages() *ReleaseImages { + if o != nil && o.bitmap_&32768 != 0 { + return o.releaseImages + } + return nil +} + +// GetReleaseImages returns the value of the 'release_images' attribute and +// a flag indicating if the attribute has a value. +// +// ReleaseImages contains the URI of OpenShift release images for arm64 and multi architectures. +func (o *Version) GetReleaseImages() (value *ReleaseImages, ok bool) { + ok = o != nil && o.bitmap_&32768 != 0 + if ok { + value = o.releaseImages + } + return +} + +// VersionListKind is the name of the type used to represent list of objects of +// type 'version'. +const VersionListKind = "VersionList" + +// VersionListLinkKind is the name of the type used to represent links to list +// of objects of type 'version'. +const VersionListLinkKind = "VersionListLink" + +// VersionNilKind is the name of the type used to nil lists of objects of +// type 'version'. +const VersionListNilKind = "VersionListNil" + +// VersionList is a list of values of the 'version' type. +type VersionList struct { + href string + link bool + items []*Version +} + +// Kind returns the name of the type of the object. +func (l *VersionList) Kind() string { + if l == nil { + return VersionListNilKind + } + if l.link { + return VersionListLinkKind + } + return VersionListKind +} + +// Link returns true iif this is a link. +func (l *VersionList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *VersionList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *VersionList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *VersionList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *VersionList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *VersionList) Get(i int) *Version { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *VersionList) Slice() []*Version { + var slice []*Version + if l == nil { + slice = make([]*Version, 0) + } else { + slice = make([]*Version, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *VersionList) Each(f func(item *Version) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *VersionList) Range(f func(index int, item *Version) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/version_type_json.go b/clustersmgmt/v2alpha1/version_type_json.go new file mode 100644 index 00000000..3b139a3b --- /dev/null +++ b/clustersmgmt/v2alpha1/version_type_json.go @@ -0,0 +1,281 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + "time" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalVersion writes a value of the 'version' type to the given writer. +func MarshalVersion(object *Version, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeVersion(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeVersion writes a value of the 'version' type to the given stream. +func writeVersion(object *Version, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(VersionLinkKind) + } else { + stream.WriteString(VersionKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp_marketplace_enabled") + stream.WriteBool(object.gcpMarketplaceEnabled) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("rosa_enabled") + stream.WriteBool(object.rosaEnabled) + count++ + } + present_ = object.bitmap_&32 != 0 && object.availableUpgrades != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("available_upgrades") + writeStringList(object.availableUpgrades, stream) + count++ + } + present_ = object.bitmap_&64 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("channel_group") + stream.WriteString(object.channelGroup) + count++ + } + present_ = object.bitmap_&128 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("default") + stream.WriteBool(object.default_) + count++ + } + present_ = object.bitmap_&256 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("enabled") + stream.WriteBool(object.enabled) + count++ + } + present_ = object.bitmap_&512 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("end_of_life_timestamp") + stream.WriteString((object.endOfLifeTimestamp).Format(time.RFC3339)) + count++ + } + present_ = object.bitmap_&1024 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hosted_control_plane_default") + stream.WriteBool(object.hostedControlPlaneDefault) + count++ + } + present_ = object.bitmap_&2048 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("hosted_control_plane_enabled") + stream.WriteBool(object.hostedControlPlaneEnabled) + count++ + } + present_ = object.bitmap_&4096 != 0 && object.imageOverrides != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("image_overrides") + writeImageOverrides(object.imageOverrides, stream) + count++ + } + present_ = object.bitmap_&8192 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("raw_id") + stream.WriteString(object.rawID) + count++ + } + present_ = object.bitmap_&16384 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("release_image") + stream.WriteString(object.releaseImage) + count++ + } + present_ = object.bitmap_&32768 != 0 && object.releaseImages != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("release_images") + writeReleaseImages(object.releaseImages, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalVersion reads a value of the 'version' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalVersion(source interface{}) (object *Version, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readVersion(iterator) + err = iterator.Error + return +} + +// readVersion reads a value of the 'version' type from the given iterator. +func readVersion(iterator *jsoniter.Iterator) *Version { + object := &Version{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == VersionLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "gcp_marketplace_enabled": + value := iterator.ReadBool() + object.gcpMarketplaceEnabled = value + object.bitmap_ |= 8 + case "rosa_enabled": + value := iterator.ReadBool() + object.rosaEnabled = value + object.bitmap_ |= 16 + case "available_upgrades": + value := readStringList(iterator) + object.availableUpgrades = value + object.bitmap_ |= 32 + case "channel_group": + value := iterator.ReadString() + object.channelGroup = value + object.bitmap_ |= 64 + case "default": + value := iterator.ReadBool() + object.default_ = value + object.bitmap_ |= 128 + case "enabled": + value := iterator.ReadBool() + object.enabled = value + object.bitmap_ |= 256 + case "end_of_life_timestamp": + text := iterator.ReadString() + value, err := time.Parse(time.RFC3339, text) + if err != nil { + iterator.ReportError("", err.Error()) + } + object.endOfLifeTimestamp = value + object.bitmap_ |= 512 + case "hosted_control_plane_default": + value := iterator.ReadBool() + object.hostedControlPlaneDefault = value + object.bitmap_ |= 1024 + case "hosted_control_plane_enabled": + value := iterator.ReadBool() + object.hostedControlPlaneEnabled = value + object.bitmap_ |= 2048 + case "image_overrides": + value := readImageOverrides(iterator) + object.imageOverrides = value + object.bitmap_ |= 4096 + case "raw_id": + value := iterator.ReadString() + object.rawID = value + object.bitmap_ |= 8192 + case "release_image": + value := iterator.ReadString() + object.releaseImage = value + object.bitmap_ |= 16384 + case "release_images": + value := readReleaseImages(iterator) + object.releaseImages = value + object.bitmap_ |= 32768 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/versions_client.go b/clustersmgmt/v2alpha1/versions_client.go new file mode 100644 index 00000000..93b46b5d --- /dev/null +++ b/clustersmgmt/v2alpha1/versions_client.go @@ -0,0 +1,353 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VersionsClient is the client of the 'versions' resource. +// +// Manages the collection of versions. +type VersionsClient struct { + transport http.RoundTripper + path string +} + +// NewVersionsClient creates a new client for the 'versions' +// resource using the given transport to send the requests and receive the +// responses. +func NewVersionsClient(transport http.RoundTripper, path string) *VersionsClient { + return &VersionsClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves a list of versions. +func (c *VersionsClient) List() *VersionsListRequest { + return &VersionsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// Version returns the target 'version' resource for the given identifier. +// +// Reference to the resource that manages a specific version. +func (c *VersionsClient) Version(id string) *VersionClient { + return NewVersionClient( + c.transport, + path.Join(c.path, id), + ) +} + +// VersionsListRequest is the request for the 'list' method. +type VersionsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *VersionsListRequest) Parameter(name string, value interface{}) *VersionsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VersionsListRequest) Header(name string, value interface{}) *VersionsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VersionsListRequest) Impersonate(user string) *VersionsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the version instead of +// the names of the columns of a table. For example, in order to sort the versions +// descending by identifier the value should be: +// +// ```sql +// id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *VersionsListRequest) Order(value string) *VersionsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionsListRequest) Page(value int) *VersionsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the version instead of +// the names of the columns of a table. For example, in order to retrieve all the +// versions that are enabled: +// +// ```sql +// enabled = 't' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the versions +// that the user has permission to see will be returned. +func (r *VersionsListRequest) Search(value string) *VersionsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +// +// Default value is `100`. +func (r *VersionsListRequest) Size(value int) *VersionsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VersionsListRequest) Send() (result *VersionsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VersionsListRequest) SendContext(ctx context.Context) (result *VersionsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VersionsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVersionsListResponse(result, reader) + if err != nil { + return + } + return +} + +// VersionsListResponse is the response for the 'list' method. +type VersionsListResponse struct { + status int + header http.Header + err *errors.Error + items *VersionList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *VersionsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VersionsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VersionsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of versions. +func (r *VersionsListResponse) Items() *VersionList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of versions. +func (r *VersionsListResponse) GetItems() (value *VersionList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *VersionsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +// +// Default value is `100`. +func (r *VersionsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +// +// Default value is `100`. +func (r *VersionsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *VersionsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *VersionsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/versions_resource_json.go b/clustersmgmt/v2alpha1/versions_resource_json.go new file mode 100644 index 00000000..ef65d1b5 --- /dev/null +++ b/clustersmgmt/v2alpha1/versions_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeVersionsListRequest(request *VersionsListRequest, writer io.Writer) error { + return nil +} +func readVersionsListResponse(response *VersionsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readVersionList(iterator) + response.items = &VersionList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/vpc_client.go b/clustersmgmt/v2alpha1/vpc_client.go new file mode 100644 index 00000000..b0828d87 --- /dev/null +++ b/clustersmgmt/v2alpha1/vpc_client.go @@ -0,0 +1,305 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VpcClient is the client of the 'vpc' resource. +// +// Provides detailed information about the status of an specific cluster. +type VpcClient struct { + transport http.RoundTripper + path string +} + +// NewVpcClient creates a new client for the 'vpc' +// resource using the given transport to send the requests and receive the +// responses. +func NewVpcClient(transport http.RoundTripper, path string) *VpcClient { + return &VpcClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +func (c *VpcClient) Get() *VpcGetRequest { + return &VpcGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// VpcPollRequest is the request for the Poll method. +type VpcPollRequest struct { + request *VpcGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *VpcPollRequest) Parameter(name string, value interface{}) *VpcPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *VpcPollRequest) Header(name string, value interface{}) *VpcPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *VpcPollRequest) Interval(value time.Duration) *VpcPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *VpcPollRequest) Status(value int) *VpcPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *VpcPollRequest) Predicate(value func(*VpcGetResponse) bool) *VpcPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*VpcGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *VpcPollRequest) StartContext(ctx context.Context) (response *VpcPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &VpcPollResponse{ + response: result.(*VpcGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *VpcPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// VpcPollResponse is the response for the Poll method. +type VpcPollResponse struct { + response *VpcGetResponse +} + +// Status returns the response status code. +func (r *VpcPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *VpcPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *VpcPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *VpcPollResponse) Body() *CloudVPC { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VpcPollResponse) GetBody() (value *CloudVPC, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *VpcClient) Poll() *VpcPollRequest { + return &VpcPollRequest{ + request: c.Get(), + } +} + +// VpcGetRequest is the request for the 'get' method. +type VpcGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *VpcGetRequest) Parameter(name string, value interface{}) *VpcGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VpcGetRequest) Header(name string, value interface{}) *VpcGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VpcGetRequest) Impersonate(user string) *VpcGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VpcGetRequest) Send() (result *VpcGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VpcGetRequest) SendContext(ctx context.Context) (result *VpcGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VpcGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVpcGetResponse(result, reader) + if err != nil { + return + } + return +} + +// VpcGetResponse is the response for the 'get' method. +type VpcGetResponse struct { + status int + header http.Header + err *errors.Error + body *CloudVPC +} + +// Status returns the response status code. +func (r *VpcGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VpcGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VpcGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *VpcGetResponse) Body() *CloudVPC { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *VpcGetResponse) GetBody() (value *CloudVPC, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/vpc_resource_json.go b/clustersmgmt/v2alpha1/vpc_resource_json.go new file mode 100644 index 00000000..585ef7e6 --- /dev/null +++ b/clustersmgmt/v2alpha1/vpc_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeVpcGetRequest(request *VpcGetRequest, writer io.Writer) error { + return nil +} +func readVpcGetResponse(response *VpcGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalCloudVPC(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/vpcs_inquiry_client.go b/clustersmgmt/v2alpha1/vpcs_inquiry_client.go new file mode 100644 index 00000000..6bf35521 --- /dev/null +++ b/clustersmgmt/v2alpha1/vpcs_inquiry_client.go @@ -0,0 +1,318 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// VpcsInquiryClient is the client of the 'vpcs_inquiry' resource. +// +// Manages the collection of vpcs inquiry. +type VpcsInquiryClient struct { + transport http.RoundTripper + path string +} + +// NewVpcsInquiryClient creates a new client for the 'vpcs_inquiry' +// resource using the given transport to send the requests and receive the +// responses. +func NewVpcsInquiryClient(transport http.RoundTripper, path string) *VpcsInquiryClient { + return &VpcsInquiryClient{ + transport: transport, + path: path, + } +} + +// Search creates a request for the 'search' method. +// +// Retrieves the list of available vpcs of the cloud provider for specific region. +// IMPORTANT: This collection doesn't currently support paging or searching, so the returned +// `page` will always be 1 and `size` and `total` will always be the total number of available vpcs +// of the provider. +func (c *VpcsInquiryClient) Search() *VpcsInquirySearchRequest { + return &VpcsInquirySearchRequest{ + transport: c.transport, + path: c.path, + } +} + +// VpcsInquirySearchRequest is the request for the 'search' method. +type VpcsInquirySearchRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *CloudProviderData + page *int + size *int +} + +// Parameter adds a query parameter. +func (r *VpcsInquirySearchRequest) Parameter(name string, value interface{}) *VpcsInquirySearchRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *VpcsInquirySearchRequest) Header(name string, value interface{}) *VpcsInquirySearchRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *VpcsInquirySearchRequest) Impersonate(user string) *VpcsInquirySearchRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Cloud provider data needed for the inquiry +func (r *VpcsInquirySearchRequest) Body(value *CloudProviderData) *VpcsInquirySearchRequest { + r.body = value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *VpcsInquirySearchRequest) Page(value int) *VpcsInquirySearchRequest { + r.page = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// vpcs of the provider. +func (r *VpcsInquirySearchRequest) Size(value int) *VpcsInquirySearchRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *VpcsInquirySearchRequest) Send() (result *VpcsInquirySearchResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *VpcsInquirySearchRequest) SendContext(ctx context.Context) (result *VpcsInquirySearchResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeVpcsInquirySearchRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &VpcsInquirySearchResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readVpcsInquirySearchResponse(result, reader) + if err != nil { + return + } + return +} + +// VpcsInquirySearchResponse is the response for the 'search' method. +type VpcsInquirySearchResponse struct { + status int + header http.Header + err *errors.Error + items *CloudVPCList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *VpcsInquirySearchResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *VpcsInquirySearchResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *VpcsInquirySearchResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of cloud VPC. +func (r *VpcsInquirySearchResponse) Items() *CloudVPCList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of cloud VPC. +func (r *VpcsInquirySearchResponse) GetItems() (value *CloudVPCList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *VpcsInquirySearchResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the returned page, where one corresponds to the first page. As this +// collection doesn't support paging the result will always be `1`. +func (r *VpcsInquirySearchResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// vpcs of the provider. +func (r *VpcsInquirySearchResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Number of items that will be contained in the returned page. As this collection +// doesn't support paging or searching the result will always be the total number of +// vpcs of the provider. +func (r *VpcsInquirySearchResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available vpcs of the provider. +func (r *VpcsInquirySearchResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. As this collection doesn't support paging or +// searching the result will always be the total number of available vpcs of the provider. +func (r *VpcsInquirySearchResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/vpcs_inquiry_resource_json.go b/clustersmgmt/v2alpha1/vpcs_inquiry_resource_json.go new file mode 100644 index 00000000..a9f870ca --- /dev/null +++ b/clustersmgmt/v2alpha1/vpcs_inquiry_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeVpcsInquirySearchRequest(request *VpcsInquirySearchRequest, writer io.Writer) error { + return MarshalCloudProviderData(request.body, writer) +} +func readVpcsInquirySearchResponse(response *VpcsInquirySearchResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readCloudVPCList(iterator) + response.items = &CloudVPCList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/wif_access_method_list_type_json.go b/clustersmgmt/v2alpha1/wif_access_method_list_type_json.go new file mode 100644 index 00000000..8f44a9cc --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_access_method_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifAccessMethodList writes a list of values of the 'wif_access_method' type to +// the given writer. +func MarshalWifAccessMethodList(list []WifAccessMethod, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifAccessMethodList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifAccessMethodList writes a list of value of the 'wif_access_method' type to +// the given stream. +func writeWifAccessMethodList(list []WifAccessMethod, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifAccessMethodList reads a list of values of the 'wif_access_method' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifAccessMethodList(source interface{}) (items []WifAccessMethod, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifAccessMethodList(iterator) + err = iterator.Error + return +} + +// readWifAccessMethodList reads list of values of the ”wif_access_method' type from +// the given iterator. +func readWifAccessMethodList(iterator *jsoniter.Iterator) []WifAccessMethod { + list := []WifAccessMethod{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := WifAccessMethod(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_access_method_type.go b/clustersmgmt/v2alpha1/wif_access_method_type.go new file mode 100644 index 00000000..ff037494 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_access_method_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifAccessMethod represents the values of the 'wif_access_method' enumerated type. +type WifAccessMethod string + +const ( + // + WifAccessMethodImpersonate WifAccessMethod = "impersonate" + // + WifAccessMethodWif WifAccessMethod = "wif" +) diff --git a/clustersmgmt/v2alpha1/wif_config_builder.go b/clustersmgmt/v2alpha1/wif_config_builder.go new file mode 100644 index 00000000..37015df0 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_builder.go @@ -0,0 +1,137 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifConfigBuilder contains the data and logic needed to build 'wif_config' objects. +// +// Definition of an wif_config resource. +type WifConfigBuilder struct { + bitmap_ uint32 + id string + href string + displayName string + gcp *WifGcpBuilder + organization *OrganizationLinkBuilder +} + +// NewWifConfig creates a new builder of 'wif_config' objects. +func NewWifConfig() *WifConfigBuilder { + return &WifConfigBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *WifConfigBuilder) Link(value bool) *WifConfigBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *WifConfigBuilder) ID(value string) *WifConfigBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *WifConfigBuilder) HREF(value string) *WifConfigBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifConfigBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// DisplayName sets the value of the 'display_name' attribute to the given value. +func (b *WifConfigBuilder) DisplayName(value string) *WifConfigBuilder { + b.displayName = value + b.bitmap_ |= 8 + return b +} + +// Gcp sets the value of the 'gcp' attribute to the given value. +func (b *WifConfigBuilder) Gcp(value *WifGcpBuilder) *WifConfigBuilder { + b.gcp = value + if value != nil { + b.bitmap_ |= 16 + } else { + b.bitmap_ &^= 16 + } + return b +} + +// Organization sets the value of the 'organization' attribute to the given value. +// +// Definition of an organization link. +func (b *WifConfigBuilder) Organization(value *OrganizationLinkBuilder) *WifConfigBuilder { + b.organization = value + if value != nil { + b.bitmap_ |= 32 + } else { + b.bitmap_ &^= 32 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifConfigBuilder) Copy(object *WifConfig) *WifConfigBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + b.displayName = object.displayName + if object.gcp != nil { + b.gcp = NewWifGcp().Copy(object.gcp) + } else { + b.gcp = nil + } + if object.organization != nil { + b.organization = NewOrganizationLink().Copy(object.organization) + } else { + b.organization = nil + } + return b +} + +// Build creates a 'wif_config' object using the configuration stored in the builder. +func (b *WifConfigBuilder) Build() (object *WifConfig, err error) { + object = new(WifConfig) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + object.displayName = b.displayName + if b.gcp != nil { + object.gcp, err = b.gcp.Build() + if err != nil { + return + } + } + if b.organization != nil { + object.organization, err = b.organization.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_config_client.go b/clustersmgmt/v2alpha1/wif_config_client.go new file mode 100644 index 00000000..612ce750 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_client.go @@ -0,0 +1,436 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// WifConfigClient is the client of the 'wif_config' resource. +// +// Manages a specific wif_config. +type WifConfigClient struct { + transport http.RoundTripper + path string +} + +// NewWifConfigClient creates a new client for the 'wif_config' +// resource using the given transport to send the requests and receive the +// responses. +func NewWifConfigClient(transport http.RoundTripper, path string) *WifConfigClient { + return &WifConfigClient{ + transport: transport, + path: path, + } +} + +// Delete creates a request for the 'delete' method. +// +// Deletes the wif_config. +func (c *WifConfigClient) Delete() *WifConfigDeleteRequest { + return &WifConfigDeleteRequest{ + transport: c.transport, + path: c.path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the WifConfig. +func (c *WifConfigClient) Get() *WifConfigGetRequest { + return &WifConfigGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// WifConfigPollRequest is the request for the Poll method. +type WifConfigPollRequest struct { + request *WifConfigGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *WifConfigPollRequest) Parameter(name string, value interface{}) *WifConfigPollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *WifConfigPollRequest) Header(name string, value interface{}) *WifConfigPollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *WifConfigPollRequest) Interval(value time.Duration) *WifConfigPollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *WifConfigPollRequest) Status(value int) *WifConfigPollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *WifConfigPollRequest) Predicate(value func(*WifConfigGetResponse) bool) *WifConfigPollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*WifConfigGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *WifConfigPollRequest) StartContext(ctx context.Context) (response *WifConfigPollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &WifConfigPollResponse{ + response: result.(*WifConfigGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *WifConfigPollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// WifConfigPollResponse is the response for the Poll method. +type WifConfigPollResponse struct { + response *WifConfigGetResponse +} + +// Status returns the response status code. +func (r *WifConfigPollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *WifConfigPollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *WifConfigPollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *WifConfigPollResponse) Body() *WifConfig { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *WifConfigPollResponse) GetBody() (value *WifConfig, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *WifConfigClient) Poll() *WifConfigPollRequest { + return &WifConfigPollRequest{ + request: c.Get(), + } +} + +// WifConfigDeleteRequest is the request for the 'delete' method. +type WifConfigDeleteRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + dryRun *bool +} + +// Parameter adds a query parameter. +func (r *WifConfigDeleteRequest) Parameter(name string, value interface{}) *WifConfigDeleteRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *WifConfigDeleteRequest) Header(name string, value interface{}) *WifConfigDeleteRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *WifConfigDeleteRequest) Impersonate(user string) *WifConfigDeleteRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// DryRun sets the value of the 'dry_run' parameter. +// +// Dry run flag is used to check if the operation can be completed, but won't delete. +func (r *WifConfigDeleteRequest) DryRun(value bool) *WifConfigDeleteRequest { + r.dryRun = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *WifConfigDeleteRequest) Send() (result *WifConfigDeleteResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *WifConfigDeleteRequest) SendContext(ctx context.Context) (result *WifConfigDeleteResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.dryRun != nil { + helpers.AddValue(&query, "dry_run", *r.dryRun) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "DELETE", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &WifConfigDeleteResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + return +} + +// WifConfigDeleteResponse is the response for the 'delete' method. +type WifConfigDeleteResponse struct { + status int + header http.Header + err *errors.Error +} + +// Status returns the response status code. +func (r *WifConfigDeleteResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *WifConfigDeleteResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *WifConfigDeleteResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// WifConfigGetRequest is the request for the 'get' method. +type WifConfigGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *WifConfigGetRequest) Parameter(name string, value interface{}) *WifConfigGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *WifConfigGetRequest) Header(name string, value interface{}) *WifConfigGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *WifConfigGetRequest) Impersonate(user string) *WifConfigGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *WifConfigGetRequest) Send() (result *WifConfigGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *WifConfigGetRequest) SendContext(ctx context.Context) (result *WifConfigGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &WifConfigGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readWifConfigGetResponse(result, reader) + if err != nil { + return + } + return +} + +// WifConfigGetResponse is the response for the 'get' method. +type WifConfigGetResponse struct { + status int + header http.Header + err *errors.Error + body *WifConfig +} + +// Status returns the response status code. +func (r *WifConfigGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *WifConfigGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *WifConfigGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *WifConfigGetResponse) Body() *WifConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *WifConfigGetResponse) GetBody() (value *WifConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_config_list_builder.go b/clustersmgmt/v2alpha1/wif_config_list_builder.go new file mode 100644 index 00000000..d6354c5d --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifConfigListBuilder contains the data and logic needed to build +// 'wif_config' objects. +type WifConfigListBuilder struct { + items []*WifConfigBuilder +} + +// NewWifConfigList creates a new builder of 'wif_config' objects. +func NewWifConfigList() *WifConfigListBuilder { + return new(WifConfigListBuilder) +} + +// Items sets the items of the list. +func (b *WifConfigListBuilder) Items(values ...*WifConfigBuilder) *WifConfigListBuilder { + b.items = make([]*WifConfigBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifConfigListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifConfigListBuilder) Copy(list *WifConfigList) *WifConfigListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifConfigBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifConfig().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_config' objects using the +// configuration stored in the builder. +func (b *WifConfigListBuilder) Build() (list *WifConfigList, err error) { + items := make([]*WifConfig, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifConfigList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_config_list_type_json.go b/clustersmgmt/v2alpha1/wif_config_list_type_json.go new file mode 100644 index 00000000..342b576f --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifConfigList writes a list of values of the 'wif_config' type to +// the given writer. +func MarshalWifConfigList(list []*WifConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifConfigList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifConfigList writes a list of value of the 'wif_config' type to +// the given stream. +func writeWifConfigList(list []*WifConfig, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifConfig(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifConfigList reads a list of values of the 'wif_config' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifConfigList(source interface{}) (items []*WifConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifConfigList(iterator) + err = iterator.Error + return +} + +// readWifConfigList reads list of values of the ”wif_config' type from +// the given iterator. +func readWifConfigList(iterator *jsoniter.Iterator) []*WifConfig { + list := []*WifConfig{} + for iterator.ReadArray() { + item := readWifConfig(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_config_resource_json.go b/clustersmgmt/v2alpha1/wif_config_resource_json.go new file mode 100644 index 00000000..06f69bcb --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_resource_json.go @@ -0,0 +1,37 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeWifConfigDeleteRequest(request *WifConfigDeleteRequest, writer io.Writer) error { + return nil +} +func readWifConfigDeleteResponse(response *WifConfigDeleteResponse, reader io.Reader) error { + return nil +} +func writeWifConfigGetRequest(request *WifConfigGetRequest, writer io.Writer) error { + return nil +} +func readWifConfigGetResponse(response *WifConfigGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalWifConfig(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/wif_config_type.go b/clustersmgmt/v2alpha1/wif_config_type.go new file mode 100644 index 00000000..0f698433 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_type.go @@ -0,0 +1,290 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifConfigKind is the name of the type used to represent objects +// of type 'wif_config'. +const WifConfigKind = "WifConfig" + +// WifConfigLinkKind is the name of the type used to represent links +// to objects of type 'wif_config'. +const WifConfigLinkKind = "WifConfigLink" + +// WifConfigNilKind is the name of the type used to nil references +// to objects of type 'wif_config'. +const WifConfigNilKind = "WifConfigNil" + +// WifConfig represents the values of the 'wif_config' type. +// +// Definition of an wif_config resource. +type WifConfig struct { + bitmap_ uint32 + id string + href string + displayName string + gcp *WifGcp + organization *OrganizationLink +} + +// Kind returns the name of the type of the object. +func (o *WifConfig) Kind() string { + if o == nil { + return WifConfigNilKind + } + if o.bitmap_&1 != 0 { + return WifConfigLinkKind + } + return WifConfigKind +} + +// Link returns true iif this is a link. +func (o *WifConfig) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *WifConfig) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *WifConfig) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *WifConfig) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *WifConfig) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifConfig) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// DisplayName returns the value of the 'display_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The name OCM clients will display for this wif_config. +func (o *WifConfig) DisplayName() string { + if o != nil && o.bitmap_&8 != 0 { + return o.displayName + } + return "" +} + +// GetDisplayName returns the value of the 'display_name' attribute and +// a flag indicating if the attribute has a value. +// +// The name OCM clients will display for this wif_config. +func (o *WifConfig) GetDisplayName() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.displayName + } + return +} + +// Gcp returns the value of the 'gcp' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Holds GCP related data. +func (o *WifConfig) Gcp() *WifGcp { + if o != nil && o.bitmap_&16 != 0 { + return o.gcp + } + return nil +} + +// GetGcp returns the value of the 'gcp' attribute and +// a flag indicating if the attribute has a value. +// +// Holds GCP related data. +func (o *WifConfig) GetGcp() (value *WifGcp, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.gcp + } + return +} + +// Organization returns the value of the 'organization' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The OCM organization that this wif_config resource belongs to. +func (o *WifConfig) Organization() *OrganizationLink { + if o != nil && o.bitmap_&32 != 0 { + return o.organization + } + return nil +} + +// GetOrganization returns the value of the 'organization' attribute and +// a flag indicating if the attribute has a value. +// +// The OCM organization that this wif_config resource belongs to. +func (o *WifConfig) GetOrganization() (value *OrganizationLink, ok bool) { + ok = o != nil && o.bitmap_&32 != 0 + if ok { + value = o.organization + } + return +} + +// WifConfigListKind is the name of the type used to represent list of objects of +// type 'wif_config'. +const WifConfigListKind = "WifConfigList" + +// WifConfigListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_config'. +const WifConfigListLinkKind = "WifConfigListLink" + +// WifConfigNilKind is the name of the type used to nil lists of objects of +// type 'wif_config'. +const WifConfigListNilKind = "WifConfigListNil" + +// WifConfigList is a list of values of the 'wif_config' type. +type WifConfigList struct { + href string + link bool + items []*WifConfig +} + +// Kind returns the name of the type of the object. +func (l *WifConfigList) Kind() string { + if l == nil { + return WifConfigListNilKind + } + if l.link { + return WifConfigListLinkKind + } + return WifConfigListKind +} + +// Link returns true iif this is a link. +func (l *WifConfigList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *WifConfigList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *WifConfigList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *WifConfigList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifConfigList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifConfigList) Get(i int) *WifConfig { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifConfigList) Slice() []*WifConfig { + var slice []*WifConfig + if l == nil { + slice = make([]*WifConfig, 0) + } else { + slice = make([]*WifConfig, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifConfigList) Each(f func(item *WifConfig) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifConfigList) Range(f func(index int, item *WifConfig) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_config_type_json.go b/clustersmgmt/v2alpha1/wif_config_type_json.go new file mode 100644 index 00000000..89948ae5 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_config_type_json.go @@ -0,0 +1,146 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifConfig writes a value of the 'wif_config' type to the given writer. +func MarshalWifConfig(object *WifConfig, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifConfig(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifConfig writes a value of the 'wif_config' type to the given stream. +func writeWifConfig(object *WifConfig, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(WifConfigLinkKind) + } else { + stream.WriteString(WifConfigKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("display_name") + stream.WriteString(object.displayName) + count++ + } + present_ = object.bitmap_&16 != 0 && object.gcp != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("gcp") + writeWifGcp(object.gcp, stream) + count++ + } + present_ = object.bitmap_&32 != 0 && object.organization != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("organization") + writeOrganizationLink(object.organization, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifConfig reads a value of the 'wif_config' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifConfig(source interface{}) (object *WifConfig, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifConfig(iterator) + err = iterator.Error + return +} + +// readWifConfig reads a value of the 'wif_config' type from the given iterator. +func readWifConfig(iterator *jsoniter.Iterator) *WifConfig { + object := &WifConfig{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == WifConfigLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "display_name": + value := iterator.ReadString() + object.displayName = value + object.bitmap_ |= 8 + case "gcp": + value := readWifGcp(iterator) + object.gcp = value + object.bitmap_ |= 16 + case "organization": + value := readOrganizationLink(iterator) + object.organization = value + object.bitmap_ |= 32 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_configs_client.go b/clustersmgmt/v2alpha1/wif_configs_client.go new file mode 100644 index 00000000..5b99bab3 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_configs_client.go @@ -0,0 +1,508 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "bytes" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// WifConfigsClient is the client of the 'wif_configs' resource. +// +// Manages the collection of wif_configs. +type WifConfigsClient struct { + transport http.RoundTripper + path string +} + +// NewWifConfigsClient creates a new client for the 'wif_configs' +// resource using the given transport to send the requests and receive the +// responses. +func NewWifConfigsClient(transport http.RoundTripper, path string) *WifConfigsClient { + return &WifConfigsClient{ + transport: transport, + path: path, + } +} + +// Add creates a request for the 'add' method. +// +// Provision a new wif_config resource and add it to the collection of wif_configs. +func (c *WifConfigsClient) Add() *WifConfigsAddRequest { + return &WifConfigsAddRequest{ + transport: c.transport, + path: c.path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of wif_configs +func (c *WifConfigsClient) List() *WifConfigsListRequest { + return &WifConfigsListRequest{ + transport: c.transport, + path: c.path, + } +} + +// WifConfig returns the target 'wif_config' resource for the given identifier. +// +// Returns a reference to the service that manages an specific wif_config. +func (c *WifConfigsClient) WifConfig(id string) *WifConfigClient { + return NewWifConfigClient( + c.transport, + path.Join(c.path, id), + ) +} + +// WifConfigsAddRequest is the request for the 'add' method. +type WifConfigsAddRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + body *WifConfig +} + +// Parameter adds a query parameter. +func (r *WifConfigsAddRequest) Parameter(name string, value interface{}) *WifConfigsAddRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *WifConfigsAddRequest) Header(name string, value interface{}) *WifConfigsAddRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *WifConfigsAddRequest) Impersonate(user string) *WifConfigsAddRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Body sets the value of the 'body' parameter. +// +// Description of the wif_config. +func (r *WifConfigsAddRequest) Body(value *WifConfig) *WifConfigsAddRequest { + r.body = value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *WifConfigsAddRequest) Send() (result *WifConfigsAddResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *WifConfigsAddRequest) SendContext(ctx context.Context) (result *WifConfigsAddResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + buffer := &bytes.Buffer{} + err = writeWifConfigsAddRequest(r, buffer) + if err != nil { + return + } + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "POST", + URL: uri, + Header: header, + Body: io.NopCloser(buffer), + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &WifConfigsAddResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readWifConfigsAddResponse(result, reader) + if err != nil { + return + } + return +} + +// WifConfigsAddResponse is the response for the 'add' method. +type WifConfigsAddResponse struct { + status int + header http.Header + err *errors.Error + body *WifConfig +} + +// Status returns the response status code. +func (r *WifConfigsAddResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *WifConfigsAddResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *WifConfigsAddResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +// +// Description of the wif_config. +func (r *WifConfigsAddResponse) Body() *WifConfig { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +// +// Description of the wif_config. +func (r *WifConfigsAddResponse) GetBody() (value *WifConfig, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} + +// WifConfigsListRequest is the request for the 'list' method. +type WifConfigsListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *WifConfigsListRequest) Parameter(name string, value interface{}) *WifConfigsListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *WifConfigsListRequest) Header(name string, value interface{}) *WifConfigsListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *WifConfigsListRequest) Impersonate(user string) *WifConfigsListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to sort the clusters +// descending by region identifier the value should be: +// +// ```sql +// region.id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *WifConfigsListRequest) Order(value string) *WifConfigsListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *WifConfigsListRequest) Page(value int) *WifConfigsListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to retrieve all the +// clusters with a name starting with `my` in the `us-east-1` region the value +// should be: +// +// ```sql +// name like 'my%' and region.id = 'us-east-1' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// wif_configs that the user has permission to see will be returned. +func (r *WifConfigsListRequest) Search(value string) *WifConfigsListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *WifConfigsListRequest) Size(value int) *WifConfigsListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *WifConfigsListRequest) Send() (result *WifConfigsListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *WifConfigsListRequest) SendContext(ctx context.Context) (result *WifConfigsListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &WifConfigsListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readWifConfigsListResponse(result, reader) + if err != nil { + return + } + return +} + +// WifConfigsListResponse is the response for the 'list' method. +type WifConfigsListResponse struct { + status int + header http.Header + err *errors.Error + items *WifConfigList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *WifConfigsListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *WifConfigsListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *WifConfigsListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of wif_configs. +func (r *WifConfigsListResponse) Items() *WifConfigList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of wif_configs. +func (r *WifConfigsListResponse) GetItems() (value *WifConfigList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *WifConfigsListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *WifConfigsListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *WifConfigsListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *WifConfigsListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *WifConfigsListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *WifConfigsListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_configs_resource_json.go b/clustersmgmt/v2alpha1/wif_configs_resource_json.go new file mode 100644 index 00000000..27a73425 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_configs_resource_json.go @@ -0,0 +1,69 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeWifConfigsAddRequest(request *WifConfigsAddRequest, writer io.Writer) error { + return MarshalWifConfig(request.body, writer) +} +func readWifConfigsAddResponse(response *WifConfigsAddResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalWifConfig(reader) + return err +} +func writeWifConfigsListRequest(request *WifConfigsListRequest, writer io.Writer) error { + return nil +} +func readWifConfigsListResponse(response *WifConfigsListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readWifConfigList(iterator) + response.items = &WifConfigList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/wif_credential_request_builder.go b/clustersmgmt/v2alpha1/wif_credential_request_builder.go new file mode 100644 index 00000000..e7e49ad5 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_credential_request_builder.go @@ -0,0 +1,93 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifCredentialRequestBuilder contains the data and logic needed to build 'wif_credential_request' objects. +type WifCredentialRequestBuilder struct { + bitmap_ uint32 + secretRef *WifSecretRefBuilder + serviceAccountNames []string +} + +// NewWifCredentialRequest creates a new builder of 'wif_credential_request' objects. +func NewWifCredentialRequest() *WifCredentialRequestBuilder { + return &WifCredentialRequestBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifCredentialRequestBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// SecretRef sets the value of the 'secret_ref' attribute to the given value. +func (b *WifCredentialRequestBuilder) SecretRef(value *WifSecretRefBuilder) *WifCredentialRequestBuilder { + b.secretRef = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// ServiceAccountNames sets the value of the 'service_account_names' attribute to the given values. +func (b *WifCredentialRequestBuilder) ServiceAccountNames(values ...string) *WifCredentialRequestBuilder { + b.serviceAccountNames = make([]string, len(values)) + copy(b.serviceAccountNames, values) + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifCredentialRequestBuilder) Copy(object *WifCredentialRequest) *WifCredentialRequestBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.secretRef != nil { + b.secretRef = NewWifSecretRef().Copy(object.secretRef) + } else { + b.secretRef = nil + } + if object.serviceAccountNames != nil { + b.serviceAccountNames = make([]string, len(object.serviceAccountNames)) + copy(b.serviceAccountNames, object.serviceAccountNames) + } else { + b.serviceAccountNames = nil + } + return b +} + +// Build creates a 'wif_credential_request' object using the configuration stored in the builder. +func (b *WifCredentialRequestBuilder) Build() (object *WifCredentialRequest, err error) { + object = new(WifCredentialRequest) + object.bitmap_ = b.bitmap_ + if b.secretRef != nil { + object.secretRef, err = b.secretRef.Build() + if err != nil { + return + } + } + if b.serviceAccountNames != nil { + object.serviceAccountNames = make([]string, len(b.serviceAccountNames)) + copy(object.serviceAccountNames, b.serviceAccountNames) + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_credential_request_list_builder.go b/clustersmgmt/v2alpha1/wif_credential_request_list_builder.go new file mode 100644 index 00000000..d2aa35b4 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_credential_request_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifCredentialRequestListBuilder contains the data and logic needed to build +// 'wif_credential_request' objects. +type WifCredentialRequestListBuilder struct { + items []*WifCredentialRequestBuilder +} + +// NewWifCredentialRequestList creates a new builder of 'wif_credential_request' objects. +func NewWifCredentialRequestList() *WifCredentialRequestListBuilder { + return new(WifCredentialRequestListBuilder) +} + +// Items sets the items of the list. +func (b *WifCredentialRequestListBuilder) Items(values ...*WifCredentialRequestBuilder) *WifCredentialRequestListBuilder { + b.items = make([]*WifCredentialRequestBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifCredentialRequestListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifCredentialRequestListBuilder) Copy(list *WifCredentialRequestList) *WifCredentialRequestListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifCredentialRequestBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifCredentialRequest().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_credential_request' objects using the +// configuration stored in the builder. +func (b *WifCredentialRequestListBuilder) Build() (list *WifCredentialRequestList, err error) { + items := make([]*WifCredentialRequest, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifCredentialRequestList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_credential_request_list_type_json.go b/clustersmgmt/v2alpha1/wif_credential_request_list_type_json.go new file mode 100644 index 00000000..6fd79248 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_credential_request_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifCredentialRequestList writes a list of values of the 'wif_credential_request' type to +// the given writer. +func MarshalWifCredentialRequestList(list []*WifCredentialRequest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifCredentialRequestList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifCredentialRequestList writes a list of value of the 'wif_credential_request' type to +// the given stream. +func writeWifCredentialRequestList(list []*WifCredentialRequest, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifCredentialRequest(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifCredentialRequestList reads a list of values of the 'wif_credential_request' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifCredentialRequestList(source interface{}) (items []*WifCredentialRequest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifCredentialRequestList(iterator) + err = iterator.Error + return +} + +// readWifCredentialRequestList reads list of values of the ”wif_credential_request' type from +// the given iterator. +func readWifCredentialRequestList(iterator *jsoniter.Iterator) []*WifCredentialRequest { + list := []*WifCredentialRequest{} + for iterator.ReadArray() { + item := readWifCredentialRequest(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_credential_request_type.go b/clustersmgmt/v2alpha1/wif_credential_request_type.go new file mode 100644 index 00000000..b335f811 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_credential_request_type.go @@ -0,0 +1,156 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifCredentialRequest represents the values of the 'wif_credential_request' type. +type WifCredentialRequest struct { + bitmap_ uint32 + secretRef *WifSecretRef + serviceAccountNames []string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifCredentialRequest) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// SecretRef returns the value of the 'secret_ref' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifCredentialRequest) SecretRef() *WifSecretRef { + if o != nil && o.bitmap_&1 != 0 { + return o.secretRef + } + return nil +} + +// GetSecretRef returns the value of the 'secret_ref' attribute and +// a flag indicating if the attribute has a value. +func (o *WifCredentialRequest) GetSecretRef() (value *WifSecretRef, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.secretRef + } + return +} + +// ServiceAccountNames returns the value of the 'service_account_names' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifCredentialRequest) ServiceAccountNames() []string { + if o != nil && o.bitmap_&2 != 0 { + return o.serviceAccountNames + } + return nil +} + +// GetServiceAccountNames returns the value of the 'service_account_names' attribute and +// a flag indicating if the attribute has a value. +func (o *WifCredentialRequest) GetServiceAccountNames() (value []string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.serviceAccountNames + } + return +} + +// WifCredentialRequestListKind is the name of the type used to represent list of objects of +// type 'wif_credential_request'. +const WifCredentialRequestListKind = "WifCredentialRequestList" + +// WifCredentialRequestListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_credential_request'. +const WifCredentialRequestListLinkKind = "WifCredentialRequestListLink" + +// WifCredentialRequestNilKind is the name of the type used to nil lists of objects of +// type 'wif_credential_request'. +const WifCredentialRequestListNilKind = "WifCredentialRequestListNil" + +// WifCredentialRequestList is a list of values of the 'wif_credential_request' type. +type WifCredentialRequestList struct { + href string + link bool + items []*WifCredentialRequest +} + +// Len returns the length of the list. +func (l *WifCredentialRequestList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifCredentialRequestList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifCredentialRequestList) Get(i int) *WifCredentialRequest { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifCredentialRequestList) Slice() []*WifCredentialRequest { + var slice []*WifCredentialRequest + if l == nil { + slice = make([]*WifCredentialRequest, 0) + } else { + slice = make([]*WifCredentialRequest, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifCredentialRequestList) Each(f func(item *WifCredentialRequest) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifCredentialRequestList) Range(f func(index int, item *WifCredentialRequest) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_credential_request_type_json.go b/clustersmgmt/v2alpha1/wif_credential_request_type_json.go new file mode 100644 index 00000000..3e7ec968 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_credential_request_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifCredentialRequest writes a value of the 'wif_credential_request' type to the given writer. +func MarshalWifCredentialRequest(object *WifCredentialRequest, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifCredentialRequest(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifCredentialRequest writes a value of the 'wif_credential_request' type to the given stream. +func writeWifCredentialRequest(object *WifCredentialRequest, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.secretRef != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("secret_ref") + writeWifSecretRef(object.secretRef, stream) + count++ + } + present_ = object.bitmap_&2 != 0 && object.serviceAccountNames != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_account_names") + writeStringList(object.serviceAccountNames, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifCredentialRequest reads a value of the 'wif_credential_request' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifCredentialRequest(source interface{}) (object *WifCredentialRequest, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifCredentialRequest(iterator) + err = iterator.Error + return +} + +// readWifCredentialRequest reads a value of the 'wif_credential_request' type from the given iterator. +func readWifCredentialRequest(iterator *jsoniter.Iterator) *WifCredentialRequest { + object := &WifCredentialRequest{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "secret_ref": + value := readWifSecretRef(iterator) + object.secretRef = value + object.bitmap_ |= 1 + case "service_account_names": + value := readStringList(iterator) + object.serviceAccountNames = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_gcp_builder.go b/clustersmgmt/v2alpha1/wif_gcp_builder.go new file mode 100644 index 00000000..f2490ee5 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_gcp_builder.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifGcpBuilder contains the data and logic needed to build 'wif_gcp' objects. +type WifGcpBuilder struct { + bitmap_ uint32 + impersonatorEmail string + projectId string + serviceAccounts []*WifServiceAccountBuilder + workloadIdentityPool *WifPoolBuilder +} + +// NewWifGcp creates a new builder of 'wif_gcp' objects. +func NewWifGcp() *WifGcpBuilder { + return &WifGcpBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifGcpBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// ImpersonatorEmail sets the value of the 'impersonator_email' attribute to the given value. +func (b *WifGcpBuilder) ImpersonatorEmail(value string) *WifGcpBuilder { + b.impersonatorEmail = value + b.bitmap_ |= 1 + return b +} + +// ProjectId sets the value of the 'project_id' attribute to the given value. +func (b *WifGcpBuilder) ProjectId(value string) *WifGcpBuilder { + b.projectId = value + b.bitmap_ |= 2 + return b +} + +// ServiceAccounts sets the value of the 'service_accounts' attribute to the given values. +func (b *WifGcpBuilder) ServiceAccounts(values ...*WifServiceAccountBuilder) *WifGcpBuilder { + b.serviceAccounts = make([]*WifServiceAccountBuilder, len(values)) + copy(b.serviceAccounts, values) + b.bitmap_ |= 4 + return b +} + +// WorkloadIdentityPool sets the value of the 'workload_identity_pool' attribute to the given value. +func (b *WifGcpBuilder) WorkloadIdentityPool(value *WifPoolBuilder) *WifGcpBuilder { + b.workloadIdentityPool = value + if value != nil { + b.bitmap_ |= 8 + } else { + b.bitmap_ &^= 8 + } + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifGcpBuilder) Copy(object *WifGcp) *WifGcpBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.impersonatorEmail = object.impersonatorEmail + b.projectId = object.projectId + if object.serviceAccounts != nil { + b.serviceAccounts = make([]*WifServiceAccountBuilder, len(object.serviceAccounts)) + for i, v := range object.serviceAccounts { + b.serviceAccounts[i] = NewWifServiceAccount().Copy(v) + } + } else { + b.serviceAccounts = nil + } + if object.workloadIdentityPool != nil { + b.workloadIdentityPool = NewWifPool().Copy(object.workloadIdentityPool) + } else { + b.workloadIdentityPool = nil + } + return b +} + +// Build creates a 'wif_gcp' object using the configuration stored in the builder. +func (b *WifGcpBuilder) Build() (object *WifGcp, err error) { + object = new(WifGcp) + object.bitmap_ = b.bitmap_ + object.impersonatorEmail = b.impersonatorEmail + object.projectId = b.projectId + if b.serviceAccounts != nil { + object.serviceAccounts = make([]*WifServiceAccount, len(b.serviceAccounts)) + for i, v := range b.serviceAccounts { + object.serviceAccounts[i], err = v.Build() + if err != nil { + return + } + } + } + if b.workloadIdentityPool != nil { + object.workloadIdentityPool, err = b.workloadIdentityPool.Build() + if err != nil { + return + } + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_gcp_list_builder.go b/clustersmgmt/v2alpha1/wif_gcp_list_builder.go new file mode 100644 index 00000000..12e17dd2 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_gcp_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifGcpListBuilder contains the data and logic needed to build +// 'wif_gcp' objects. +type WifGcpListBuilder struct { + items []*WifGcpBuilder +} + +// NewWifGcpList creates a new builder of 'wif_gcp' objects. +func NewWifGcpList() *WifGcpListBuilder { + return new(WifGcpListBuilder) +} + +// Items sets the items of the list. +func (b *WifGcpListBuilder) Items(values ...*WifGcpBuilder) *WifGcpListBuilder { + b.items = make([]*WifGcpBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifGcpListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifGcpListBuilder) Copy(list *WifGcpList) *WifGcpListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifGcpBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifGcp().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_gcp' objects using the +// configuration stored in the builder. +func (b *WifGcpListBuilder) Build() (list *WifGcpList, err error) { + items := make([]*WifGcp, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifGcpList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_gcp_list_type_json.go b/clustersmgmt/v2alpha1/wif_gcp_list_type_json.go new file mode 100644 index 00000000..ca7d5cca --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_gcp_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifGcpList writes a list of values of the 'wif_gcp' type to +// the given writer. +func MarshalWifGcpList(list []*WifGcp, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifGcpList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifGcpList writes a list of value of the 'wif_gcp' type to +// the given stream. +func writeWifGcpList(list []*WifGcp, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifGcp(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifGcpList reads a list of values of the 'wif_gcp' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifGcpList(source interface{}) (items []*WifGcp, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifGcpList(iterator) + err = iterator.Error + return +} + +// readWifGcpList reads list of values of the ”wif_gcp' type from +// the given iterator. +func readWifGcpList(iterator *jsoniter.Iterator) []*WifGcp { + list := []*WifGcp{} + for iterator.ReadArray() { + item := readWifGcp(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_gcp_type.go b/clustersmgmt/v2alpha1/wif_gcp_type.go new file mode 100644 index 00000000..77746367 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_gcp_type.go @@ -0,0 +1,216 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifGcp represents the values of the 'wif_gcp' type. +type WifGcp struct { + bitmap_ uint32 + impersonatorEmail string + projectId string + serviceAccounts []*WifServiceAccount + workloadIdentityPool *WifPool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifGcp) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// ImpersonatorEmail returns the value of the 'impersonator_email' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// This is the service account email that OCM will use to access other SAs. +func (o *WifGcp) ImpersonatorEmail() string { + if o != nil && o.bitmap_&1 != 0 { + return o.impersonatorEmail + } + return "" +} + +// GetImpersonatorEmail returns the value of the 'impersonator_email' attribute and +// a flag indicating if the attribute has a value. +// +// This is the service account email that OCM will use to access other SAs. +func (o *WifGcp) GetImpersonatorEmail() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.impersonatorEmail + } + return +} + +// ProjectId returns the value of the 'project_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// This represents the GCP project ID in which the wif resources will be configured. +func (o *WifGcp) ProjectId() string { + if o != nil && o.bitmap_&2 != 0 { + return o.projectId + } + return "" +} + +// GetProjectId returns the value of the 'project_id' attribute and +// a flag indicating if the attribute has a value. +// +// This represents the GCP project ID in which the wif resources will be configured. +func (o *WifGcp) GetProjectId() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.projectId + } + return +} + +// ServiceAccounts returns the value of the 'service_accounts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The list of service accounts and their associated roles that will need to be +// configured on the user's GCP project. +func (o *WifGcp) ServiceAccounts() []*WifServiceAccount { + if o != nil && o.bitmap_&4 != 0 { + return o.serviceAccounts + } + return nil +} + +// GetServiceAccounts returns the value of the 'service_accounts' attribute and +// a flag indicating if the attribute has a value. +// +// The list of service accounts and their associated roles that will need to be +// configured on the user's GCP project. +func (o *WifGcp) GetServiceAccounts() (value []*WifServiceAccount, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.serviceAccounts + } + return +} + +// WorkloadIdentityPool returns the value of the 'workload_identity_pool' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The workload identity configuration data that will be used to create the +// workload identity pool on the user's account. +func (o *WifGcp) WorkloadIdentityPool() *WifPool { + if o != nil && o.bitmap_&8 != 0 { + return o.workloadIdentityPool + } + return nil +} + +// GetWorkloadIdentityPool returns the value of the 'workload_identity_pool' attribute and +// a flag indicating if the attribute has a value. +// +// The workload identity configuration data that will be used to create the +// workload identity pool on the user's account. +func (o *WifGcp) GetWorkloadIdentityPool() (value *WifPool, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.workloadIdentityPool + } + return +} + +// WifGcpListKind is the name of the type used to represent list of objects of +// type 'wif_gcp'. +const WifGcpListKind = "WifGcpList" + +// WifGcpListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_gcp'. +const WifGcpListLinkKind = "WifGcpListLink" + +// WifGcpNilKind is the name of the type used to nil lists of objects of +// type 'wif_gcp'. +const WifGcpListNilKind = "WifGcpListNil" + +// WifGcpList is a list of values of the 'wif_gcp' type. +type WifGcpList struct { + href string + link bool + items []*WifGcp +} + +// Len returns the length of the list. +func (l *WifGcpList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifGcpList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifGcpList) Get(i int) *WifGcp { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifGcpList) Slice() []*WifGcp { + var slice []*WifGcp + if l == nil { + slice = make([]*WifGcp, 0) + } else { + slice = make([]*WifGcp, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifGcpList) Each(f func(item *WifGcp) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifGcpList) Range(f func(index int, item *WifGcp) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_gcp_type_json.go b/clustersmgmt/v2alpha1/wif_gcp_type_json.go new file mode 100644 index 00000000..d8d33041 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_gcp_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifGcp writes a value of the 'wif_gcp' type to the given writer. +func MarshalWifGcp(object *WifGcp, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifGcp(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifGcp writes a value of the 'wif_gcp' type to the given stream. +func writeWifGcp(object *WifGcp, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("impersonator_email") + stream.WriteString(object.impersonatorEmail) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("project_id") + stream.WriteString(object.projectId) + count++ + } + present_ = object.bitmap_&4 != 0 && object.serviceAccounts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_accounts") + writeWifServiceAccountList(object.serviceAccounts, stream) + count++ + } + present_ = object.bitmap_&8 != 0 && object.workloadIdentityPool != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("workload_identity_pool") + writeWifPool(object.workloadIdentityPool, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifGcp reads a value of the 'wif_gcp' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifGcp(source interface{}) (object *WifGcp, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifGcp(iterator) + err = iterator.Error + return +} + +// readWifGcp reads a value of the 'wif_gcp' type from the given iterator. +func readWifGcp(iterator *jsoniter.Iterator) *WifGcp { + object := &WifGcp{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "impersonator_email": + value := iterator.ReadString() + object.impersonatorEmail = value + object.bitmap_ |= 1 + case "project_id": + value := iterator.ReadString() + object.projectId = value + object.bitmap_ |= 2 + case "service_accounts": + value := readWifServiceAccountList(iterator) + object.serviceAccounts = value + object.bitmap_ |= 4 + case "workload_identity_pool": + value := readWifPool(iterator) + object.workloadIdentityPool = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_identity_provider_builder.go b/clustersmgmt/v2alpha1/wif_identity_provider_builder.go new file mode 100644 index 00000000..3510e252 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_identity_provider_builder.go @@ -0,0 +1,100 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifIdentityProviderBuilder contains the data and logic needed to build 'wif_identity_provider' objects. +type WifIdentityProviderBuilder struct { + bitmap_ uint32 + allowedAudiences []string + identityProviderId string + issuerUrl string + jwks string +} + +// NewWifIdentityProvider creates a new builder of 'wif_identity_provider' objects. +func NewWifIdentityProvider() *WifIdentityProviderBuilder { + return &WifIdentityProviderBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifIdentityProviderBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AllowedAudiences sets the value of the 'allowed_audiences' attribute to the given values. +func (b *WifIdentityProviderBuilder) AllowedAudiences(values ...string) *WifIdentityProviderBuilder { + b.allowedAudiences = make([]string, len(values)) + copy(b.allowedAudiences, values) + b.bitmap_ |= 1 + return b +} + +// IdentityProviderId sets the value of the 'identity_provider_id' attribute to the given value. +func (b *WifIdentityProviderBuilder) IdentityProviderId(value string) *WifIdentityProviderBuilder { + b.identityProviderId = value + b.bitmap_ |= 2 + return b +} + +// IssuerUrl sets the value of the 'issuer_url' attribute to the given value. +func (b *WifIdentityProviderBuilder) IssuerUrl(value string) *WifIdentityProviderBuilder { + b.issuerUrl = value + b.bitmap_ |= 4 + return b +} + +// Jwks sets the value of the 'jwks' attribute to the given value. +func (b *WifIdentityProviderBuilder) Jwks(value string) *WifIdentityProviderBuilder { + b.jwks = value + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifIdentityProviderBuilder) Copy(object *WifIdentityProvider) *WifIdentityProviderBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.allowedAudiences != nil { + b.allowedAudiences = make([]string, len(object.allowedAudiences)) + copy(b.allowedAudiences, object.allowedAudiences) + } else { + b.allowedAudiences = nil + } + b.identityProviderId = object.identityProviderId + b.issuerUrl = object.issuerUrl + b.jwks = object.jwks + return b +} + +// Build creates a 'wif_identity_provider' object using the configuration stored in the builder. +func (b *WifIdentityProviderBuilder) Build() (object *WifIdentityProvider, err error) { + object = new(WifIdentityProvider) + object.bitmap_ = b.bitmap_ + if b.allowedAudiences != nil { + object.allowedAudiences = make([]string, len(b.allowedAudiences)) + copy(object.allowedAudiences, b.allowedAudiences) + } + object.identityProviderId = b.identityProviderId + object.issuerUrl = b.issuerUrl + object.jwks = b.jwks + return +} diff --git a/clustersmgmt/v2alpha1/wif_identity_provider_list_builder.go b/clustersmgmt/v2alpha1/wif_identity_provider_list_builder.go new file mode 100644 index 00000000..1aee7652 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_identity_provider_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifIdentityProviderListBuilder contains the data and logic needed to build +// 'wif_identity_provider' objects. +type WifIdentityProviderListBuilder struct { + items []*WifIdentityProviderBuilder +} + +// NewWifIdentityProviderList creates a new builder of 'wif_identity_provider' objects. +func NewWifIdentityProviderList() *WifIdentityProviderListBuilder { + return new(WifIdentityProviderListBuilder) +} + +// Items sets the items of the list. +func (b *WifIdentityProviderListBuilder) Items(values ...*WifIdentityProviderBuilder) *WifIdentityProviderListBuilder { + b.items = make([]*WifIdentityProviderBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifIdentityProviderListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifIdentityProviderListBuilder) Copy(list *WifIdentityProviderList) *WifIdentityProviderListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifIdentityProviderBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifIdentityProvider().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_identity_provider' objects using the +// configuration stored in the builder. +func (b *WifIdentityProviderListBuilder) Build() (list *WifIdentityProviderList, err error) { + items := make([]*WifIdentityProvider, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifIdentityProviderList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_identity_provider_list_type_json.go b/clustersmgmt/v2alpha1/wif_identity_provider_list_type_json.go new file mode 100644 index 00000000..c0334b71 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_identity_provider_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifIdentityProviderList writes a list of values of the 'wif_identity_provider' type to +// the given writer. +func MarshalWifIdentityProviderList(list []*WifIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifIdentityProviderList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifIdentityProviderList writes a list of value of the 'wif_identity_provider' type to +// the given stream. +func writeWifIdentityProviderList(list []*WifIdentityProvider, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifIdentityProvider(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifIdentityProviderList reads a list of values of the 'wif_identity_provider' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifIdentityProviderList(source interface{}) (items []*WifIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifIdentityProviderList(iterator) + err = iterator.Error + return +} + +// readWifIdentityProviderList reads list of values of the ”wif_identity_provider' type from +// the given iterator. +func readWifIdentityProviderList(iterator *jsoniter.Iterator) []*WifIdentityProvider { + list := []*WifIdentityProvider{} + for iterator.ReadArray() { + item := readWifIdentityProvider(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_identity_provider_type.go b/clustersmgmt/v2alpha1/wif_identity_provider_type.go new file mode 100644 index 00000000..fccaacdf --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_identity_provider_type.go @@ -0,0 +1,196 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifIdentityProvider represents the values of the 'wif_identity_provider' type. +type WifIdentityProvider struct { + bitmap_ uint32 + allowedAudiences []string + identityProviderId string + issuerUrl string + jwks string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifIdentityProvider) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AllowedAudiences returns the value of the 'allowed_audiences' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifIdentityProvider) AllowedAudiences() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.allowedAudiences + } + return nil +} + +// GetAllowedAudiences returns the value of the 'allowed_audiences' attribute and +// a flag indicating if the attribute has a value. +func (o *WifIdentityProvider) GetAllowedAudiences() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.allowedAudiences + } + return +} + +// IdentityProviderId returns the value of the 'identity_provider_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifIdentityProvider) IdentityProviderId() string { + if o != nil && o.bitmap_&2 != 0 { + return o.identityProviderId + } + return "" +} + +// GetIdentityProviderId returns the value of the 'identity_provider_id' attribute and +// a flag indicating if the attribute has a value. +func (o *WifIdentityProvider) GetIdentityProviderId() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.identityProviderId + } + return +} + +// IssuerUrl returns the value of the 'issuer_url' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifIdentityProvider) IssuerUrl() string { + if o != nil && o.bitmap_&4 != 0 { + return o.issuerUrl + } + return "" +} + +// GetIssuerUrl returns the value of the 'issuer_url' attribute and +// a flag indicating if the attribute has a value. +func (o *WifIdentityProvider) GetIssuerUrl() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.issuerUrl + } + return +} + +// Jwks returns the value of the 'jwks' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifIdentityProvider) Jwks() string { + if o != nil && o.bitmap_&8 != 0 { + return o.jwks + } + return "" +} + +// GetJwks returns the value of the 'jwks' attribute and +// a flag indicating if the attribute has a value. +func (o *WifIdentityProvider) GetJwks() (value string, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.jwks + } + return +} + +// WifIdentityProviderListKind is the name of the type used to represent list of objects of +// type 'wif_identity_provider'. +const WifIdentityProviderListKind = "WifIdentityProviderList" + +// WifIdentityProviderListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_identity_provider'. +const WifIdentityProviderListLinkKind = "WifIdentityProviderListLink" + +// WifIdentityProviderNilKind is the name of the type used to nil lists of objects of +// type 'wif_identity_provider'. +const WifIdentityProviderListNilKind = "WifIdentityProviderListNil" + +// WifIdentityProviderList is a list of values of the 'wif_identity_provider' type. +type WifIdentityProviderList struct { + href string + link bool + items []*WifIdentityProvider +} + +// Len returns the length of the list. +func (l *WifIdentityProviderList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifIdentityProviderList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifIdentityProviderList) Get(i int) *WifIdentityProvider { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifIdentityProviderList) Slice() []*WifIdentityProvider { + var slice []*WifIdentityProvider + if l == nil { + slice = make([]*WifIdentityProvider, 0) + } else { + slice = make([]*WifIdentityProvider, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifIdentityProviderList) Each(f func(item *WifIdentityProvider) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifIdentityProviderList) Range(f func(index int, item *WifIdentityProvider) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_identity_provider_type_json.go b/clustersmgmt/v2alpha1/wif_identity_provider_type_json.go new file mode 100644 index 00000000..40adaf59 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_identity_provider_type_json.go @@ -0,0 +1,125 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifIdentityProvider writes a value of the 'wif_identity_provider' type to the given writer. +func MarshalWifIdentityProvider(object *WifIdentityProvider, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifIdentityProvider(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifIdentityProvider writes a value of the 'wif_identity_provider' type to the given stream. +func writeWifIdentityProvider(object *WifIdentityProvider, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.allowedAudiences != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("allowed_audiences") + writeStringList(object.allowedAudiences, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("identity_provider_id") + stream.WriteString(object.identityProviderId) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("issuer_url") + stream.WriteString(object.issuerUrl) + count++ + } + present_ = object.bitmap_&8 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("jwks") + stream.WriteString(object.jwks) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifIdentityProvider reads a value of the 'wif_identity_provider' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifIdentityProvider(source interface{}) (object *WifIdentityProvider, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifIdentityProvider(iterator) + err = iterator.Error + return +} + +// readWifIdentityProvider reads a value of the 'wif_identity_provider' type from the given iterator. +func readWifIdentityProvider(iterator *jsoniter.Iterator) *WifIdentityProvider { + object := &WifIdentityProvider{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "allowed_audiences": + value := readStringList(iterator) + object.allowedAudiences = value + object.bitmap_ |= 1 + case "identity_provider_id": + value := iterator.ReadString() + object.identityProviderId = value + object.bitmap_ |= 2 + case "issuer_url": + value := iterator.ReadString() + object.issuerUrl = value + object.bitmap_ |= 4 + case "jwks": + value := iterator.ReadString() + object.jwks = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_pool_builder.go b/clustersmgmt/v2alpha1/wif_pool_builder.go new file mode 100644 index 00000000..6ae62a2d --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_pool_builder.go @@ -0,0 +1,94 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifPoolBuilder contains the data and logic needed to build 'wif_pool' objects. +type WifPoolBuilder struct { + bitmap_ uint32 + identityProvider *WifIdentityProviderBuilder + poolId string + poolName string +} + +// NewWifPool creates a new builder of 'wif_pool' objects. +func NewWifPool() *WifPoolBuilder { + return &WifPoolBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifPoolBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// IdentityProvider sets the value of the 'identity_provider' attribute to the given value. +func (b *WifPoolBuilder) IdentityProvider(value *WifIdentityProviderBuilder) *WifPoolBuilder { + b.identityProvider = value + if value != nil { + b.bitmap_ |= 1 + } else { + b.bitmap_ &^= 1 + } + return b +} + +// PoolId sets the value of the 'pool_id' attribute to the given value. +func (b *WifPoolBuilder) PoolId(value string) *WifPoolBuilder { + b.poolId = value + b.bitmap_ |= 2 + return b +} + +// PoolName sets the value of the 'pool_name' attribute to the given value. +func (b *WifPoolBuilder) PoolName(value string) *WifPoolBuilder { + b.poolName = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifPoolBuilder) Copy(object *WifPool) *WifPoolBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.identityProvider != nil { + b.identityProvider = NewWifIdentityProvider().Copy(object.identityProvider) + } else { + b.identityProvider = nil + } + b.poolId = object.poolId + b.poolName = object.poolName + return b +} + +// Build creates a 'wif_pool' object using the configuration stored in the builder. +func (b *WifPoolBuilder) Build() (object *WifPool, err error) { + object = new(WifPool) + object.bitmap_ = b.bitmap_ + if b.identityProvider != nil { + object.identityProvider, err = b.identityProvider.Build() + if err != nil { + return + } + } + object.poolId = b.poolId + object.poolName = b.poolName + return +} diff --git a/clustersmgmt/v2alpha1/wif_pool_list_builder.go b/clustersmgmt/v2alpha1/wif_pool_list_builder.go new file mode 100644 index 00000000..52ad3356 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_pool_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifPoolListBuilder contains the data and logic needed to build +// 'wif_pool' objects. +type WifPoolListBuilder struct { + items []*WifPoolBuilder +} + +// NewWifPoolList creates a new builder of 'wif_pool' objects. +func NewWifPoolList() *WifPoolListBuilder { + return new(WifPoolListBuilder) +} + +// Items sets the items of the list. +func (b *WifPoolListBuilder) Items(values ...*WifPoolBuilder) *WifPoolListBuilder { + b.items = make([]*WifPoolBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifPoolListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifPoolListBuilder) Copy(list *WifPoolList) *WifPoolListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifPoolBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifPool().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_pool' objects using the +// configuration stored in the builder. +func (b *WifPoolListBuilder) Build() (list *WifPoolList, err error) { + items := make([]*WifPool, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifPoolList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_pool_list_type_json.go b/clustersmgmt/v2alpha1/wif_pool_list_type_json.go new file mode 100644 index 00000000..83c27317 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_pool_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifPoolList writes a list of values of the 'wif_pool' type to +// the given writer. +func MarshalWifPoolList(list []*WifPool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifPoolList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifPoolList writes a list of value of the 'wif_pool' type to +// the given stream. +func writeWifPoolList(list []*WifPool, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifPool(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifPoolList reads a list of values of the 'wif_pool' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifPoolList(source interface{}) (items []*WifPool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifPoolList(iterator) + err = iterator.Error + return +} + +// readWifPoolList reads list of values of the ”wif_pool' type from +// the given iterator. +func readWifPoolList(iterator *jsoniter.Iterator) []*WifPool { + list := []*WifPool{} + for iterator.ReadArray() { + item := readWifPool(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_pool_type.go b/clustersmgmt/v2alpha1/wif_pool_type.go new file mode 100644 index 00000000..5c920691 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_pool_type.go @@ -0,0 +1,190 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifPool represents the values of the 'wif_pool' type. +type WifPool struct { + bitmap_ uint32 + identityProvider *WifIdentityProvider + poolId string + poolName string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifPool) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// IdentityProvider returns the value of the 'identity_provider' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// Identity provider configuration data that will be created as part of the +// workload identity pool. +func (o *WifPool) IdentityProvider() *WifIdentityProvider { + if o != nil && o.bitmap_&1 != 0 { + return o.identityProvider + } + return nil +} + +// GetIdentityProvider returns the value of the 'identity_provider' attribute and +// a flag indicating if the attribute has a value. +// +// Identity provider configuration data that will be created as part of the +// workload identity pool. +func (o *WifPool) GetIdentityProvider() (value *WifIdentityProvider, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.identityProvider + } + return +} + +// PoolId returns the value of the 'pool_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The Id of the workload identity pool. +func (o *WifPool) PoolId() string { + if o != nil && o.bitmap_&2 != 0 { + return o.poolId + } + return "" +} + +// GetPoolId returns the value of the 'pool_id' attribute and +// a flag indicating if the attribute has a value. +// +// The Id of the workload identity pool. +func (o *WifPool) GetPoolId() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.poolId + } + return +} + +// PoolName returns the value of the 'pool_name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The display name of the workload identity pool. +func (o *WifPool) PoolName() string { + if o != nil && o.bitmap_&4 != 0 { + return o.poolName + } + return "" +} + +// GetPoolName returns the value of the 'pool_name' attribute and +// a flag indicating if the attribute has a value. +// +// The display name of the workload identity pool. +func (o *WifPool) GetPoolName() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.poolName + } + return +} + +// WifPoolListKind is the name of the type used to represent list of objects of +// type 'wif_pool'. +const WifPoolListKind = "WifPoolList" + +// WifPoolListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_pool'. +const WifPoolListLinkKind = "WifPoolListLink" + +// WifPoolNilKind is the name of the type used to nil lists of objects of +// type 'wif_pool'. +const WifPoolListNilKind = "WifPoolListNil" + +// WifPoolList is a list of values of the 'wif_pool' type. +type WifPoolList struct { + href string + link bool + items []*WifPool +} + +// Len returns the length of the list. +func (l *WifPoolList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifPoolList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifPoolList) Get(i int) *WifPool { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifPoolList) Slice() []*WifPool { + var slice []*WifPool + if l == nil { + slice = make([]*WifPool, 0) + } else { + slice = make([]*WifPool, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifPoolList) Each(f func(item *WifPool) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifPoolList) Range(f func(index int, item *WifPool) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_pool_type_json.go b/clustersmgmt/v2alpha1/wif_pool_type_json.go new file mode 100644 index 00000000..bbbc074a --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_pool_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifPool writes a value of the 'wif_pool' type to the given writer. +func MarshalWifPool(object *WifPool, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifPool(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifPool writes a value of the 'wif_pool' type to the given stream. +func writeWifPool(object *WifPool, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.identityProvider != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("identity_provider") + writeWifIdentityProvider(object.identityProvider, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("pool_id") + stream.WriteString(object.poolId) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("pool_name") + stream.WriteString(object.poolName) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifPool reads a value of the 'wif_pool' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifPool(source interface{}) (object *WifPool, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifPool(iterator) + err = iterator.Error + return +} + +// readWifPool reads a value of the 'wif_pool' type from the given iterator. +func readWifPool(iterator *jsoniter.Iterator) *WifPool { + object := &WifPool{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "identity_provider": + value := readWifIdentityProvider(iterator) + object.identityProvider = value + object.bitmap_ |= 1 + case "pool_id": + value := iterator.ReadString() + object.poolId = value + object.bitmap_ |= 2 + case "pool_name": + value := iterator.ReadString() + object.poolName = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_role_builder.go b/clustersmgmt/v2alpha1/wif_role_builder.go new file mode 100644 index 00000000..96a33145 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_role_builder.go @@ -0,0 +1,90 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifRoleBuilder contains the data and logic needed to build 'wif_role' objects. +type WifRoleBuilder struct { + bitmap_ uint32 + permissions []string + roleId string + predefined bool +} + +// NewWifRole creates a new builder of 'wif_role' objects. +func NewWifRole() *WifRoleBuilder { + return &WifRoleBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifRoleBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Permissions sets the value of the 'permissions' attribute to the given values. +func (b *WifRoleBuilder) Permissions(values ...string) *WifRoleBuilder { + b.permissions = make([]string, len(values)) + copy(b.permissions, values) + b.bitmap_ |= 1 + return b +} + +// Predefined sets the value of the 'predefined' attribute to the given value. +func (b *WifRoleBuilder) Predefined(value bool) *WifRoleBuilder { + b.predefined = value + b.bitmap_ |= 2 + return b +} + +// RoleId sets the value of the 'role_id' attribute to the given value. +func (b *WifRoleBuilder) RoleId(value string) *WifRoleBuilder { + b.roleId = value + b.bitmap_ |= 4 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifRoleBuilder) Copy(object *WifRole) *WifRoleBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + if object.permissions != nil { + b.permissions = make([]string, len(object.permissions)) + copy(b.permissions, object.permissions) + } else { + b.permissions = nil + } + b.predefined = object.predefined + b.roleId = object.roleId + return b +} + +// Build creates a 'wif_role' object using the configuration stored in the builder. +func (b *WifRoleBuilder) Build() (object *WifRole, err error) { + object = new(WifRole) + object.bitmap_ = b.bitmap_ + if b.permissions != nil { + object.permissions = make([]string, len(b.permissions)) + copy(object.permissions, b.permissions) + } + object.predefined = b.predefined + object.roleId = b.roleId + return +} diff --git a/clustersmgmt/v2alpha1/wif_role_list_builder.go b/clustersmgmt/v2alpha1/wif_role_list_builder.go new file mode 100644 index 00000000..eefda193 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_role_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifRoleListBuilder contains the data and logic needed to build +// 'wif_role' objects. +type WifRoleListBuilder struct { + items []*WifRoleBuilder +} + +// NewWifRoleList creates a new builder of 'wif_role' objects. +func NewWifRoleList() *WifRoleListBuilder { + return new(WifRoleListBuilder) +} + +// Items sets the items of the list. +func (b *WifRoleListBuilder) Items(values ...*WifRoleBuilder) *WifRoleListBuilder { + b.items = make([]*WifRoleBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifRoleListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifRoleListBuilder) Copy(list *WifRoleList) *WifRoleListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifRoleBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifRole().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_role' objects using the +// configuration stored in the builder. +func (b *WifRoleListBuilder) Build() (list *WifRoleList, err error) { + items := make([]*WifRole, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifRoleList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_role_list_type_json.go b/clustersmgmt/v2alpha1/wif_role_list_type_json.go new file mode 100644 index 00000000..15873d23 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_role_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifRoleList writes a list of values of the 'wif_role' type to +// the given writer. +func MarshalWifRoleList(list []*WifRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifRoleList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifRoleList writes a list of value of the 'wif_role' type to +// the given stream. +func writeWifRoleList(list []*WifRole, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifRole(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifRoleList reads a list of values of the 'wif_role' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifRoleList(source interface{}) (items []*WifRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifRoleList(iterator) + err = iterator.Error + return +} + +// readWifRoleList reads list of values of the ”wif_role' type from +// the given iterator. +func readWifRoleList(iterator *jsoniter.Iterator) []*WifRole { + list := []*WifRole{} + for iterator.ReadArray() { + item := readWifRole(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_role_type.go b/clustersmgmt/v2alpha1/wif_role_type.go new file mode 100644 index 00000000..d2ac73bb --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_role_type.go @@ -0,0 +1,176 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifRole represents the values of the 'wif_role' type. +type WifRole struct { + bitmap_ uint32 + permissions []string + roleId string + predefined bool +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifRole) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Permissions returns the value of the 'permissions' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifRole) Permissions() []string { + if o != nil && o.bitmap_&1 != 0 { + return o.permissions + } + return nil +} + +// GetPermissions returns the value of the 'permissions' attribute and +// a flag indicating if the attribute has a value. +func (o *WifRole) GetPermissions() (value []string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.permissions + } + return +} + +// Predefined returns the value of the 'predefined' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifRole) Predefined() bool { + if o != nil && o.bitmap_&2 != 0 { + return o.predefined + } + return false +} + +// GetPredefined returns the value of the 'predefined' attribute and +// a flag indicating if the attribute has a value. +func (o *WifRole) GetPredefined() (value bool, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.predefined + } + return +} + +// RoleId returns the value of the 'role_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifRole) RoleId() string { + if o != nil && o.bitmap_&4 != 0 { + return o.roleId + } + return "" +} + +// GetRoleId returns the value of the 'role_id' attribute and +// a flag indicating if the attribute has a value. +func (o *WifRole) GetRoleId() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.roleId + } + return +} + +// WifRoleListKind is the name of the type used to represent list of objects of +// type 'wif_role'. +const WifRoleListKind = "WifRoleList" + +// WifRoleListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_role'. +const WifRoleListLinkKind = "WifRoleListLink" + +// WifRoleNilKind is the name of the type used to nil lists of objects of +// type 'wif_role'. +const WifRoleListNilKind = "WifRoleListNil" + +// WifRoleList is a list of values of the 'wif_role' type. +type WifRoleList struct { + href string + link bool + items []*WifRole +} + +// Len returns the length of the list. +func (l *WifRoleList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifRoleList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifRoleList) Get(i int) *WifRole { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifRoleList) Slice() []*WifRole { + var slice []*WifRole + if l == nil { + slice = make([]*WifRole, 0) + } else { + slice = make([]*WifRole, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifRoleList) Each(f func(item *WifRole) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifRoleList) Range(f func(index int, item *WifRole) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_role_type_json.go b/clustersmgmt/v2alpha1/wif_role_type_json.go new file mode 100644 index 00000000..6b4a05cb --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_role_type_json.go @@ -0,0 +1,112 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifRole writes a value of the 'wif_role' type to the given writer. +func MarshalWifRole(object *WifRole, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifRole(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifRole writes a value of the 'wif_role' type to the given stream. +func writeWifRole(object *WifRole, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 && object.permissions != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("permissions") + writeStringList(object.permissions, stream) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("predefined") + stream.WriteBool(object.predefined) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("role_id") + stream.WriteString(object.roleId) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifRole reads a value of the 'wif_role' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifRole(source interface{}) (object *WifRole, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifRole(iterator) + err = iterator.Error + return +} + +// readWifRole reads a value of the 'wif_role' type from the given iterator. +func readWifRole(iterator *jsoniter.Iterator) *WifRole { + object := &WifRole{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "permissions": + value := readStringList(iterator) + object.permissions = value + object.bitmap_ |= 1 + case "predefined": + value := iterator.ReadBool() + object.predefined = value + object.bitmap_ |= 2 + case "role_id": + value := iterator.ReadString() + object.roleId = value + object.bitmap_ |= 4 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_secret_ref_builder.go b/clustersmgmt/v2alpha1/wif_secret_ref_builder.go new file mode 100644 index 00000000..87931fff --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_secret_ref_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifSecretRefBuilder contains the data and logic needed to build 'wif_secret_ref' objects. +type WifSecretRefBuilder struct { + bitmap_ uint32 + name string + namespace string +} + +// NewWifSecretRef creates a new builder of 'wif_secret_ref' objects. +func NewWifSecretRef() *WifSecretRefBuilder { + return &WifSecretRefBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifSecretRefBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// Name sets the value of the 'name' attribute to the given value. +func (b *WifSecretRefBuilder) Name(value string) *WifSecretRefBuilder { + b.name = value + b.bitmap_ |= 1 + return b +} + +// Namespace sets the value of the 'namespace' attribute to the given value. +func (b *WifSecretRefBuilder) Namespace(value string) *WifSecretRefBuilder { + b.namespace = value + b.bitmap_ |= 2 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifSecretRefBuilder) Copy(object *WifSecretRef) *WifSecretRefBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.name = object.name + b.namespace = object.namespace + return b +} + +// Build creates a 'wif_secret_ref' object using the configuration stored in the builder. +func (b *WifSecretRefBuilder) Build() (object *WifSecretRef, err error) { + object = new(WifSecretRef) + object.bitmap_ = b.bitmap_ + object.name = b.name + object.namespace = b.namespace + return +} diff --git a/clustersmgmt/v2alpha1/wif_secret_ref_list_builder.go b/clustersmgmt/v2alpha1/wif_secret_ref_list_builder.go new file mode 100644 index 00000000..34646e5b --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_secret_ref_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifSecretRefListBuilder contains the data and logic needed to build +// 'wif_secret_ref' objects. +type WifSecretRefListBuilder struct { + items []*WifSecretRefBuilder +} + +// NewWifSecretRefList creates a new builder of 'wif_secret_ref' objects. +func NewWifSecretRefList() *WifSecretRefListBuilder { + return new(WifSecretRefListBuilder) +} + +// Items sets the items of the list. +func (b *WifSecretRefListBuilder) Items(values ...*WifSecretRefBuilder) *WifSecretRefListBuilder { + b.items = make([]*WifSecretRefBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifSecretRefListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifSecretRefListBuilder) Copy(list *WifSecretRefList) *WifSecretRefListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifSecretRefBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifSecretRef().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_secret_ref' objects using the +// configuration stored in the builder. +func (b *WifSecretRefListBuilder) Build() (list *WifSecretRefList, err error) { + items := make([]*WifSecretRef, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifSecretRefList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_secret_ref_list_type_json.go b/clustersmgmt/v2alpha1/wif_secret_ref_list_type_json.go new file mode 100644 index 00000000..eed7c6eb --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_secret_ref_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifSecretRefList writes a list of values of the 'wif_secret_ref' type to +// the given writer. +func MarshalWifSecretRefList(list []*WifSecretRef, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifSecretRefList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifSecretRefList writes a list of value of the 'wif_secret_ref' type to +// the given stream. +func writeWifSecretRefList(list []*WifSecretRef, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifSecretRef(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifSecretRefList reads a list of values of the 'wif_secret_ref' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifSecretRefList(source interface{}) (items []*WifSecretRef, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifSecretRefList(iterator) + err = iterator.Error + return +} + +// readWifSecretRefList reads list of values of the ”wif_secret_ref' type from +// the given iterator. +func readWifSecretRefList(iterator *jsoniter.Iterator) []*WifSecretRef { + list := []*WifSecretRef{} + for iterator.ReadArray() { + item := readWifSecretRef(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_secret_ref_type.go b/clustersmgmt/v2alpha1/wif_secret_ref_type.go new file mode 100644 index 00000000..c6f1df0d --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_secret_ref_type.go @@ -0,0 +1,156 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifSecretRef represents the values of the 'wif_secret_ref' type. +type WifSecretRef struct { + bitmap_ uint32 + name string + namespace string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifSecretRef) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// Name returns the value of the 'name' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifSecretRef) Name() string { + if o != nil && o.bitmap_&1 != 0 { + return o.name + } + return "" +} + +// GetName returns the value of the 'name' attribute and +// a flag indicating if the attribute has a value. +func (o *WifSecretRef) GetName() (value string, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.name + } + return +} + +// Namespace returns the value of the 'namespace' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifSecretRef) Namespace() string { + if o != nil && o.bitmap_&2 != 0 { + return o.namespace + } + return "" +} + +// GetNamespace returns the value of the 'namespace' attribute and +// a flag indicating if the attribute has a value. +func (o *WifSecretRef) GetNamespace() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.namespace + } + return +} + +// WifSecretRefListKind is the name of the type used to represent list of objects of +// type 'wif_secret_ref'. +const WifSecretRefListKind = "WifSecretRefList" + +// WifSecretRefListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_secret_ref'. +const WifSecretRefListLinkKind = "WifSecretRefListLink" + +// WifSecretRefNilKind is the name of the type used to nil lists of objects of +// type 'wif_secret_ref'. +const WifSecretRefListNilKind = "WifSecretRefListNil" + +// WifSecretRefList is a list of values of the 'wif_secret_ref' type. +type WifSecretRefList struct { + href string + link bool + items []*WifSecretRef +} + +// Len returns the length of the list. +func (l *WifSecretRefList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifSecretRefList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifSecretRefList) Get(i int) *WifSecretRef { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifSecretRefList) Slice() []*WifSecretRef { + var slice []*WifSecretRef + if l == nil { + slice = make([]*WifSecretRef, 0) + } else { + slice = make([]*WifSecretRef, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifSecretRefList) Each(f func(item *WifSecretRef) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifSecretRefList) Range(f func(index int, item *WifSecretRef) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_secret_ref_type_json.go b/clustersmgmt/v2alpha1/wif_secret_ref_type_json.go new file mode 100644 index 00000000..20841f54 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_secret_ref_type_json.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifSecretRef writes a value of the 'wif_secret_ref' type to the given writer. +func MarshalWifSecretRef(object *WifSecretRef, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifSecretRef(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifSecretRef writes a value of the 'wif_secret_ref' type to the given stream. +func writeWifSecretRef(object *WifSecretRef, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("name") + stream.WriteString(object.name) + count++ + } + present_ = object.bitmap_&2 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("namespace") + stream.WriteString(object.namespace) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifSecretRef reads a value of the 'wif_secret_ref' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifSecretRef(source interface{}) (object *WifSecretRef, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifSecretRef(iterator) + err = iterator.Error + return +} + +// readWifSecretRef reads a value of the 'wif_secret_ref' type from the given iterator. +func readWifSecretRef(iterator *jsoniter.Iterator) *WifSecretRef { + object := &WifSecretRef{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "name": + value := iterator.ReadString() + object.name = value + object.bitmap_ |= 1 + case "namespace": + value := iterator.ReadString() + object.namespace = value + object.bitmap_ |= 2 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_service_account_builder.go b/clustersmgmt/v2alpha1/wif_service_account_builder.go new file mode 100644 index 00000000..06f8889d --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_service_account_builder.go @@ -0,0 +1,130 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifServiceAccountBuilder contains the data and logic needed to build 'wif_service_account' objects. +type WifServiceAccountBuilder struct { + bitmap_ uint32 + accessMethod WifAccessMethod + credentialRequest *WifCredentialRequestBuilder + osdRole string + roles []*WifRoleBuilder + serviceAccountId string +} + +// NewWifServiceAccount creates a new builder of 'wif_service_account' objects. +func NewWifServiceAccount() *WifServiceAccountBuilder { + return &WifServiceAccountBuilder{} +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifServiceAccountBuilder) Empty() bool { + return b == nil || b.bitmap_ == 0 +} + +// AccessMethod sets the value of the 'access_method' attribute to the given value. +func (b *WifServiceAccountBuilder) AccessMethod(value WifAccessMethod) *WifServiceAccountBuilder { + b.accessMethod = value + b.bitmap_ |= 1 + return b +} + +// CredentialRequest sets the value of the 'credential_request' attribute to the given value. +func (b *WifServiceAccountBuilder) CredentialRequest(value *WifCredentialRequestBuilder) *WifServiceAccountBuilder { + b.credentialRequest = value + if value != nil { + b.bitmap_ |= 2 + } else { + b.bitmap_ &^= 2 + } + return b +} + +// OsdRole sets the value of the 'osd_role' attribute to the given value. +func (b *WifServiceAccountBuilder) OsdRole(value string) *WifServiceAccountBuilder { + b.osdRole = value + b.bitmap_ |= 4 + return b +} + +// Roles sets the value of the 'roles' attribute to the given values. +func (b *WifServiceAccountBuilder) Roles(values ...*WifRoleBuilder) *WifServiceAccountBuilder { + b.roles = make([]*WifRoleBuilder, len(values)) + copy(b.roles, values) + b.bitmap_ |= 8 + return b +} + +// ServiceAccountId sets the value of the 'service_account_id' attribute to the given value. +func (b *WifServiceAccountBuilder) ServiceAccountId(value string) *WifServiceAccountBuilder { + b.serviceAccountId = value + b.bitmap_ |= 16 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifServiceAccountBuilder) Copy(object *WifServiceAccount) *WifServiceAccountBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.accessMethod = object.accessMethod + if object.credentialRequest != nil { + b.credentialRequest = NewWifCredentialRequest().Copy(object.credentialRequest) + } else { + b.credentialRequest = nil + } + b.osdRole = object.osdRole + if object.roles != nil { + b.roles = make([]*WifRoleBuilder, len(object.roles)) + for i, v := range object.roles { + b.roles[i] = NewWifRole().Copy(v) + } + } else { + b.roles = nil + } + b.serviceAccountId = object.serviceAccountId + return b +} + +// Build creates a 'wif_service_account' object using the configuration stored in the builder. +func (b *WifServiceAccountBuilder) Build() (object *WifServiceAccount, err error) { + object = new(WifServiceAccount) + object.bitmap_ = b.bitmap_ + object.accessMethod = b.accessMethod + if b.credentialRequest != nil { + object.credentialRequest, err = b.credentialRequest.Build() + if err != nil { + return + } + } + object.osdRole = b.osdRole + if b.roles != nil { + object.roles = make([]*WifRole, len(b.roles)) + for i, v := range b.roles { + object.roles[i], err = v.Build() + if err != nil { + return + } + } + } + object.serviceAccountId = b.serviceAccountId + return +} diff --git a/clustersmgmt/v2alpha1/wif_service_account_list_builder.go b/clustersmgmt/v2alpha1/wif_service_account_list_builder.go new file mode 100644 index 00000000..4e82a146 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_service_account_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifServiceAccountListBuilder contains the data and logic needed to build +// 'wif_service_account' objects. +type WifServiceAccountListBuilder struct { + items []*WifServiceAccountBuilder +} + +// NewWifServiceAccountList creates a new builder of 'wif_service_account' objects. +func NewWifServiceAccountList() *WifServiceAccountListBuilder { + return new(WifServiceAccountListBuilder) +} + +// Items sets the items of the list. +func (b *WifServiceAccountListBuilder) Items(values ...*WifServiceAccountBuilder) *WifServiceAccountListBuilder { + b.items = make([]*WifServiceAccountBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifServiceAccountListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifServiceAccountListBuilder) Copy(list *WifServiceAccountList) *WifServiceAccountListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifServiceAccountBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifServiceAccount().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_service_account' objects using the +// configuration stored in the builder. +func (b *WifServiceAccountListBuilder) Build() (list *WifServiceAccountList, err error) { + items := make([]*WifServiceAccount, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifServiceAccountList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_service_account_list_type_json.go b/clustersmgmt/v2alpha1/wif_service_account_list_type_json.go new file mode 100644 index 00000000..598d6e11 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_service_account_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifServiceAccountList writes a list of values of the 'wif_service_account' type to +// the given writer. +func MarshalWifServiceAccountList(list []*WifServiceAccount, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifServiceAccountList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifServiceAccountList writes a list of value of the 'wif_service_account' type to +// the given stream. +func writeWifServiceAccountList(list []*WifServiceAccount, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifServiceAccount(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifServiceAccountList reads a list of values of the 'wif_service_account' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifServiceAccountList(source interface{}) (items []*WifServiceAccount, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifServiceAccountList(iterator) + err = iterator.Error + return +} + +// readWifServiceAccountList reads list of values of the ”wif_service_account' type from +// the given iterator. +func readWifServiceAccountList(iterator *jsoniter.Iterator) []*WifServiceAccount { + list := []*WifServiceAccount{} + for iterator.ReadArray() { + item := readWifServiceAccount(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_service_account_type.go b/clustersmgmt/v2alpha1/wif_service_account_type.go new file mode 100644 index 00000000..95c6fabb --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_service_account_type.go @@ -0,0 +1,216 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifServiceAccount represents the values of the 'wif_service_account' type. +type WifServiceAccount struct { + bitmap_ uint32 + accessMethod WifAccessMethod + credentialRequest *WifCredentialRequest + osdRole string + roles []*WifRole + serviceAccountId string +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifServiceAccount) Empty() bool { + return o == nil || o.bitmap_ == 0 +} + +// AccessMethod returns the value of the 'access_method' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifServiceAccount) AccessMethod() WifAccessMethod { + if o != nil && o.bitmap_&1 != 0 { + return o.accessMethod + } + return WifAccessMethod("") +} + +// GetAccessMethod returns the value of the 'access_method' attribute and +// a flag indicating if the attribute has a value. +func (o *WifServiceAccount) GetAccessMethod() (value WifAccessMethod, ok bool) { + ok = o != nil && o.bitmap_&1 != 0 + if ok { + value = o.accessMethod + } + return +} + +// CredentialRequest returns the value of the 'credential_request' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifServiceAccount) CredentialRequest() *WifCredentialRequest { + if o != nil && o.bitmap_&2 != 0 { + return o.credentialRequest + } + return nil +} + +// GetCredentialRequest returns the value of the 'credential_request' attribute and +// a flag indicating if the attribute has a value. +func (o *WifServiceAccount) GetCredentialRequest() (value *WifCredentialRequest, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.credentialRequest + } + return +} + +// OsdRole returns the value of the 'osd_role' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifServiceAccount) OsdRole() string { + if o != nil && o.bitmap_&4 != 0 { + return o.osdRole + } + return "" +} + +// GetOsdRole returns the value of the 'osd_role' attribute and +// a flag indicating if the attribute has a value. +func (o *WifServiceAccount) GetOsdRole() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.osdRole + } + return +} + +// Roles returns the value of the 'roles' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifServiceAccount) Roles() []*WifRole { + if o != nil && o.bitmap_&8 != 0 { + return o.roles + } + return nil +} + +// GetRoles returns the value of the 'roles' attribute and +// a flag indicating if the attribute has a value. +func (o *WifServiceAccount) GetRoles() (value []*WifRole, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.roles + } + return +} + +// ServiceAccountId returns the value of the 'service_account_id' attribute, or +// the zero value of the type if the attribute doesn't have a value. +func (o *WifServiceAccount) ServiceAccountId() string { + if o != nil && o.bitmap_&16 != 0 { + return o.serviceAccountId + } + return "" +} + +// GetServiceAccountId returns the value of the 'service_account_id' attribute and +// a flag indicating if the attribute has a value. +func (o *WifServiceAccount) GetServiceAccountId() (value string, ok bool) { + ok = o != nil && o.bitmap_&16 != 0 + if ok { + value = o.serviceAccountId + } + return +} + +// WifServiceAccountListKind is the name of the type used to represent list of objects of +// type 'wif_service_account'. +const WifServiceAccountListKind = "WifServiceAccountList" + +// WifServiceAccountListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_service_account'. +const WifServiceAccountListLinkKind = "WifServiceAccountListLink" + +// WifServiceAccountNilKind is the name of the type used to nil lists of objects of +// type 'wif_service_account'. +const WifServiceAccountListNilKind = "WifServiceAccountListNil" + +// WifServiceAccountList is a list of values of the 'wif_service_account' type. +type WifServiceAccountList struct { + href string + link bool + items []*WifServiceAccount +} + +// Len returns the length of the list. +func (l *WifServiceAccountList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifServiceAccountList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifServiceAccountList) Get(i int) *WifServiceAccount { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifServiceAccountList) Slice() []*WifServiceAccount { + var slice []*WifServiceAccount + if l == nil { + slice = make([]*WifServiceAccount, 0) + } else { + slice = make([]*WifServiceAccount, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifServiceAccountList) Each(f func(item *WifServiceAccount) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifServiceAccountList) Range(f func(index int, item *WifServiceAccount) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_service_account_type_json.go b/clustersmgmt/v2alpha1/wif_service_account_type_json.go new file mode 100644 index 00000000..aa9c4dc2 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_service_account_type_json.go @@ -0,0 +1,139 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifServiceAccount writes a value of the 'wif_service_account' type to the given writer. +func MarshalWifServiceAccount(object *WifServiceAccount, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifServiceAccount(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifServiceAccount writes a value of the 'wif_service_account' type to the given stream. +func writeWifServiceAccount(object *WifServiceAccount, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + var present_ bool + present_ = object.bitmap_&1 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("access_method") + stream.WriteString(string(object.accessMethod)) + count++ + } + present_ = object.bitmap_&2 != 0 && object.credentialRequest != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("credential_request") + writeWifCredentialRequest(object.credentialRequest, stream) + count++ + } + present_ = object.bitmap_&4 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("osd_role") + stream.WriteString(object.osdRole) + count++ + } + present_ = object.bitmap_&8 != 0 && object.roles != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("roles") + writeWifRoleList(object.roles, stream) + count++ + } + present_ = object.bitmap_&16 != 0 + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_account_id") + stream.WriteString(object.serviceAccountId) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifServiceAccount reads a value of the 'wif_service_account' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifServiceAccount(source interface{}) (object *WifServiceAccount, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifServiceAccount(iterator) + err = iterator.Error + return +} + +// readWifServiceAccount reads a value of the 'wif_service_account' type from the given iterator. +func readWifServiceAccount(iterator *jsoniter.Iterator) *WifServiceAccount { + object := &WifServiceAccount{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "access_method": + text := iterator.ReadString() + value := WifAccessMethod(text) + object.accessMethod = value + object.bitmap_ |= 1 + case "credential_request": + value := readWifCredentialRequest(iterator) + object.credentialRequest = value + object.bitmap_ |= 2 + case "osd_role": + value := iterator.ReadString() + object.osdRole = value + object.bitmap_ |= 4 + case "roles": + value := readWifRoleList(iterator) + object.roles = value + object.bitmap_ |= 8 + case "service_account_id": + value := iterator.ReadString() + object.serviceAccountId = value + object.bitmap_ |= 16 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_template_builder.go b/clustersmgmt/v2alpha1/wif_template_builder.go new file mode 100644 index 00000000..78b17433 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_builder.go @@ -0,0 +1,105 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifTemplateBuilder contains the data and logic needed to build 'wif_template' objects. +// +// Definition of an wif_template resource. +type WifTemplateBuilder struct { + bitmap_ uint32 + id string + href string + serviceAccounts []*WifServiceAccountBuilder +} + +// NewWifTemplate creates a new builder of 'wif_template' objects. +func NewWifTemplate() *WifTemplateBuilder { + return &WifTemplateBuilder{} +} + +// Link sets the flag that indicates if this is a link. +func (b *WifTemplateBuilder) Link(value bool) *WifTemplateBuilder { + b.bitmap_ |= 1 + return b +} + +// ID sets the identifier of the object. +func (b *WifTemplateBuilder) ID(value string) *WifTemplateBuilder { + b.id = value + b.bitmap_ |= 2 + return b +} + +// HREF sets the link to the object. +func (b *WifTemplateBuilder) HREF(value string) *WifTemplateBuilder { + b.href = value + b.bitmap_ |= 4 + return b +} + +// Empty returns true if the builder is empty, i.e. no attribute has a value. +func (b *WifTemplateBuilder) Empty() bool { + return b == nil || b.bitmap_&^1 == 0 +} + +// ServiceAccounts sets the value of the 'service_accounts' attribute to the given values. +func (b *WifTemplateBuilder) ServiceAccounts(values ...*WifServiceAccountBuilder) *WifTemplateBuilder { + b.serviceAccounts = make([]*WifServiceAccountBuilder, len(values)) + copy(b.serviceAccounts, values) + b.bitmap_ |= 8 + return b +} + +// Copy copies the attributes of the given object into this builder, discarding any previous values. +func (b *WifTemplateBuilder) Copy(object *WifTemplate) *WifTemplateBuilder { + if object == nil { + return b + } + b.bitmap_ = object.bitmap_ + b.id = object.id + b.href = object.href + if object.serviceAccounts != nil { + b.serviceAccounts = make([]*WifServiceAccountBuilder, len(object.serviceAccounts)) + for i, v := range object.serviceAccounts { + b.serviceAccounts[i] = NewWifServiceAccount().Copy(v) + } + } else { + b.serviceAccounts = nil + } + return b +} + +// Build creates a 'wif_template' object using the configuration stored in the builder. +func (b *WifTemplateBuilder) Build() (object *WifTemplate, err error) { + object = new(WifTemplate) + object.id = b.id + object.href = b.href + object.bitmap_ = b.bitmap_ + if b.serviceAccounts != nil { + object.serviceAccounts = make([]*WifServiceAccount, len(b.serviceAccounts)) + for i, v := range b.serviceAccounts { + object.serviceAccounts[i], err = v.Build() + if err != nil { + return + } + } + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_template_client.go b/clustersmgmt/v2alpha1/wif_template_client.go new file mode 100644 index 00000000..747f16c5 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_client.go @@ -0,0 +1,307 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "time" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// WifTemplateClient is the client of the 'wif_template' resource. +// +// Manages a specific wif_template. +type WifTemplateClient struct { + transport http.RoundTripper + path string +} + +// NewWifTemplateClient creates a new client for the 'wif_template' +// resource using the given transport to send the requests and receive the +// responses. +func NewWifTemplateClient(transport http.RoundTripper, path string) *WifTemplateClient { + return &WifTemplateClient{ + transport: transport, + path: path, + } +} + +// Get creates a request for the 'get' method. +// +// Retrieves the details of the wif_template. +func (c *WifTemplateClient) Get() *WifTemplateGetRequest { + return &WifTemplateGetRequest{ + transport: c.transport, + path: c.path, + } +} + +// WifTemplatePollRequest is the request for the Poll method. +type WifTemplatePollRequest struct { + request *WifTemplateGetRequest + interval time.Duration + statuses []int + predicates []func(interface{}) bool +} + +// Parameter adds a query parameter to all the requests that will be used to retrieve the object. +func (r *WifTemplatePollRequest) Parameter(name string, value interface{}) *WifTemplatePollRequest { + r.request.Parameter(name, value) + return r +} + +// Header adds a request header to all the requests that will be used to retrieve the object. +func (r *WifTemplatePollRequest) Header(name string, value interface{}) *WifTemplatePollRequest { + r.request.Header(name, value) + return r +} + +// Interval sets the polling interval. This parameter is mandatory and must be greater than zero. +func (r *WifTemplatePollRequest) Interval(value time.Duration) *WifTemplatePollRequest { + r.interval = value + return r +} + +// Status set the expected status of the response. Multiple values can be set calling this method +// multiple times. The response will be considered successful if the status is any of those values. +func (r *WifTemplatePollRequest) Status(value int) *WifTemplatePollRequest { + r.statuses = append(r.statuses, value) + return r +} + +// Predicate adds a predicate that the response should satisfy be considered successful. Multiple +// predicates can be set calling this method multiple times. The response will be considered successful +// if all the predicates are satisfied. +func (r *WifTemplatePollRequest) Predicate(value func(*WifTemplateGetResponse) bool) *WifTemplatePollRequest { + r.predicates = append(r.predicates, func(response interface{}) bool { + return value(response.(*WifTemplateGetResponse)) + }) + return r +} + +// StartContext starts the polling loop. Responses will be considered successful if the status is one of +// the values specified with the Status method and if all the predicates specified with the Predicate +// method return nil. +// +// The context must have a timeout or deadline, otherwise this method will immediately return an error. +func (r *WifTemplatePollRequest) StartContext(ctx context.Context) (response *WifTemplatePollResponse, err error) { + result, err := helpers.PollContext(ctx, r.interval, r.statuses, r.predicates, r.task) + if result != nil { + response = &WifTemplatePollResponse{ + response: result.(*WifTemplateGetResponse), + } + } + return +} + +// task adapts the types of the request/response types so that they can be used with the generic +// polling function from the helpers package. +func (r *WifTemplatePollRequest) task(ctx context.Context) (status int, result interface{}, err error) { + response, err := r.request.SendContext(ctx) + if response != nil { + status = response.Status() + result = response + } + return +} + +// WifTemplatePollResponse is the response for the Poll method. +type WifTemplatePollResponse struct { + response *WifTemplateGetResponse +} + +// Status returns the response status code. +func (r *WifTemplatePollResponse) Status() int { + if r == nil { + return 0 + } + return r.response.Status() +} + +// Header returns header of the response. +func (r *WifTemplatePollResponse) Header() http.Header { + if r == nil { + return nil + } + return r.response.Header() +} + +// Error returns the response error. +func (r *WifTemplatePollResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.response.Error() +} + +// Body returns the value of the 'body' parameter. +func (r *WifTemplatePollResponse) Body() *WifTemplate { + return r.response.Body() +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *WifTemplatePollResponse) GetBody() (value *WifTemplate, ok bool) { + return r.response.GetBody() +} + +// Poll creates a request to repeatedly retrieve the object till the response has one of a given set +// of states and satisfies a set of predicates. +func (c *WifTemplateClient) Poll() *WifTemplatePollRequest { + return &WifTemplatePollRequest{ + request: c.Get(), + } +} + +// WifTemplateGetRequest is the request for the 'get' method. +type WifTemplateGetRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header +} + +// Parameter adds a query parameter. +func (r *WifTemplateGetRequest) Parameter(name string, value interface{}) *WifTemplateGetRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *WifTemplateGetRequest) Header(name string, value interface{}) *WifTemplateGetRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *WifTemplateGetRequest) Impersonate(user string) *WifTemplateGetRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *WifTemplateGetRequest) Send() (result *WifTemplateGetResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *WifTemplateGetRequest) SendContext(ctx context.Context) (result *WifTemplateGetResponse, err error) { + query := helpers.CopyQuery(r.query) + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &WifTemplateGetResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readWifTemplateGetResponse(result, reader) + if err != nil { + return + } + return +} + +// WifTemplateGetResponse is the response for the 'get' method. +type WifTemplateGetResponse struct { + status int + header http.Header + err *errors.Error + body *WifTemplate +} + +// Status returns the response status code. +func (r *WifTemplateGetResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *WifTemplateGetResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *WifTemplateGetResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Body returns the value of the 'body' parameter. +func (r *WifTemplateGetResponse) Body() *WifTemplate { + if r == nil { + return nil + } + return r.body +} + +// GetBody returns the value of the 'body' parameter and +// a flag indicating if the parameter has a value. +func (r *WifTemplateGetResponse) GetBody() (value *WifTemplate, ok bool) { + ok = r != nil && r.body != nil + if ok { + value = r.body + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_template_list_builder.go b/clustersmgmt/v2alpha1/wif_template_list_builder.go new file mode 100644 index 00000000..d68ccc08 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_list_builder.go @@ -0,0 +1,71 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifTemplateListBuilder contains the data and logic needed to build +// 'wif_template' objects. +type WifTemplateListBuilder struct { + items []*WifTemplateBuilder +} + +// NewWifTemplateList creates a new builder of 'wif_template' objects. +func NewWifTemplateList() *WifTemplateListBuilder { + return new(WifTemplateListBuilder) +} + +// Items sets the items of the list. +func (b *WifTemplateListBuilder) Items(values ...*WifTemplateBuilder) *WifTemplateListBuilder { + b.items = make([]*WifTemplateBuilder, len(values)) + copy(b.items, values) + return b +} + +// Empty returns true if the list is empty. +func (b *WifTemplateListBuilder) Empty() bool { + return b == nil || len(b.items) == 0 +} + +// Copy copies the items of the given list into this builder, discarding any previous items. +func (b *WifTemplateListBuilder) Copy(list *WifTemplateList) *WifTemplateListBuilder { + if list == nil || list.items == nil { + b.items = nil + } else { + b.items = make([]*WifTemplateBuilder, len(list.items)) + for i, v := range list.items { + b.items[i] = NewWifTemplate().Copy(v) + } + } + return b +} + +// Build creates a list of 'wif_template' objects using the +// configuration stored in the builder. +func (b *WifTemplateListBuilder) Build() (list *WifTemplateList, err error) { + items := make([]*WifTemplate, len(b.items)) + for i, item := range b.items { + items[i], err = item.Build() + if err != nil { + return + } + } + list = new(WifTemplateList) + list.items = items + return +} diff --git a/clustersmgmt/v2alpha1/wif_template_list_type_json.go b/clustersmgmt/v2alpha1/wif_template_list_type_json.go new file mode 100644 index 00000000..ad62a1b3 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_list_type_json.go @@ -0,0 +1,75 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifTemplateList writes a list of values of the 'wif_template' type to +// the given writer. +func MarshalWifTemplateList(list []*WifTemplate, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifTemplateList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifTemplateList writes a list of value of the 'wif_template' type to +// the given stream. +func writeWifTemplateList(list []*WifTemplate, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + writeWifTemplate(value, stream) + } + stream.WriteArrayEnd() +} + +// UnmarshalWifTemplateList reads a list of values of the 'wif_template' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWifTemplateList(source interface{}) (items []*WifTemplate, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWifTemplateList(iterator) + err = iterator.Error + return +} + +// readWifTemplateList reads list of values of the ”wif_template' type from +// the given iterator. +func readWifTemplateList(iterator *jsoniter.Iterator) []*WifTemplate { + list := []*WifTemplate{} + for iterator.ReadArray() { + item := readWifTemplate(iterator) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wif_template_resource_json.go b/clustersmgmt/v2alpha1/wif_template_resource_json.go new file mode 100644 index 00000000..37dac45f --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_resource_json.go @@ -0,0 +1,31 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import "io" + +func writeWifTemplateGetRequest(request *WifTemplateGetRequest, writer io.Writer) error { + return nil +} +func readWifTemplateGetResponse(response *WifTemplateGetResponse, reader io.Reader) error { + var err error + response.body, err = UnmarshalWifTemplate(reader) + return err +} diff --git a/clustersmgmt/v2alpha1/wif_template_type.go b/clustersmgmt/v2alpha1/wif_template_type.go new file mode 100644 index 00000000..64e3508d --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_type.go @@ -0,0 +1,244 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WifTemplateKind is the name of the type used to represent objects +// of type 'wif_template'. +const WifTemplateKind = "WifTemplate" + +// WifTemplateLinkKind is the name of the type used to represent links +// to objects of type 'wif_template'. +const WifTemplateLinkKind = "WifTemplateLink" + +// WifTemplateNilKind is the name of the type used to nil references +// to objects of type 'wif_template'. +const WifTemplateNilKind = "WifTemplateNil" + +// WifTemplate represents the values of the 'wif_template' type. +// +// Definition of an wif_template resource. +type WifTemplate struct { + bitmap_ uint32 + id string + href string + serviceAccounts []*WifServiceAccount +} + +// Kind returns the name of the type of the object. +func (o *WifTemplate) Kind() string { + if o == nil { + return WifTemplateNilKind + } + if o.bitmap_&1 != 0 { + return WifTemplateLinkKind + } + return WifTemplateKind +} + +// Link returns true iif this is a link. +func (o *WifTemplate) Link() bool { + return o != nil && o.bitmap_&1 != 0 +} + +// ID returns the identifier of the object. +func (o *WifTemplate) ID() string { + if o != nil && o.bitmap_&2 != 0 { + return o.id + } + return "" +} + +// GetID returns the identifier of the object and a flag indicating if the +// identifier has a value. +func (o *WifTemplate) GetID() (value string, ok bool) { + ok = o != nil && o.bitmap_&2 != 0 + if ok { + value = o.id + } + return +} + +// HREF returns the link to the object. +func (o *WifTemplate) HREF() string { + if o != nil && o.bitmap_&4 != 0 { + return o.href + } + return "" +} + +// GetHREF returns the link of the object and a flag indicating if the +// link has a value. +func (o *WifTemplate) GetHREF() (value string, ok bool) { + ok = o != nil && o.bitmap_&4 != 0 + if ok { + value = o.href + } + return +} + +// Empty returns true if the object is empty, i.e. no attribute has a value. +func (o *WifTemplate) Empty() bool { + return o == nil || o.bitmap_&^1 == 0 +} + +// ServiceAccounts returns the value of the 'service_accounts' attribute, or +// the zero value of the type if the attribute doesn't have a value. +// +// The list of service accounts and their associated roles that this template +// would require to be configured on the user's GCP project. +func (o *WifTemplate) ServiceAccounts() []*WifServiceAccount { + if o != nil && o.bitmap_&8 != 0 { + return o.serviceAccounts + } + return nil +} + +// GetServiceAccounts returns the value of the 'service_accounts' attribute and +// a flag indicating if the attribute has a value. +// +// The list of service accounts and their associated roles that this template +// would require to be configured on the user's GCP project. +func (o *WifTemplate) GetServiceAccounts() (value []*WifServiceAccount, ok bool) { + ok = o != nil && o.bitmap_&8 != 0 + if ok { + value = o.serviceAccounts + } + return +} + +// WifTemplateListKind is the name of the type used to represent list of objects of +// type 'wif_template'. +const WifTemplateListKind = "WifTemplateList" + +// WifTemplateListLinkKind is the name of the type used to represent links to list +// of objects of type 'wif_template'. +const WifTemplateListLinkKind = "WifTemplateListLink" + +// WifTemplateNilKind is the name of the type used to nil lists of objects of +// type 'wif_template'. +const WifTemplateListNilKind = "WifTemplateListNil" + +// WifTemplateList is a list of values of the 'wif_template' type. +type WifTemplateList struct { + href string + link bool + items []*WifTemplate +} + +// Kind returns the name of the type of the object. +func (l *WifTemplateList) Kind() string { + if l == nil { + return WifTemplateListNilKind + } + if l.link { + return WifTemplateListLinkKind + } + return WifTemplateListKind +} + +// Link returns true iif this is a link. +func (l *WifTemplateList) Link() bool { + return l != nil && l.link +} + +// HREF returns the link to the list. +func (l *WifTemplateList) HREF() string { + if l != nil { + return l.href + } + return "" +} + +// GetHREF returns the link of the list and a flag indicating if the +// link has a value. +func (l *WifTemplateList) GetHREF() (value string, ok bool) { + ok = l != nil && l.href != "" + if ok { + value = l.href + } + return +} + +// Len returns the length of the list. +func (l *WifTemplateList) Len() int { + if l == nil { + return 0 + } + return len(l.items) +} + +// Empty returns true if the list is empty. +func (l *WifTemplateList) Empty() bool { + return l == nil || len(l.items) == 0 +} + +// Get returns the item of the list with the given index. If there is no item with +// that index it returns nil. +func (l *WifTemplateList) Get(i int) *WifTemplate { + if l == nil || i < 0 || i >= len(l.items) { + return nil + } + return l.items[i] +} + +// Slice returns an slice containing the items of the list. The returned slice is a +// copy of the one used internally, so it can be modified without affecting the +// internal representation. +// +// If you don't need to modify the returned slice consider using the Each or Range +// functions, as they don't need to allocate a new slice. +func (l *WifTemplateList) Slice() []*WifTemplate { + var slice []*WifTemplate + if l == nil { + slice = make([]*WifTemplate, 0) + } else { + slice = make([]*WifTemplate, len(l.items)) + copy(slice, l.items) + } + return slice +} + +// Each runs the given function for each item of the list, in order. If the function +// returns false the iteration stops, otherwise it continues till all the elements +// of the list have been processed. +func (l *WifTemplateList) Each(f func(item *WifTemplate) bool) { + if l == nil { + return + } + for _, item := range l.items { + if !f(item) { + break + } + } +} + +// Range runs the given function for each index and item of the list, in order. If +// the function returns false the iteration stops, otherwise it continues till all +// the elements of the list have been processed. +func (l *WifTemplateList) Range(f func(index int, item *WifTemplate) bool) { + if l == nil { + return + } + for index, item := range l.items { + if !f(index, item) { + break + } + } +} diff --git a/clustersmgmt/v2alpha1/wif_template_type_json.go b/clustersmgmt/v2alpha1/wif_template_type_json.go new file mode 100644 index 00000000..27a0a0e8 --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_template_type_json.go @@ -0,0 +1,120 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWifTemplate writes a value of the 'wif_template' type to the given writer. +func MarshalWifTemplate(object *WifTemplate, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWifTemplate(object, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWifTemplate writes a value of the 'wif_template' type to the given stream. +func writeWifTemplate(object *WifTemplate, stream *jsoniter.Stream) { + count := 0 + stream.WriteObjectStart() + stream.WriteObjectField("kind") + if object.bitmap_&1 != 0 { + stream.WriteString(WifTemplateLinkKind) + } else { + stream.WriteString(WifTemplateKind) + } + count++ + if object.bitmap_&2 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("id") + stream.WriteString(object.id) + count++ + } + if object.bitmap_&4 != 0 { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("href") + stream.WriteString(object.href) + count++ + } + var present_ bool + present_ = object.bitmap_&8 != 0 && object.serviceAccounts != nil + if present_ { + if count > 0 { + stream.WriteMore() + } + stream.WriteObjectField("service_accounts") + writeWifServiceAccountList(object.serviceAccounts, stream) + } + stream.WriteObjectEnd() +} + +// UnmarshalWifTemplate reads a value of the 'wif_template' type from the given +// source, which can be an slice of bytes, a string or a reader. +func UnmarshalWifTemplate(source interface{}) (object *WifTemplate, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + object = readWifTemplate(iterator) + err = iterator.Error + return +} + +// readWifTemplate reads a value of the 'wif_template' type from the given iterator. +func readWifTemplate(iterator *jsoniter.Iterator) *WifTemplate { + object := &WifTemplate{} + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "kind": + value := iterator.ReadString() + if value == WifTemplateLinkKind { + object.bitmap_ |= 1 + } + case "id": + object.id = iterator.ReadString() + object.bitmap_ |= 2 + case "href": + object.href = iterator.ReadString() + object.bitmap_ |= 4 + case "service_accounts": + value := readWifServiceAccountList(iterator) + object.serviceAccounts = value + object.bitmap_ |= 8 + default: + iterator.ReadAny() + } + } + return object +} diff --git a/clustersmgmt/v2alpha1/wif_templates_client.go b/clustersmgmt/v2alpha1/wif_templates_client.go new file mode 100644 index 00000000..90d0318f --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_templates_client.go @@ -0,0 +1,350 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "bufio" + "context" + "io" + "net/http" + "net/url" + "path" + + "github.com/openshift-online/ocm-sdk-go/errors" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// WifTemplatesClient is the client of the 'wif_templates' resource. +// +// Manages the collection of wif_templates. +// wif_templates hold the GCP resource requirements for wif deployments. +// wif_config resources are based off of wif_templates during creation. +type WifTemplatesClient struct { + transport http.RoundTripper + path string +} + +// NewWifTemplatesClient creates a new client for the 'wif_templates' +// resource using the given transport to send the requests and receive the +// responses. +func NewWifTemplatesClient(transport http.RoundTripper, path string) *WifTemplatesClient { + return &WifTemplatesClient{ + transport: transport, + path: path, + } +} + +// List creates a request for the 'list' method. +// +// Retrieves the list of wif_templates +func (c *WifTemplatesClient) List() *WifTemplatesListRequest { + return &WifTemplatesListRequest{ + transport: c.transport, + path: c.path, + } +} + +// WifTemplate returns the target 'wif_template' resource for the given identifier. +// +// Returns a reference to the service that manages a specific wif_template. +func (c *WifTemplatesClient) WifTemplate(id string) *WifTemplateClient { + return NewWifTemplateClient( + c.transport, + path.Join(c.path, id), + ) +} + +// WifTemplatesListRequest is the request for the 'list' method. +type WifTemplatesListRequest struct { + transport http.RoundTripper + path string + query url.Values + header http.Header + order *string + page *int + search *string + size *int +} + +// Parameter adds a query parameter. +func (r *WifTemplatesListRequest) Parameter(name string, value interface{}) *WifTemplatesListRequest { + helpers.AddValue(&r.query, name, value) + return r +} + +// Header adds a request header. +func (r *WifTemplatesListRequest) Header(name string, value interface{}) *WifTemplatesListRequest { + helpers.AddHeader(&r.header, name, value) + return r +} + +// Impersonate wraps requests on behalf of another user. +// Note: Services that do not support this feature may silently ignore this call. +func (r *WifTemplatesListRequest) Impersonate(user string) *WifTemplatesListRequest { + helpers.AddImpersonationHeader(&r.header, user) + return r +} + +// Order sets the value of the 'order' parameter. +// +// Order criteria. +// +// The syntax of this parameter is similar to the syntax of the _order by_ clause of +// a SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to sort the clusters +// descending by region identifier the value should be: +// +// ```sql +// region.id desc +// ``` +// +// If the parameter isn't provided, or if the value is empty, then the order of the +// results is undefined. +func (r *WifTemplatesListRequest) Order(value string) *WifTemplatesListRequest { + r.order = &value + return r +} + +// Page sets the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *WifTemplatesListRequest) Page(value int) *WifTemplatesListRequest { + r.page = &value + return r +} + +// Search sets the value of the 'search' parameter. +// +// Search criteria. +// +// The syntax of this parameter is similar to the syntax of the _where_ clause of a +// SQL statement, but using the names of the attributes of the cluster instead of +// the names of the columns of a table. For example, in order to retrieve all the +// clusters with a name starting with `my` in the `us-east-1` region the value +// should be: +// +// ```sql +// name like 'my%' and region.id = 'us-east-1' +// ``` +// +// If the parameter isn't provided, or if the value is empty, then all the +// wif_templates that the user has permission to see will be returned. +func (r *WifTemplatesListRequest) Search(value string) *WifTemplatesListRequest { + r.search = &value + return r +} + +// Size sets the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *WifTemplatesListRequest) Size(value int) *WifTemplatesListRequest { + r.size = &value + return r +} + +// Send sends this request, waits for the response, and returns it. +// +// This is a potentially lengthy operation, as it requires network communication. +// Consider using a context and the SendContext method. +func (r *WifTemplatesListRequest) Send() (result *WifTemplatesListResponse, err error) { + return r.SendContext(context.Background()) +} + +// SendContext sends this request, waits for the response, and returns it. +func (r *WifTemplatesListRequest) SendContext(ctx context.Context) (result *WifTemplatesListResponse, err error) { + query := helpers.CopyQuery(r.query) + if r.order != nil { + helpers.AddValue(&query, "order", *r.order) + } + if r.page != nil { + helpers.AddValue(&query, "page", *r.page) + } + if r.search != nil { + helpers.AddValue(&query, "search", *r.search) + } + if r.size != nil { + helpers.AddValue(&query, "size", *r.size) + } + header := helpers.CopyHeader(r.header) + uri := &url.URL{ + Path: r.path, + RawQuery: query.Encode(), + } + request := &http.Request{ + Method: "GET", + URL: uri, + Header: header, + } + if ctx != nil { + request = request.WithContext(ctx) + } + response, err := r.transport.RoundTrip(request) + if err != nil { + return + } + defer response.Body.Close() + result = &WifTemplatesListResponse{} + result.status = response.StatusCode + result.header = response.Header + reader := bufio.NewReader(response.Body) + _, err = reader.Peek(1) + if err == io.EOF { + err = nil + return + } + if result.status >= 400 { + result.err, err = errors.UnmarshalErrorStatus(reader, result.status) + if err != nil { + return + } + err = result.err + return + } + err = readWifTemplatesListResponse(result, reader) + if err != nil { + return + } + return +} + +// WifTemplatesListResponse is the response for the 'list' method. +type WifTemplatesListResponse struct { + status int + header http.Header + err *errors.Error + items *WifTemplateList + page *int + size *int + total *int +} + +// Status returns the response status code. +func (r *WifTemplatesListResponse) Status() int { + if r == nil { + return 0 + } + return r.status +} + +// Header returns header of the response. +func (r *WifTemplatesListResponse) Header() http.Header { + if r == nil { + return nil + } + return r.header +} + +// Error returns the response error. +func (r *WifTemplatesListResponse) Error() *errors.Error { + if r == nil { + return nil + } + return r.err +} + +// Items returns the value of the 'items' parameter. +// +// Retrieved list of wif_templates. +func (r *WifTemplatesListResponse) Items() *WifTemplateList { + if r == nil { + return nil + } + return r.items +} + +// GetItems returns the value of the 'items' parameter and +// a flag indicating if the parameter has a value. +// +// Retrieved list of wif_templates. +func (r *WifTemplatesListResponse) GetItems() (value *WifTemplateList, ok bool) { + ok = r != nil && r.items != nil + if ok { + value = r.items + } + return +} + +// Page returns the value of the 'page' parameter. +// +// Index of the requested page, where one corresponds to the first page. +func (r *WifTemplatesListResponse) Page() int { + if r != nil && r.page != nil { + return *r.page + } + return 0 +} + +// GetPage returns the value of the 'page' parameter and +// a flag indicating if the parameter has a value. +// +// Index of the requested page, where one corresponds to the first page. +func (r *WifTemplatesListResponse) GetPage() (value int, ok bool) { + ok = r != nil && r.page != nil + if ok { + value = *r.page + } + return +} + +// Size returns the value of the 'size' parameter. +// +// Maximum number of items that will be contained in the returned page. +func (r *WifTemplatesListResponse) Size() int { + if r != nil && r.size != nil { + return *r.size + } + return 0 +} + +// GetSize returns the value of the 'size' parameter and +// a flag indicating if the parameter has a value. +// +// Maximum number of items that will be contained in the returned page. +func (r *WifTemplatesListResponse) GetSize() (value int, ok bool) { + ok = r != nil && r.size != nil + if ok { + value = *r.size + } + return +} + +// Total returns the value of the 'total' parameter. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *WifTemplatesListResponse) Total() int { + if r != nil && r.total != nil { + return *r.total + } + return 0 +} + +// GetTotal returns the value of the 'total' parameter and +// a flag indicating if the parameter has a value. +// +// Total number of items of the collection that match the search criteria, +// regardless of the size of the page. +func (r *WifTemplatesListResponse) GetTotal() (value int, ok bool) { + ok = r != nil && r.total != nil + if ok { + value = *r.total + } + return +} diff --git a/clustersmgmt/v2alpha1/wif_templates_resource_json.go b/clustersmgmt/v2alpha1/wif_templates_resource_json.go new file mode 100644 index 00000000..37408fba --- /dev/null +++ b/clustersmgmt/v2alpha1/wif_templates_resource_json.go @@ -0,0 +1,61 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +func writeWifTemplatesListRequest(request *WifTemplatesListRequest, writer io.Writer) error { + return nil +} +func readWifTemplatesListResponse(response *WifTemplatesListResponse, reader io.Reader) error { + iterator, err := helpers.NewIterator(reader) + if err != nil { + return err + } + for { + field := iterator.ReadObject() + if field == "" { + break + } + switch field { + case "page": + value := iterator.ReadInt() + response.page = &value + case "size": + value := iterator.ReadInt() + response.size = &value + case "total": + value := iterator.ReadInt() + response.total = &value + case "items": + items := readWifTemplateList(iterator) + response.items = &WifTemplateList{ + items: items, + } + default: + iterator.ReadAny() + } + } + return iterator.Error +} diff --git a/clustersmgmt/v2alpha1/wildcard_policy_list_type_json.go b/clustersmgmt/v2alpha1/wildcard_policy_list_type_json.go new file mode 100644 index 00000000..fbab5c2d --- /dev/null +++ b/clustersmgmt/v2alpha1/wildcard_policy_list_type_json.go @@ -0,0 +1,76 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +import ( + "io" + + jsoniter "github.com/json-iterator/go" + "github.com/openshift-online/ocm-sdk-go/helpers" +) + +// MarshalWildcardPolicyList writes a list of values of the 'wildcard_policy' type to +// the given writer. +func MarshalWildcardPolicyList(list []WildcardPolicy, writer io.Writer) error { + stream := helpers.NewStream(writer) + writeWildcardPolicyList(list, stream) + err := stream.Flush() + if err != nil { + return err + } + return stream.Error +} + +// writeWildcardPolicyList writes a list of value of the 'wildcard_policy' type to +// the given stream. +func writeWildcardPolicyList(list []WildcardPolicy, stream *jsoniter.Stream) { + stream.WriteArrayStart() + for i, value := range list { + if i > 0 { + stream.WriteMore() + } + stream.WriteString(string(value)) + } + stream.WriteArrayEnd() +} + +// UnmarshalWildcardPolicyList reads a list of values of the 'wildcard_policy' type +// from the given source, which can be a slice of bytes, a string or a reader. +func UnmarshalWildcardPolicyList(source interface{}) (items []WildcardPolicy, err error) { + iterator, err := helpers.NewIterator(source) + if err != nil { + return + } + items = readWildcardPolicyList(iterator) + err = iterator.Error + return +} + +// readWildcardPolicyList reads list of values of the ”wildcard_policy' type from +// the given iterator. +func readWildcardPolicyList(iterator *jsoniter.Iterator) []WildcardPolicy { + list := []WildcardPolicy{} + for iterator.ReadArray() { + text := iterator.ReadString() + item := WildcardPolicy(text) + list = append(list, item) + } + return list +} diff --git a/clustersmgmt/v2alpha1/wildcard_policy_type.go b/clustersmgmt/v2alpha1/wildcard_policy_type.go new file mode 100644 index 00000000..1dec5ce8 --- /dev/null +++ b/clustersmgmt/v2alpha1/wildcard_policy_type.go @@ -0,0 +1,30 @@ +/* +Copyright (c) 2020 Red Hat, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// IMPORTANT: This file has been generated automatically, refrain from modifying it manually as all +// your changes will be lost when the file is generated again. + +package v2alpha1 // github.com/openshift-online/ocm-sdk-go/clustersmgmt/v2alpha1 + +// WildcardPolicy represents the values of the 'wildcard_policy' enumerated type. +type WildcardPolicy string + +const ( + // Wildcards Allowed. + WildcardPolicyWildcardsAllowed WildcardPolicy = "WildcardsAllowed" + // Wildcards Disallowed. + WildcardPolicyWildcardsDisallowed WildcardPolicy = "WildcardsDisallowed" +) diff --git a/metrics/path_tree_data.go b/metrics/path_tree_data.go index 1a7e79f0..76779724 100644 --- a/metrics/path_tree_data.go +++ b/metrics/path_tree_data.go @@ -377,6 +377,218 @@ var pathTreeData = `{ "-": null }, "wif_templates": null + }, + "v2alpha1": { + "addons": { + "-": { + "versions": { + "-": null + } + } + }, + "aws_infrastructure_access_roles": { + "-": null + }, + "aws_inquiries": { + "machine_types": null, + "regions": null, + "sts_account_roles": null, + "sts_credential_requests": null, + "sts_policies": null, + "validate_credentials": null, + "vpcs": null + }, + "cloud_providers": { + "-": { + "available_regions": null, + "regions": { + "-": null + } + } + }, + "clusters": { + "-": { + "addon_inquiries": { + "-": null + }, + "addon_upgrade_policies": { + "-": { + "state": null + } + }, + "addons": { + "-": null + }, + "autoscaler": null, + "aws": { + "private_link_configuration": { + "principals": { + "-": null + } + }, + "role_policy_bindings": null + }, + "aws_infrastructure_access_role_grants": { + "-": null + }, + "break_glass_credentials": { + "-": null + }, + "clusterdeployment": null, + "control_plane": { + "upgrade_policies": { + "-": null + } + }, + "credentials": null, + "delete_protection": null, + "external_auth_config": { + "external_auths": { + "-": null + } + }, + "external_configuration": { + "labels": { + "-": null + }, + "manifests": { + "-": null + }, + "syncsets": { + "-": null + } + }, + "gate_agreements": { + "-": null + }, + "groups": { + "-": { + "users": { + "-": null + } + } + }, + "hibernate": null, + "hypershift": null, + "identity_providers": { + "-": { + "htpasswd_users": { + "-": null, + "import": null + } + } + }, + "inflight_checks": { + "-": null + }, + "ingresses": { + "-": null + }, + "kubelet_config": null, + "kubelet_configs": { + "-": null + }, + "limited_support_reasons": { + "-": null + }, + "logs": { + "install": null, + "uninstall": null + }, + "machine_pools": { + "-": null + }, + "metric_queries": { + "alerts": null, + "cluster_operators": null, + "cpu_total_by_node_roles_os": null, + "nodes": null, + "socket_total_by_node_roles_os": null + }, + "node_pools": { + "-": { + "upgrade_policies": { + "-": null + } + } + }, + "provision_shard": null, + "resources": { + "live": null + }, + "resume": null, + "status": null, + "sts_operator_roles": { + "-": null + }, + "sts_support_jump_role": null, + "tuning_configs": { + "-": null + }, + "upgrade_policies": { + "-": { + "state": null + } + }, + "vpc": null + } + }, + "dns_domains": { + "-": null + }, + "environment": null, + "events": null, + "flavours": { + "-": null + }, + "gcp_inquiries": { + "encryption_keys": null, + "key_rings": null, + "machine_types": null, + "regions": null, + "vpcs": null + }, + "limited_support_reason_templates": { + "-": null + }, + "load_balancer_quota_values": null, + "machine_types": { + "-": null + }, + "network_verifications": { + "-": null + }, + "oidc_configs": { + "-": null + }, + "pending_delete_clusters": { + "-": null + }, + "products": { + "-": { + "minimal_versions": { + "-": null + }, + "technology_previews": { + "-": null + } + } + }, + "provision_shards": { + "-": null + }, + "storage_quota_values": null, + "trusted_ip_addresses": null, + "version_gates": { + "-": null + }, + "versions": { + "-": null + }, + "wif_configs": { + "-": null + }, + "wif_templates": null } }, "job_queue": { diff --git a/openapi/clusters_mgmt/v2alpha1/openapi.json b/openapi/clusters_mgmt/v2alpha1/openapi.json new file mode 100644 index 00000000..104359ae --- /dev/null +++ b/openapi/clusters_mgmt/v2alpha1/openapi.json @@ -0,0 +1,18335 @@ +{ + "openapi": "3.0.0", + "info": { + "version": "v2alpha1", + "title": "clusters_mgmt", + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0" + }, + "contact": { + "name": "OCM Feedback", + "email": "ocm-feedback@redhat.com" + } + }, + "servers": [ + { + "description": "Production", + "url": "https://api.openshift.com" + }, + { + "description": "Stage", + "url": "https://api.stage.openshift.com" + } + ], + "paths": { + "/api/clusters_mgmt/v2alpha1": { + "get": { + "description": "Retrieves the version metadata.", + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/addons": { + "post": { + "description": "Create a new add-on and add it to the collection of add-ons.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOn" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOn" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of add-ons.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the add-on instead of\nthe names of the columns of a table. For example, in order to sort the add-ons\ndescending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the add-on instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nadd-ons with a name starting with `my` the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the add-ons\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of add-ons.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOn" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/addons/{addon_id}": { + "delete": { + "description": "Deletes the add-on.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the add-on.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOn" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the add-on.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOn" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOn" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/addons/{addon_id}/versions": { + "post": { + "description": "Create a new add-on version and add it to the collection of add-ons.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnVersion" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnVersion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of add-on versions.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the add-on instead of\nthe names of the columns of a table. For example, in order to sort the add-on\nversions descending by id the value should be:\n\n```sql\nid desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the add-on version instead\nof the names of the columns of a table. For example, in order to retrieve all the\nadd-on versions with an id starting with `0.1` the value should be:\n\n```sql\nid like '0.1.%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the add-on\nversions that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of add-on versions.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnVersion" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/addons/{addon_id}/versions/{version_id}": { + "delete": { + "description": "Deletes the add-on version.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "version_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the add-on version.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "version_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnVersion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the add-on version.", + "parameters": [ + { + "name": "addon_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "version_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnVersion" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnVersion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_infrastructure_access_roles": { + "get": { + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the role instead of\nthe names of the columns of a table. For example, in order to sort the roles\ndescending by dislay_name the value should be:\n\n```sql\ndisplay_name desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the role instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nrole with a name starting with `my`the value should be:\n\n```sql\ndisplay_name like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the roles\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of roles.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRole" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_infrastructure_access_roles/{aws_infrastructure_access_role_id}": { + "get": { + "description": "Retrieves the details of the aws infrastructure access role.", + "parameters": [ + { + "name": "aws_infrastructure_access_role_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRole" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/machine_types": { + "post": { + "description": "Retrieves the list of machine types in the provided region.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of machine types.", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachineType" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/regions": { + "post": { + "description": "Retrieves the list of available regions of the cloud provider.\nIMPORTANT: This list doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available regions\nof the provider.", + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of regions.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudRegion" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available regions of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/sts_account_roles": { + "post": { + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nbe the total number of STS account roles.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AWS" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "aws_account_id": { + "description": "The AWS Account Id for the STS Account Roles", + "type": "string" + }, + "items": { + "description": "Retrieved list of STS Account Roles", + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSSTSAccountRole" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nbe the total number of STS account roles.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of STS account roles", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/sts_credential_requests": { + "get": { + "description": "Retrieves the list of policies.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of CredRequest.", + "type": "array", + "items": { + "$ref": "#/components/schemas/STSCredentialRequest" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/sts_policies": { + "get": { + "description": "Retrieves the list of policies.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the awsstspolicies instead of\nthe names of the columns of a table. For example, in order to sort the policies\ndescending by operator type identifier the value should be:\n\n```sql\norderBy id desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the awsstspolicies instead of\nthe names of the columns of a table. For example, in order to retrieve all the\npolicies of type `operatorrole`\nshould be:\n\n```sql\npolicy_type like 'OperatorRole%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\npolicies will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of policies.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSSTSPolicy" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/validate_credentials": { + "post": { + "description": "Manages aws creds validation.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/aws_inquiries/vpcs": { + "post": { + "description": "Retrieves the list of available vpcs of the cloud provider for specific region.\nIMPORTANT: This collection doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available vpcs\nof the provider.", + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nvpcs of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of cloud VPC.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudVPC" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nvpcs of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available vpcs of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/cloud_providers": { + "get": { + "description": "Retrieves the list of cloud providers.", + "parameters": [ + { + "name": "fetchRegions", + "description": "If true, includes the regions on each provider in the output. Could slow request response time.", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the cloud provider\ninstead of the names of the columns of a table. For example, in order to sort the\nclusters descending by name identifier the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the cloud provider\ninstead of the names of the columns of a table. For example, in order to retrieve\nall the cloud providers with a name starting with `A` the value should be:\n\n```sql\nname like 'A%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the clusters\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of cloud providers.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudProvider" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/cloud_providers/{cloud_provider_id}": { + "get": { + "description": "Retrieves the details of the cloud provider.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProvider" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/cloud_providers/{cloud_provider_id}/available_regions": { + "post": { + "description": "Retrieves the list of available regions of the cloud provider.\n\nIMPORTANT: This collection doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available regions\nof the provider.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AWS" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of cloud regions.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudRegion" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available regions of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/cloud_providers/{cloud_provider_id}/regions": { + "post": { + "description": "Adds a cloud region to the database.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudRegion" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudRegion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of regions of the cloud provider.\n\nIMPORTANT: This collection doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of regions\nof the provider.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of cloud providers.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudRegion" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of regions of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/cloud_providers/{cloud_provider_id}/regions/{region_id}": { + "delete": { + "description": "Deletes the region.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "region_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the region.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "region_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudRegion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the region.", + "parameters": [ + { + "name": "cloud_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "region_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudRegion" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudRegion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters": { + "post": { + "description": "Provision a new cluster and add it to the collection of clusters.\n\nSee the `register_cluster` method for adding an existing cluster.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cluster" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cluster" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of clusters.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the cluster instead of\nthe names of the columns of a table. For example, in order to sort the clusters\ndescending by region identifier the value should be:\n\n```sql\nregion.id desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the cluster instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nclusters with a name starting with `my` in the `us-east-1` region the value\nshould be:\n\n```sql\nname like 'my%' and region.id = 'us-east-1'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\nclusters that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of clusters.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Cluster" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}": { + "delete": { + "description": "Deletes the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "best_effort", + "description": "BestEffort flag is used to check if the cluster deletion should be best-effort mode or not.", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "deprovision", + "description": "If false it will only delete from OCM but not the actual cluster resources.\nfalse is only allowed for OCP clusters. true by default.", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "dry_run", + "description": "Dry run flag is used to check if the operation can be completed, but won't delete.", + "in": "query", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cluster" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cluster" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Cluster" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/hibernate": { + "post": { + "description": "Initiates cluster hibernation. While hibernating a cluster will not consume any cloud provider infrastructure\nbut will be counted for quota.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/resume": { + "post": { + "description": "Resumes from Hibernation.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addon_inquiries": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the add-on instead of\nthe names of the columns of a table. For example, in order to sort the add-ons\ndescending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the add-on instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nadd-ons with a name starting with `my` the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the add-ons\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of add-ons.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOn" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addon_inquiries/{addon_inquiry_id}": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addon_inquiry_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOn" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addon_upgrade_policies": { + "post": { + "description": "Adds a new addon upgrade policy to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicy" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of addon upgrade policies.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of addon upgrade policy.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddonUpgradePolicy" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addon_upgrade_policies/{addon_upgrade_policy_id}": { + "delete": { + "description": "Deletes the addon upgrade policy.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addon_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the addon upgrade policy.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addon_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the addon upgrade policy.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addon_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicy" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addon_upgrade_policies/{addon_upgrade_policy_id}/state": { + "get": { + "description": "Retrieves the details of the upgrade policy state.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addon_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicyState" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the upgrade policy state.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addon_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicyState" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddonUpgradePolicyState" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addons": { + "post": { + "description": "Create a new add-on installation and add it to the collection of add-on installations on the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnInstallation" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnInstallation" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of add-on installations.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the add-on installation\ninstead of the names of the columns of a table. For example, in order to sort the\nadd-on installations descending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the add-on installation\ninstead of the names of the columns of a table. For example, in order to retrieve\nall the add-on installations with a name starting with `my` the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the add-on\ninstallations that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of add-on installations.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnInstallation" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/addons/{addoninstallation_id}": { + "delete": { + "description": "Delete an add-on installation and remove it from the collection of add-on installations on the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addoninstallation_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the add-on installation.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addoninstallation_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnInstallation" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the add-on installation.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "addoninstallation_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnInstallation" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddOnInstallation" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/autoscaler": { + "delete": { + "description": "Deletes the cluster autoscaler.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the autoscaler of a cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterAutoscaler" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "description": "Creates a new cluster autoscaler object.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterAutoscaler" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterAutoscaler" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the cluster autoscaler.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterAutoscaler" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterAutoscaler" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/aws/private_link_configuration": { + "get": { + "description": "Retrieves the details of the configuration for the Private Link.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkConfiguration" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/aws/private_link_configuration/principals": { + "post": { + "description": "Adds a new principal for the Private Link.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkPrincipal" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkPrincipal" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of principals.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause\nof an SQL statement, but using the names of the attributes of the role binding\ninstead of the names of the columns of a table. For example, in order to\nretrieve role bindings with role_id AuthenticatedUser:\n\n```sql\nrole_id = 'AuthenticatedUser'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\nitems that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of principals.", + "type": "array", + "items": { + "$ref": "#/components/schemas/PrivateLinkPrincipal" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/aws/private_link_configuration/principals/{principal_id}": { + "delete": { + "description": "Deletes the principal.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "principal_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the principal.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "principal_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkPrincipal" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/aws/role_policy_bindings": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "fetchCurrent", + "description": "If true, retrieves role policy binding states from AWS.", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of role policy bindings.", + "type": "array", + "items": { + "$ref": "#/components/schemas/RolePolicyBinding" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/aws_infrastructure_access_role_grants": { + "post": { + "description": "Create a new AWS infrastructure access role grant and add it to the collection of\nAWS infrastructure access role grants on the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleGrant" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleGrant" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of AWS infrastructure access role grants.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the AWS infrastructure access role grant\ninstead of the names of the columns of a table. For example, in order to sort the\nAWS infrastructure access role grants descending by user ARN the value should be:\n\n```sql\nuser_arn desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the AWS infrastructure access role grant\ninstead of the names of the columns of a table. For example, in order to retrieve\nall the AWS infrastructure access role grants with a user ARN starting with `user` the value should be:\n\n```sql\nuser_arn like '%user'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the AWS\ninfrastructure access role grants that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of AWS infrastructure access role grants.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleGrant" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/aws_infrastructure_access_role_grants/{aws_infrastructure_access_role_grant_id}": { + "delete": { + "description": "Deletes the AWS infrastructure access role grant.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "aws_infrastructure_access_role_grant_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the AWS infrastructure access role grant.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "aws_infrastructure_access_role_grant_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleGrant" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/break_glass_credentials": { + "post": { + "description": "Adds a new break glass credential to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BreakGlassCredential" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BreakGlassCredential" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "delete": { + "description": "Revokes all the break glass certificates signed by a specific signer.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of break glass credentials.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the break glass credentials\ninstead of the the names of the columns of a table. For example, in order to sort the\ncredentials descending by identifier the value should be:\n\n```sql\nid desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the break glass credentials\ninstead of the names of the columns of a table. For example, in order to retrieve all\nthe credentials with a specific username and status the following is required:\n\n```sql\nusername='user1' AND status='expired'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\nbreak glass credentials that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of break glass credentials.", + "type": "array", + "items": { + "$ref": "#/components/schemas/BreakGlassCredential" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/break_glass_credentials/{break_glass_credential_id}": { + "get": { + "description": "Retrieves the details of the break glass credential.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "break_glass_credential_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BreakGlassCredential" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/clusterdeployment": { + "delete": { + "description": "Deletes the clusterdeployment.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/control_plane/upgrade_policies": { + "post": { + "description": "Adds a new upgrade policy to the control plane of the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ControlPlaneUpgradePolicy" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ControlPlaneUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of upgrade policies for the control plane.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of upgrade policy.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ControlPlaneUpgradePolicy" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/control_plane/upgrade_policies/{control_plane_upgrade_policy_id}": { + "delete": { + "description": "Deletes the upgrade policy for the control plane.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "control_plane_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the upgrade policy for the control plane.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "control_plane_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ControlPlaneUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the upgrade policy for the control plane.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "control_plane_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ControlPlaneUpgradePolicy" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ControlPlaneUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/credentials": { + "get": { + "description": "Retrieves the details of the credentials of a cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterCredentials" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/delete_protection": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteProtection" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteProtection" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteProtection" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_auth_config": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalAuthConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_auth_config/external_auths": { + "post": { + "description": "Adds a new authentication to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalAuth" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalAuth" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of external authentications.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalAuth" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_auth_config/external_auths/{external_auth_id}": { + "delete": { + "description": "Deletes the external authentication.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "external_auth_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of an external authentication.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "external_auth_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalAuth" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the external authentication.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "external_auth_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalAuth" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalAuth" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration": { + "get": { + "description": "Retrieves the details of the external configuration.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExternalConfiguration" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration/labels": { + "post": { + "description": "Adds a new label to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of labels.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of labels.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration/labels/{label_id}": { + "delete": { + "description": "Deletes the label.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "label_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the label.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "label_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the label.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "label_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Label" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration/manifests": { + "post": { + "description": "Adds a new manifest to a cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Manifest" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Manifest" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of manifests.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of Manifests.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Manifest" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration/manifests/{manifest_id}": { + "delete": { + "description": "Deletes the manifest.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "manifest_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the manifest.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "manifest_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Manifest" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the manifest.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "manifest_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Manifest" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Manifest" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration/syncsets": { + "post": { + "description": "Adds a new syncset to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Syncset" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Syncset" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of syncsets.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of syncsets.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Syncset" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/external_configuration/syncsets/{syncset_id}": { + "delete": { + "description": "Deletes the syncset.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "syncset_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the syncset.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "syncset_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Syncset" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the syncset.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "syncset_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Syncset" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Syncset" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/gate_agreements": { + "post": { + "description": "Adds a new agreed version gate to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionGateAgreement" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionGateAgreement" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of reasons.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of version gate agreement.", + "type": "array", + "items": { + "$ref": "#/components/schemas/VersionGateAgreement" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/gate_agreements/{version_gate_agreement_id}": { + "delete": { + "description": "Deletes the version gate agreement.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "version_gate_agreement_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the version gate agreement.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "version_gate_agreement_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionGateAgreement" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/groups": { + "get": { + "description": "Retrieves the list of groups.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of groups.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Group" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/groups/{group_id}": { + "get": { + "description": "Retrieves the details of the group.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "group_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/groups/{group_id}/users": { + "post": { + "description": "Adds a new user to the group.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "group_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of users.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "group_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of users.", + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/groups/{group_id}/users/{user_id}": { + "delete": { + "description": "Deletes the user.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "group_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "user_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the user.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "group_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "user_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/hypershift": { + "get": { + "description": "Retrieves the Hypershift details for a single cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HypershiftConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the Hypershift details for a single cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HypershiftConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HypershiftConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/identity_providers": { + "post": { + "description": "Adds a new identity provider to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of identity providers.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of identity providers.", + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProvider" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/identity_providers/{identity_provider_id}": { + "delete": { + "description": "Deletes the identity provider.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the identity provider.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update identity provider in the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentityProvider" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/identity_providers/{identity_provider_id}/htpasswd_users": { + "post": { + "description": "Adds a new user to the _HTPasswd_ file.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTPasswdUser" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTPasswdUser" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of _HTPasswd_ IDP users.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of users of the IDP.", + "type": "array", + "items": { + "$ref": "#/components/schemas/HTPasswdUser" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/identity_providers/{identity_provider_id}/htpasswd_users/import": { + "post": { + "description": "Adds multiple new users to the _HTPasswd_ file.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "List of users to add to the IDP.", + "type": "array", + "items": { + "$ref": "#/components/schemas/HTPasswdUser" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Updated list of users of the IDP.", + "type": "array", + "items": { + "$ref": "#/components/schemas/HTPasswdUser" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/identity_providers/{identity_provider_id}/htpasswd_users/{htpasswd_user_id}": { + "delete": { + "description": "Deletes the user.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "htpasswd_user_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the user.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "htpasswd_user_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTPasswdUser" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the user's password. The username is not editable", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "identity_provider_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "htpasswd_user_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTPasswdUser" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTPasswdUser" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/inflight_checks": { + "get": { + "description": "Retrieves the list of inflight checks.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of inflight checks.", + "type": "array", + "items": { + "$ref": "#/components/schemas/InflightCheck" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/inflight_checks/{inflight_check_id}": { + "get": { + "description": "Retrieves the details of the inflight check.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "inflight_check_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InflightCheck" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/ingresses": { + "post": { + "description": "Adds a new ingress to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ingress" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ingress" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of ingresses.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of ingresses.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Ingress" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates all ingresses", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Ingress" + } + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Ingress" + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/ingresses/{ingress_id}": { + "delete": { + "description": "Deletes the ingress.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "ingress_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the ingress.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "ingress_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ingress" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the ingress.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "ingress_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ingress" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Ingress" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/kubelet_config": { + "delete": { + "description": "Deletes the cluster KubeletConfig", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the KubeletConfig for a cluster", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "description": "Creates a new cluster KubeletConfig", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the existing cluster KubeletConfig", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/kubelet_configs": { + "post": { + "description": "Adds a new KubeletConfig to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of KubeletConfigs for the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of KubeletConfigs.", + "type": "array", + "items": { + "$ref": "#/components/schemas/KubeletConfig" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/kubelet_configs/{kubelet_config_id}": { + "delete": { + "description": "Deletes the KubeletConfig specified by the id.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "kubelet_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the KubeletConfig specified by the id.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "kubelet_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the KubeletConfig specified by the id.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "kubelet_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/KubeletConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/limited_support_reasons": { + "post": { + "description": "Adds a new reason to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LimitedSupportReason" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LimitedSupportReason" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of reasons.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of template.", + "type": "array", + "items": { + "$ref": "#/components/schemas/LimitedSupportReason" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/limited_support_reasons/{limited_support_reason_id}": { + "delete": { + "description": "Deletes the reason.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "limited_support_reason_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the reason.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "limited_support_reason_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LimitedSupportReason" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/logs": { + "get": { + "description": "Retrieves the list of log links.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of log links.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Log" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/logs/install": { + "get": { + "description": "Retrieves the details of the log.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "offset", + "description": "Line offset to start logs from. if 0 retreive entire log.\nIf offset > #lines return an empty log.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "tail", + "description": "Returns the number of tail lines from the end of the log.\nIf there are no line breaks or the number of lines < tail\nreturn the entire log.\nEither 'tail' or 'offset' can be set. Not both. ", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Log" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/logs/uninstall": { + "get": { + "description": "Retrieves the details of the log.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "offset", + "description": "Line offset to start logs from. if 0 retreive entire log.\nIf offset > #lines return an empty log.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "tail", + "description": "Returns the number of tail lines from the end of the log.\nIf there are no line breaks or the number of lines < tail\nreturn the entire log.\nEither 'tail' or 'offset' can be set. Not both. ", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Log" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/machine_pools": { + "post": { + "description": "Adds a new machine pool to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachinePool" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachinePool" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of machine pools.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of machine pools.", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachinePool" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/machine_pools/{machine_pool_id}": { + "delete": { + "description": "Deletes the machine pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "machine_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the machine pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "machine_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachinePool" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the machine pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "machine_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachinePool" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachinePool" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/metric_queries/alerts": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertsInfo" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/metric_queries/cluster_operators": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterOperatorsInfo" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/metric_queries/cpu_total_by_node_roles_os": { + "get": { + "description": "Retrieves the metrics.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CPUTotalsNodeRoleOSMetricNode" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/metric_queries/nodes": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodesInfo" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/metric_queries/socket_total_by_node_roles_os": { + "get": { + "description": "Retrieves the metrics.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SocketTotalsNodeRoleOSMetricNode" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/node_pools": { + "post": { + "description": "Adds a new node pool to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePool" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePool" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of node pools.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the node pools instead of\nthe names of the columns of a table. For example, in order to sort the node pools\ndescending by identifier the value should be:\n\n```sql\nid desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the node pools instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nnode pools with replicas of two the following is required:\n\n```sql\nreplicas = 2\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\nnode pools that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of node pools.", + "type": "array", + "items": { + "$ref": "#/components/schemas/NodePool" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/node_pools/{node_pool_id}": { + "delete": { + "description": "Deletes the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePool" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePool" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePool" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/node_pools/{node_pool_id}/upgrade_policies": { + "post": { + "description": "Adds a new upgrade policy to the node pool of the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePoolUpgradePolicy" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePoolUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of upgrade policies for the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of upgrade policy.", + "type": "array", + "items": { + "$ref": "#/components/schemas/NodePoolUpgradePolicy" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/node_pools/{node_pool_id}/upgrade_policies/{node_pool_upgrade_policy_id}": { + "delete": { + "description": "Deletes the upgrade policy for the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the upgrade policy for the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePoolUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the upgrade policy for the node pool.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "node_pool_upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePoolUpgradePolicy" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NodePoolUpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/provision_shard": { + "delete": { + "description": "Delete the provision shard.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the provision shard.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the details of the provision shard.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/resources": { + "get": { + "description": "Retrieves a list of resources for a cluster in error state", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterResources" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/resources/live": { + "get": { + "description": "Retrieves currently available cluster resources", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterResources" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/status": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterStatus" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/sts_operator_roles": { + "post": { + "description": "Adds a new operator role to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OperatorIAMRole" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OperatorIAMRole" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of operator roles.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of operator roles.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OperatorIAMRole" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/sts_operator_roles/{operator_iam_role_id}": { + "delete": { + "description": "Deletes the operator role.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "operator_iam_role_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/sts_support_jump_role": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StsSupportJumpRole" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/tuning_configs": { + "post": { + "description": "Adds a new tuning config to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TuningConfig" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TuningConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of tuning configs.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of tuning configs.", + "type": "array", + "items": { + "$ref": "#/components/schemas/TuningConfig" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/tuning_configs/{tuning_config_id}": { + "delete": { + "description": "Deletes the tuning config.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "tuning_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the tuning config.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "tuning_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TuningConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the tuning config.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "tuning_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TuningConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TuningConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/upgrade_policies": { + "post": { + "description": "Adds a new upgrade policy to the cluster.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicy" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of upgrade policies.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of upgrade policy.", + "type": "array", + "items": { + "$ref": "#/components/schemas/UpgradePolicy" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/upgrade_policies/{upgrade_policy_id}": { + "delete": { + "description": "Deletes the upgrade policy.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the upgrade policy.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the upgrade policy.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicy" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicy" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/upgrade_policies/{upgrade_policy_id}/state": { + "get": { + "description": "Retrieves the details of the upgrade policy state.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicyState" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Update the upgrade policy state.", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "upgrade_policy_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicyState" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpgradePolicyState" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/clusters/{cluster_id}/vpc": { + "get": { + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudVPC" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/dns_domains": { + "post": { + "description": "Adds a DNS domain.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DNSDomain" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DNSDomain" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the dns domain instead of\nthe names of the columns of a table. For example, in order to retrieve all the\ndns domains with a ID starting with `02a5` should be:\n\n```sql\nid like '02a5%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\ndns domains that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved a list of DNS domains.", + "type": "array", + "items": { + "$ref": "#/components/schemas/DNSDomain" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/dns_domains/{dns_domain_id}": { + "delete": { + "description": "Delete the DNS domain.", + "parameters": [ + { + "name": "dns_domain_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the DNS domain.", + "parameters": [ + { + "name": "dns_domain_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DNSDomain" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/environment": { + "get": { + "description": "Retrieves the details of the environment.", + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the environment.\n\nAttributes that can be updated are:\n\n- `last_upgrade_available_check`\n- `last_limited_support_check`", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/events": { + "post": { + "description": "Adds a new event to be tracked. When sending a new event request,\nit gets tracked in Prometheus, Pendo, CloudWatch, or whichever\nanalytics client is configured as part of clusters service. This\nallows for reporting on events that happen outside of a regular API\nrequest, but are found to be useful for understanding customer\nneeds and possible blockers.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Event" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Event" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/flavours": { + "get": { + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the flavour instead of\nthe names of the columns of a table. For example, in order to sort the flavours\ndescending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the flavour instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nflavours with a name starting with `my`the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the flavours\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of flavours.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Flavour" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/flavours/{flavour_id}": { + "get": { + "description": "Retrieves the details of the cluster flavour.", + "parameters": [ + { + "name": "flavour_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Flavour" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the flavour.\n\nAttributes that can be updated are:\n\n- `aws.infra_volume`\n- `aws.infra_instance_type`\n- `gcp.infra_instance_type`", + "parameters": [ + { + "name": "flavour_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Flavour" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Flavour" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/gcp_inquiries/encryption_keys": { + "post": { + "description": "Retrieves the list of encryption keys.\nIMPORTANT: This collection doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available regions\nof the provider.", + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of encryption keys.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EncryptionKey" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available regions of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/gcp_inquiries/key_rings": { + "post": { + "description": "Retrieves the list of available key rings of the cloud provider.\nIMPORTANT: This collection doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available regions\nof the provider.", + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nkey rings of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of key rings.", + "type": "array", + "items": { + "$ref": "#/components/schemas/KeyRing" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nkey rings of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available key rings of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/gcp_inquiries/machine_types": { + "post": { + "description": "Retrieves the list of machine types in the provided region.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of machine types.", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachineType" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/gcp_inquiries/regions": { + "post": { + "description": "Retrieves the list of available regions of the cloud provider.\nIMPORTANT: This list doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available regions\nof the provider.", + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of regions.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudRegion" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nregions of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available regions of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/gcp_inquiries/vpcs": { + "post": { + "description": "Retrieves the list of available vpcs of the cloud provider for specific region.\nIMPORTANT: This collection doesn't currently support paging or searching, so the returned\n`page` will always be 1 and `size` and `total` will always be the total number of available vpcs\nof the provider.", + "parameters": [ + { + "name": "page", + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nvpcs of the provider.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudProviderData" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of cloud VPC.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudVPC" + } + }, + "page": { + "description": "Index of the returned page, where one corresponds to the first page. As this\ncollection doesn't support paging the result will always be `1`.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items that will be contained in the returned page. As this collection\ndoesn't support paging or searching the result will always be the total number of\nvpcs of the provider.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page. As this collection doesn't support paging or\nsearching the result will always be the total number of available vpcs of the provider.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/limited_support_reason_templates": { + "get": { + "description": "Retrieves the list of templates.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of template.", + "type": "array", + "items": { + "$ref": "#/components/schemas/LimitedSupportReasonTemplate" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/limited_support_reason_templates/{limited_support_reason_template_id}": { + "get": { + "description": "Retrieves the details of the template.", + "parameters": [ + { + "name": "limited_support_reason_template_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LimitedSupportReasonTemplate" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/load_balancer_quota_values": { + "get": { + "description": "Retrieves the list of Load Balancer Quota Values.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of values.", + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/machine_types": { + "get": { + "description": "Retrieves the list of machine types.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the machine type\ninstead of the names of the columns of a table. For example, in order to sort the\nmachine types descending by name identifier the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the machine type\ninstead of the names of the columns of a table. For example, in order to retrieve\nall the machine types with a name starting with `A` the value should be:\n\n```sql\nname like 'A%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the machine\ntypes that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of cloud providers.", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachineType" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/machine_types/{machine_type_id}": { + "get": { + "description": "Retrieves the details of the machine type.", + "parameters": [ + { + "name": "machine_type_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MachineType" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/network_verifications": { + "post": { + "description": "Creates an entry for a network verification for each subnet supplied setting then to initial state.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NetworkVerification" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NetworkVerification" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/network_verifications/{network_verification_id}": { + "get": { + "description": "Retrieves the details of a subnet network verification.", + "parameters": [ + { + "name": "network_verification_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubnetNetworkVerification" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/oidc_configs": { + "post": { + "description": "Creates a hosting under Red Hat's S3 bucket for byo oidc configuration.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OidcConfig" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OidcConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of oidc configs.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of identity providers.", + "type": "array", + "items": { + "$ref": "#/components/schemas/OidcConfig" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/oidc_configs/{oidc_config_id}": { + "delete": { + "description": "Deletes the OidcConfig.", + "parameters": [ + { + "name": "oidc_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of an OidcConfig.", + "parameters": [ + { + "name": "oidc_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OidcConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates attributes of an OidcConfig.", + "parameters": [ + { + "name": "oidc_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OidcConfig" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OidcConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/pending_delete_clusters": { + "get": { + "description": "Retrieves the list of pending delete clusters.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the pending delete cluster instead of\nthe names of the columns of a table. For example, in order to sort the pending delete clusters\ndescending by creation timestamp (i.e. their deletion time) the value should be:\n\n```sql\ncreation_timestamp desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the pending delete cluster instead of\nthe names of the columns of a table. For example, in order to retrieve all the\npending delete clusters with creation time later than 2023-03-01T00:00:00Z the following is required:\n\n```sql\ncreation_timestamp > '2023-03-01T00:00:00Z'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\npending delete clusters that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of pending delete clusters.", + "type": "array", + "items": { + "$ref": "#/components/schemas/PendingDeleteCluster" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/pending_delete_clusters/{pending_delete_cluster_id}": { + "get": { + "description": "Retrieves the details of the pending delete cluster.", + "parameters": [ + { + "name": "pending_delete_cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PendingDeleteCluster" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the pending delete cluster entry.", + "parameters": [ + { + "name": "pending_delete_cluster_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PendingDeleteCluster" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PendingDeleteCluster" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/products": { + "get": { + "description": "Retrieves the list of products.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the product instead of\nthe names of the columns of a table. For example, in order to sort the products\ndescending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the product instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nproducts with a name starting with `my` the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the products\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of products.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Product" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/products/{product_id}": { + "get": { + "description": "Retrieves the details of the product.", + "parameters": [ + { + "name": "product_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Product" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/products/{product_id}/minimal_versions": { + "get": { + "description": "Retrieves the list of product minimal versions.", + "parameters": [ + { + "name": "product_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the product instead of\nthe names of the columns of a table. For example, in order to sort the products\ndescending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the product instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nproducts with a name starting with `my` the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the products\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of product minimal versions.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ProductMinimalVersion" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/products/{product_id}/minimal_versions/{minimal_version_id}": { + "get": { + "description": "Retrieves the details of the product minimal version.", + "parameters": [ + { + "name": "product_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "minimal_version_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductMinimalVersion" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/products/{product_id}/technology_previews": { + "get": { + "description": "Retrieves the list of product technology previews.", + "parameters": [ + { + "name": "product_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the product instead of\nthe names of the columns of a table. For example, in order to sort the products\ndescending by name the value should be:\n\n```sql\nname desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the product instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nproducts with a name starting with `my` the value should be:\n\n```sql\nname like 'my%'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the products\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of product technology previews.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ProductTechnologyPreview" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/products/{product_id}/technology_previews/{technology_preview_id}": { + "get": { + "description": "Retrieves the details of the product technology preview.", + "parameters": [ + { + "name": "product_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "technology_preview_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductTechnologyPreview" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/provision_shards": { + "post": { + "description": "Adds a provision shard.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the cluster instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nclusters with a name starting with `my` in the `us-east-1` region the value\nshould be:\n\n```sql\nname like 'my%' and region.id = 'us-east-1'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\nprovision shards that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved a list of provision shards.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ProvisionShard" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/provision_shards/{provision_shard_id}": { + "delete": { + "description": "Delete the provision shard.", + "parameters": [ + { + "name": "provision_shard_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the provision shard.", + "parameters": [ + { + "name": "provision_shard_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "patch": { + "description": "Updates the details of the provision shard.", + "parameters": [ + { + "name": "provision_shard_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProvisionShard" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/storage_quota_values": { + "get": { + "description": "Retrieves the list of Storage Quota Values.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of values.", + "type": "array", + "items": { + "$ref": "#/components/schemas/StorageQuota" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/trusted_ip_addresses": { + "get": { + "description": "Retrieves the list of trusted ip addresses.", + "parameters": [ + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "size", + "description": "Number of items contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of trusted ip addresses.", + "type": "array", + "items": { + "$ref": "#/components/schemas/TrustedIp" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Number of items contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/version_gates": { + "post": { + "description": "Adds a new version gate", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionGate" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionGate" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves a list of version gates.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\nan SQL statement, but using the names of the attributes of the version gate instead of\nthe names of the columns of a table. For example, in order to sort the version gates\ndescending by identifier the value should be:\n\n```sql\nid desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of an\nSQL statement, but using the names of the attributes of the version gate instead of\nthe names of the columns of a table.\n\nIf the parameter isn't provided, or if the value is empty, then all the version gates\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.\n\nDefault value is `100`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of version gates.", + "type": "array", + "items": { + "$ref": "#/components/schemas/VersionGate" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.\n\nDefault value is `100`.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/version_gates/{version_gate_id}": { + "delete": { + "description": "Deletes the version gate.", + "parameters": [ + { + "name": "version_gate_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the version gate.", + "parameters": [ + { + "name": "version_gate_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionGate" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/versions": { + "get": { + "description": "Retrieves a list of versions.", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the version instead of\nthe names of the columns of a table. For example, in order to sort the versions\ndescending by identifier the value should be:\n\n```sql\nid desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the version instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nversions that are enabled:\n\n```sql\nenabled = 't'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the versions\nthat the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.\n\nDefault value is `100`.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of versions.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Version" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.\n\nDefault value is `100`.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/versions/{version_id}": { + "get": { + "description": "Retrieves the details of the version.", + "parameters": [ + { + "name": "version_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Version" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/wif_configs": { + "post": { + "description": "Provision a new wif_config resource and add it to the collection of wif_configs.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WifConfig" + } + } + } + }, + "responses": { + "201": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WifConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the list of wif_configs", + "parameters": [ + { + "name": "order", + "description": "Order criteria.\n\nThe syntax of this parameter is similar to the syntax of the _order by_ clause of\na SQL statement, but using the names of the attributes of the cluster instead of\nthe names of the columns of a table. For example, in order to sort the clusters\ndescending by region identifier the value should be:\n\n```sql\nregion.id desc\n```\n\nIf the parameter isn't provided, or if the value is empty, then the order of the\nresults is undefined.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "description": "Index of the requested page, where one corresponds to the first page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "search", + "description": "Search criteria.\n\nThe syntax of this parameter is similar to the syntax of the _where_ clause of a\nSQL statement, but using the names of the attributes of the cluster instead of\nthe names of the columns of a table. For example, in order to retrieve all the\nclusters with a name starting with `my` in the `us-east-1` region the value\nshould be:\n\n```sql\nname like 'my%' and region.id = 'us-east-1'\n```\n\nIf the parameter isn't provided, or if the value is empty, then all the\nwif_configs that the user has permission to see will be returned.", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "size", + "description": "Maximum number of items that will be contained in the returned page.", + "in": "query", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "description": "Retrieved list of wif_configs.", + "type": "array", + "items": { + "$ref": "#/components/schemas/WifConfig" + } + }, + "page": { + "description": "Index of the requested page, where one corresponds to the first page.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Maximum number of items that will be contained in the returned page.", + "type": "integer", + "format": "int32" + }, + "total": { + "description": "Total number of items of the collection that match the search criteria,\nregardless of the size of the page.", + "type": "integer", + "format": "int32" + } + } + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/wif_configs/{wif_config_id}": { + "delete": { + "description": "Deletes the wif_config.", + "parameters": [ + { + "name": "wif_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "dry_run", + "description": "Dry run flag is used to check if the operation can be completed, but won't delete.", + "in": "query", + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "204": { + "description": "Success." + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "get": { + "description": "Retrieves the details of the WifConfig.", + "parameters": [ + { + "name": "wif_config_id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WifConfig" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/api/clusters_mgmt/v2alpha1/wif_templates": { + "get": { + "description": "Retrieves the details of the wif_template.", + "responses": { + "200": { + "description": "Success.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WifTemplate" + } + } + } + }, + "default": { + "description": "Error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Metadata": { + "description": "Version metadata.", + "properties": { + "server_version": { + "description": "Version of the server.", + "type": "string" + } + } + }, + "AMIOverride": { + "description": "AMIOverride specifies what Amazon Machine Image should be used for a particular product and region.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AMIOverride' if this is a complete object or 'AMIOverrideLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "ami": { + "description": "AMI is the id of the Amazon Machine Image.", + "type": "string" + }, + "product": { + "description": "Link to the product type.", + "$ref": "#/components/schemas/Product" + }, + "region": { + "description": "Link to the cloud provider region.", + "$ref": "#/components/schemas/CloudRegion" + } + } + }, + "AWS": { + "description": "_Amazon Web Services_ specific settings of a cluster.", + "properties": { + "kms_key_arn": { + "description": "Customer Managed Key to encrypt EBS Volume", + "type": "string" + }, + "sts": { + "description": "Contains the necessary attributes to support role-based authentication on AWS.", + "$ref": "#/components/schemas/STS" + }, + "access_key_id": { + "description": "AWS access key identifier.", + "type": "string" + }, + "account_id": { + "description": "AWS account identifier.", + "type": "string" + }, + "additional_allowed_principals": { + "description": "Additional allowed principal ARNs to be added to the hosted control plane's VPC Endpoint Service.", + "type": "array", + "items": { + "type": "string" + } + }, + "additional_compute_security_group_ids": { + "description": "Additional AWS Security Groups to be added to default worker (compute) machine pool.", + "type": "array", + "items": { + "type": "string" + } + }, + "additional_control_plane_security_group_ids": { + "description": "Additional AWS Security Groups to be added to default control plane machine pool.", + "type": "array", + "items": { + "type": "string" + } + }, + "additional_infra_security_group_ids": { + "description": "Additional AWS Security Groups to be added to default infra machine pool.", + "type": "array", + "items": { + "type": "string" + } + }, + "audit_log": { + "description": "Audit log forwarding configuration", + "$ref": "#/components/schemas/AuditLog" + }, + "billing_account_id": { + "description": "BillingAccountID is the account used for billing subscriptions purchased via the marketplace", + "type": "string" + }, + "ec2_metadata_http_tokens": { + "description": "Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances", + "$ref": "#/components/schemas/Ec2MetadataHttpTokens" + }, + "etcd_encryption": { + "description": "Related etcd encryption configuration", + "$ref": "#/components/schemas/AwsEtcdEncryption" + }, + "private_hosted_zone_id": { + "description": "ID of private hosted zone.", + "type": "string" + }, + "private_hosted_zone_role_arn": { + "description": "Role ARN for private hosted zone.", + "type": "string" + }, + "private_link": { + "description": "Sets cluster to be inaccessible externally.", + "type": "boolean" + }, + "private_link_configuration": { + "description": "Manages additional configuration for Private Links.", + "$ref": "#/components/schemas/PrivateLinkClusterConfiguration" + }, + "secret_access_key": { + "description": "AWS secret access key.", + "type": "string" + }, + "subnet_ids": { + "description": "The subnet ids to be used when installing the cluster.", + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "description": "Optional keys and values that the installer will add as tags to all AWS resources it creates", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "AWSFlavour": { + "description": "Specification for different classes of nodes inside a flavour.", + "properties": { + "compute_instance_type": { + "description": "AWS default instance type for the worker volume.\n\nUser can be overridden specifying in the cluster itself a type for compute node.", + "type": "string" + }, + "infra_instance_type": { + "description": "AWS default instance type for the infra volume.", + "type": "string" + }, + "infra_volume": { + "description": "Infra volume specification.", + "$ref": "#/components/schemas/AWSVolume" + }, + "master_instance_type": { + "description": "AWS default instance type for the master volume.", + "type": "string" + }, + "master_volume": { + "description": "Master volume specification.", + "$ref": "#/components/schemas/AWSVolume" + }, + "worker_volume": { + "description": "Worker volume specification.", + "$ref": "#/components/schemas/AWSVolume" + } + } + }, + "AWSInfrastructureAccessRole": { + "description": "A set of acces permissions for AWS resources", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AWSInfrastructureAccessRole' if this is a complete object or 'AWSInfrastructureAccessRoleLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "description": { + "description": "Description of the role.", + "type": "string" + }, + "display_name": { + "description": "Human friendly identifier of the role, for example `Read only`.", + "type": "string" + }, + "state": { + "description": "State of the role.", + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleState" + } + } + }, + "AWSInfrastructureAccessRoleGrant": { + "description": "Representation of an AWS infrastructure access role grant.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AWSInfrastructureAccessRoleGrant' if this is a complete object or 'AWSInfrastructureAccessRoleGrantLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "console_url": { + "description": "URL to switch to the role in AWS console.", + "type": "string" + }, + "role": { + "description": "Link to AWS infrastructure access role.\nGrant must use a 'valid' role. ", + "$ref": "#/components/schemas/AWSInfrastructureAccessRole" + }, + "state": { + "description": "State of the grant.", + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleGrantState" + }, + "state_description": { + "description": "Description of the state.\nWill be empty unless state is 'Failed'.", + "type": "string" + }, + "user_arn": { + "description": "The user AWS IAM ARN we want to grant the role.", + "type": "string" + } + } + }, + "AWSInfrastructureAccessRoleGrantState": { + "description": "State of an AWS infrastructure access role grant.", + "type": "string", + "enum": [ + "deleting", + "failed", + "pending", + "ready", + "removed" + ] + }, + "AWSInfrastructureAccessRoleState": { + "description": "State of an AWS infrastructure access role.", + "type": "string", + "enum": [ + "invalid", + "removed", + "valid" + ] + }, + "AWSMachinePool": { + "description": "Representation of aws machine pool specific parameters.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AWSMachinePool' if this is a complete object or 'AWSMachinePoolLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "additional_security_group_ids": { + "description": "Additional AWS Security Groups to be added machine pool. Note that machine pools can only be worker node at the time.", + "type": "array", + "items": { + "type": "string" + } + }, + "availability_zone_types": { + "description": "Associates nodepool availability zones with zone types (e.g. wavelength, local).", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "spot_market_options": { + "description": "Use spot instances on this machine pool to reduce cost.", + "$ref": "#/components/schemas/AWSSpotMarketOptions" + }, + "subnet_outposts": { + "description": "Associates nodepool subnets with AWS Outposts.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "tags": { + "description": "Optional keys and values that the machine pool provisioner will add as AWS tags to all AWS resources it creates.\n\nAWS tags must conform to the following standards:\n- Each resource may have a maximum of 25 tags\n- Tags beginning with \"aws:\" are reserved for system use and may not be set\n- Tag keys may be between 1 and 128 characters in length\n- Tag values may be between 0 and 256 characters in length\n- Tags may only contain letters, numbers, spaces, and the following characters: [_ . : / = + - @]", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "AWSNodePool": { + "description": "Representation of aws node pool specific parameters.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AWSNodePool' if this is a complete object or 'AWSNodePoolLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "additional_security_group_ids": { + "description": "Additional AWS Security Groups to be added node pool.", + "type": "array", + "items": { + "type": "string" + } + }, + "availability_zone_types": { + "description": "Associates nodepool availability zones with zone types (e.g. wavelength, local).", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "ec2_metadata_http_tokens": { + "description": "Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances", + "$ref": "#/components/schemas/Ec2MetadataHttpTokens" + }, + "instance_profile": { + "description": "InstanceProfile is the AWS EC2 instance profile, which is a container for an IAM role that the EC2 instance uses.", + "type": "string" + }, + "instance_type": { + "description": "InstanceType is an ec2 instance type for node instances (e.g. m5.large).", + "type": "string" + }, + "subnet_outposts": { + "description": "Associates nodepool subnets with AWS Outposts.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "tags": { + "description": "Optional keys and values that the installer will add as tags to all AWS resources it creates.\n\nAWS tags must conform to the following standards:\n- Each resource may have a maximum of 25 tags\n- Tags beginning with \"aws:\" are reserved for system use and may not be set\n- Tag keys may be between 1 and 128 characters in length\n- Tag values may be between 0 and 256 characters in length\n- Tags may only contain letters, numbers, spaces, and the following characters: [_ . : / = + - @]", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "AWSSpotMarketOptions": { + "description": "Spot market options for AWS machine pool.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AWSSpotMarketOptions' if this is a complete object or 'AWSSpotMarketOptionsLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "max_price": { + "description": "The max price for spot instance. Optional.\nIf not set, use the on-demand price.", + "type": "number", + "format": "float" + } + } + }, + "AWSVolume": { + "description": "Holds settings for an AWS storage volume.", + "properties": { + "iops": { + "description": "Volume provisioned IOPS.", + "type": "integer", + "format": "int32" + }, + "size": { + "description": "Volume size in Gib.", + "type": "integer", + "format": "int32" + } + } + }, + "AWSSTSAccountRole": { + "description": "Representation of an sts account role for a rosa cluster", + "properties": { + "items": { + "description": "The list of STS Roles for this Account Role", + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSSTSRole" + } + }, + "prefix": { + "description": "The Prefix for this Account Role", + "type": "string" + } + } + }, + "AWSSTSPolicy": { + "description": "Representation of an sts policies for rosa cluster", + "properties": { + "arn": { + "description": "The ARN of the managed policy", + "type": "string" + }, + "id": { + "description": "Policy ID", + "type": "string" + }, + "details": { + "description": "Policy Details", + "type": "string" + }, + "type": { + "description": "Type of policy operator/account role", + "type": "string" + } + } + }, + "AWSSTSRole": { + "description": "Representation of an sts role for a rosa cluster", + "properties": { + "hcpManagedPolicies": { + "description": "Does this Role have HCP Managed Policies?", + "type": "boolean" + }, + "isAdmin": { + "description": "Does this role have Admin permission?", + "type": "boolean" + }, + "managedPolicies": { + "description": "Does this Role have Managed Policies?", + "type": "boolean" + }, + "arn": { + "description": "The AWS ARN for this Role", + "type": "string" + }, + "type": { + "description": "The type of this Role", + "type": "string" + }, + "roleVersion": { + "description": "The Openshift Version for this Role", + "type": "string" + } + } + }, + "CCS": { + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'CCS' if this is a complete object or 'CCSLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "disable_scp_checks": { + "description": "Indicates if cloud permissions checks are disabled,\nwhen attempting installation of the cluster.", + "type": "boolean" + }, + "enabled": { + "description": "Indicates if Customer Cloud Subscription is enabled on the cluster.", + "type": "boolean" + } + } + }, + "CPUTotalNodeRoleOSMetricNode": { + "description": "Representation of information from telemetry about a the CPU capacity by node role and OS.", + "properties": { + "cpu_total": { + "description": "The total CPU capacity of nodes with this set of roles and operating system.", + "type": "number", + "format": "float" + }, + "node_roles": { + "description": "Representation of the node role for a cluster.", + "type": "array", + "items": { + "type": "string" + } + }, + "operating_system": { + "description": "The operating system.", + "type": "string" + }, + "time": { + "type": "string", + "format": "date-time" + } + } + }, + "CPUTotalsNodeRoleOSMetricNode": { + "description": "Representation of information from telemetry about the CPU capacity by node\nrole and OS of a cluster.", + "properties": { + "cpu_totals": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CPUTotalNodeRoleOSMetricNode" + } + } + } + }, + "DNS": { + "description": "DNS settings of the cluster.", + "properties": { + "base_domain": { + "description": "Base DNS domain of the cluster.\n\nDuring the installation of the cluster it is necessary to create multiple DNS records.\nThey will be created as sub-domains of this domain. For example, if the domain_prefix of the\ncluster is `mycluster` and the base domain is `example.com` then the following DNS\nrecords will be created:\n\n```\nmycluster-api.example.com\nmycluster-etcd-0.example.com\nmycluster-etcd-1.example.com\nmycluster-etcd-3.example.com\n```\n\nThe exact number, type and names of the created DNS record depends on the characteristics\nof the cluster, and may be different for different versions of _OpenShift_. Please don't\nrely on them. For example, to find what is the URL of the Kubernetes API server of the\ncluster don't assume that it will be `mycluster-api.example.com`. Instead of that use\nthis API to retrieve the description of the cluster, and get it from the `api.url`\nattribute. For example, if the identifier of the cluster is `123` send a request like\nthis:\n\n```http\nGET /api/clusters_mgmt/v1/clusters/123 HTTP/1.1\n```\n\nThat will return a response like this, including the `api.url` attribute:\n\n```json\n{\n \"kind\": \"Cluster\",\n \"id\": \"123\",\n \"href\": \"/api/clusters_mgmt/v1/clusters/123\",\n \"api\": {\n \"url\": \"https://mycluster-api.example.com:6443\"\n },\n ...\n}\n```\n\nWhen the cluster is created in Amazon Web Services it is necessary to create this base\nDNS domain in advance, using AWS Route53 (https://console.aws.amazon.com/route53).", + "type": "string" + } + } + }, + "DNSDomain": { + "description": "Contains the properties of a DNS domain.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'DNSDomain' if this is a complete object or 'DNSDomainLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "cluster": { + "description": "Link to the cluster that is registered with the DNS domain (optional).", + "$ref": "#/components/schemas/ClusterLink" + }, + "organization": { + "description": "Link to the organization that reserved the DNS domain.", + "$ref": "#/components/schemas/OrganizationLink" + }, + "reserved_at_timestamp": { + "description": "Date and time when the DNS domain was reserved.", + "type": "string", + "format": "date-time" + }, + "user_defined": { + "description": "Indicates if this dns domain is user defined.", + "type": "boolean" + } + } + }, + "GCP": { + "description": "Google cloud platform settings of a cluster.", + "properties": { + "auth_uri": { + "description": "GCP authentication uri", + "type": "string" + }, + "auth_provider_x509_cert_url": { + "description": "GCP Authentication provider x509 certificate url", + "type": "string" + }, + "authentication": { + "description": "GCP Authentication Method", + "$ref": "#/components/schemas/GcpAuthentication" + }, + "client_id": { + "description": "GCP client identifier", + "type": "string" + }, + "client_x509_cert_url": { + "description": "GCP client x509 certificate url", + "type": "string" + }, + "client_email": { + "description": "GCP client email", + "type": "string" + }, + "private_key": { + "description": "GCP private key", + "type": "string" + }, + "private_key_id": { + "description": "GCP private key identifier", + "type": "string" + }, + "project_id": { + "description": "GCP project identifier.", + "type": "string" + }, + "security": { + "description": "GCP Security Settings", + "$ref": "#/components/schemas/GcpSecurity" + }, + "token_uri": { + "description": "GCP token uri", + "type": "string" + }, + "type": { + "description": "GCP the type of the service the key belongs to", + "type": "string" + } + } + }, + "GCPEncryptionKey": { + "description": "GCP Encryption Key for CCS clusters.", + "properties": { + "kms_key_service_account": { + "description": "Service account used to access the KMS key", + "type": "string" + }, + "key_location": { + "description": "Location of the encryption key ring", + "type": "string" + }, + "key_name": { + "description": "Name of the encryption key", + "type": "string" + }, + "key_ring": { + "description": "Name of the key ring the encryption key is located on", + "type": "string" + } + } + }, + "GCPFlavour": { + "description": "Specification for different classes of nodes inside a flavour.", + "properties": { + "compute_instance_type": { + "description": "GCP default instance type for the worker volume.\n\nUser can be overridden specifying in the cluster itself a type for compute node.", + "type": "string" + }, + "infra_instance_type": { + "description": "GCP default instance type for the infra volume.", + "type": "string" + }, + "infra_volume": { + "description": "Infra volume specification.", + "$ref": "#/components/schemas/GCPVolume" + }, + "master_instance_type": { + "description": "GCP default instance type for the master volume.", + "type": "string" + }, + "master_volume": { + "description": "Master volume specification.", + "$ref": "#/components/schemas/GCPVolume" + }, + "worker_volume": { + "description": "Worker volume specification.", + "$ref": "#/components/schemas/GCPVolume" + } + } + }, + "GCPImageOverride": { + "description": "GcpImageOverride specifies what a GCP VM Image should be used for a particular product and billing model", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'GCPImageOverride' if this is a complete object or 'GCPImageOverrideLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "billing_model": { + "description": "Link to the billing model.", + "$ref": "#/components/schemas/BillingModelItem" + }, + "image_id": { + "description": "ImageID is the id of the Google Cloud Platform image.", + "type": "string" + }, + "product": { + "description": "Link to the product type.", + "$ref": "#/components/schemas/Product" + }, + "project_id": { + "description": "ProjectID is the id of the Google Cloud Platform project that hosts the image.", + "type": "string" + } + } + }, + "GCPNetwork": { + "description": "GCP Network configuration of a cluster.", + "properties": { + "vpc_name": { + "description": "VPC mame used by the cluster.", + "type": "string" + }, + "vpc_project_id": { + "description": "The name of the host project where the shared VPC exists.", + "type": "string" + }, + "compute_subnet": { + "description": "Compute subnet used by the cluster.", + "type": "string" + }, + "control_plane_subnet": { + "description": "Control plane subnet used by the cluster.", + "type": "string" + } + } + }, + "GCPVolume": { + "description": "Holds settings for an GCP storage volume.", + "properties": { + "size": { + "description": "Volume size in Gib.", + "type": "integer", + "format": "int32" + } + } + }, + "HTPasswdIdentityProvider": { + "description": "Details for `htpasswd` identity providers.", + "properties": { + "password": { + "description": "Password to be used in the _HTPasswd_ data file.", + "type": "string" + }, + "username": { + "description": "Username to be used in the _HTPasswd_ data file.", + "type": "string" + }, + "users": { + "description": "Link to the collection of _HTPasswd_ users.", + "type": "array", + "items": { + "$ref": "#/components/schemas/HTPasswdUser" + } + } + } + }, + "HTPasswdUser": { + "properties": { + "id": { + "description": "ID for a secondary user in the _HTPasswd_ data file.", + "type": "string" + }, + "hashed_password": { + "description": "HTPasswd Hashed Password for a user in the _HTPasswd_ data file.\nThe value of this field is set as-is in the _HTPasswd_ data file for the HTPasswd IDP", + "type": "string" + }, + "password": { + "description": "Password in plain-text for a user in the _HTPasswd_ data file.\nThe value of this field is hashed before setting it in the _HTPasswd_ data file for the HTPasswd IDP", + "type": "string" + }, + "username": { + "description": "Username for a secondary user in the _HTPasswd_ data file.", + "type": "string" + } + } + }, + "LDAPAttributes": { + "description": "LDAP attributes used to configure the LDAP identity provider.", + "properties": { + "id": { + "description": "List of attributes to use as the identity.", + "type": "array", + "items": { + "type": "string" + } + }, + "email": { + "description": "List of attributes to use as the mail address.", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "List of attributes to use as the display name.", + "type": "array", + "items": { + "type": "string" + } + }, + "preferred_username": { + "description": "List of attributes to use as the preferred user name when provisioning a user.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "LDAPIdentityProvider": { + "description": "Details for `ldap` identity providers.", + "properties": { + "ca": { + "description": "Certificate bundle to use to validate server certificates for the configured URL.", + "type": "string" + }, + "url": { + "description": "An https://tools.ietf.org/html/rfc2255[RFC 2255] URL which specifies the LDAP host and\nsearch parameters to use.", + "type": "string" + }, + "attributes": { + "description": "LDAP attributes used to configure the provider.", + "$ref": "#/components/schemas/LDAPAttributes" + }, + "bind_dn": { + "description": "Optional distinguished name to use to bind during the search phase.", + "type": "string" + }, + "bind_password": { + "description": "Optional password to use to bind during the search phase.", + "type": "string" + }, + "insecure": { + "description": "When `true` no TLS connection is made to the server. When `false` `ldaps://...` URLs\nconnect using TLS and `ldap://...` are upgraded to TLS.", + "type": "boolean" + } + } + }, + "STS": { + "description": "Contains the necessary attributes to support role-based authentication on AWS.", + "properties": { + "oidc_endpoint_url": { + "description": "URL of the location where OIDC configuration and keys are available", + "type": "string" + }, + "auto_mode": { + "description": "Auto creation mode for cluster - OCM will create the operator roles and OIDC provider. false by default.", + "type": "boolean" + }, + "enabled": { + "description": "If STS is enabled or disabled", + "type": "boolean" + }, + "external_id": { + "description": "Optional unique identifier when assuming role in another account", + "type": "string" + }, + "instance_iam_roles": { + "description": "Instance IAM roles to use for the instance profiles of the master and worker instances", + "$ref": "#/components/schemas/InstanceIAMRoles" + }, + "managed_policies": { + "description": "If true, cluster account and operator roles have managed policies attached.", + "type": "boolean" + }, + "oidc_config": { + "description": "Registered Oidc Config, if available holds information related to the oidc config.", + "$ref": "#/components/schemas/OidcConfig" + }, + "operator_iam_roles": { + "description": "List of roles necessary to access the AWS resources of the various operators used during installation", + "type": "array", + "items": { + "$ref": "#/components/schemas/OperatorIAMRole" + } + }, + "operator_role_prefix": { + "description": "Optional user provided prefix for operator roles.", + "type": "string" + }, + "permission_boundary": { + "description": "Optional user provided permission boundary.", + "type": "string" + }, + "role_arn": { + "description": "ARN of the AWS role to assume when installing the cluster", + "type": "string" + }, + "support_role_arn": { + "description": "ARN of the AWS role used by SREs to access the cluster AWS account in order to provide support", + "type": "string" + } + } + }, + "STSCredentialRequest": { + "description": "Representation of an credRequest", + "properties": { + "name": { + "description": "Name of CredRequest", + "type": "string" + }, + "operator": { + "description": "Operator Details", + "$ref": "#/components/schemas/STSOperator" + } + } + }, + "STSOperator": { + "description": "Representation of an sts operator", + "properties": { + "max_version": { + "description": "Maximum ocp version supported", + "type": "string" + }, + "min_version": { + "description": "Minimum ocp version supported", + "type": "string" + }, + "name": { + "description": "Operator Name", + "type": "string" + }, + "namespace": { + "description": "Operator Namespace", + "type": "string" + }, + "service_accounts": { + "description": "Service Accounts", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "AddOn": { + "description": "Representation of an add-on that can be installed in a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOn' if this is a complete object or 'AddOnLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "common_annotations": { + "description": "Common annotations to be applied to all resources created by this addon.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "common_labels": { + "description": "Common labels to be applied to all resources created by this addon.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "config": { + "description": "Additional configs to be used by the addon once its installed in the cluster.", + "$ref": "#/components/schemas/AddOnConfig" + }, + "credentials_requests": { + "description": "List of credentials requests to authenticate operators to access cloud resources.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialRequest" + } + }, + "description": { + "description": "Description of the add-on.", + "type": "string" + }, + "docs_link": { + "description": "Link to documentation about the add-on.", + "type": "string" + }, + "enabled": { + "description": "Indicates if this add-on can be added to clusters.", + "type": "boolean" + }, + "has_external_resources": { + "description": "Indicates if this add-on has external resources associated with it", + "type": "boolean" + }, + "hidden": { + "description": "Indicates if this add-on is hidden.", + "type": "boolean" + }, + "icon": { + "description": "Base64-encoded icon representing an add-on. The icon should be in PNG format.", + "type": "string" + }, + "install_mode": { + "description": "The mode in which the addon is deployed.", + "$ref": "#/components/schemas/AddOnInstallMode" + }, + "label": { + "description": "Label used to attach to a cluster deployment when add-on is installed.", + "type": "string" + }, + "managed_service": { + "description": "Indicates if add-on is part of a managed service", + "type": "boolean" + }, + "name": { + "description": "Name of the add-on.", + "type": "string" + }, + "namespaces": { + "description": "Namespaces which are required by this addon.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnNamespace" + } + }, + "operator_name": { + "description": "The name of the operator installed by this add-on.", + "type": "string" + }, + "parameters": { + "description": "List of parameters for this add-on.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnParameter" + } + }, + "requirements": { + "description": "List of requirements for this add-on.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnRequirement" + } + }, + "resource_cost": { + "description": "Used to determine how many units of quota an add-on consumes per resource name.", + "type": "number", + "format": "float" + }, + "resource_name": { + "description": "Used to determine from where to reserve quota for this add-on.", + "type": "string" + }, + "sub_operators": { + "description": "List of sub operators for this add-on.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnSubOperator" + } + }, + "target_namespace": { + "description": "The namespace in which the addon CRD exists.", + "type": "string" + }, + "version": { + "description": "Link to the current default version of this add-on.", + "$ref": "#/components/schemas/AddOnVersion" + } + } + }, + "AddOnConfig": { + "description": "Representation of an add-on config.\nThe attributes under it are to be used by the addon once its installed in the cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnConfig' if this is a complete object or 'AddOnConfigLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "add_on_environment_variables": { + "description": "List of environment variables for the addon", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnEnvironmentVariable" + } + }, + "secret_propagations": { + "description": "List of secret propagations for the addon", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnSecretPropagation" + } + } + } + }, + "AddOnEnvironmentVariable": { + "description": "Representation of an add-on env object.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnEnvironmentVariable' if this is a complete object or 'AddOnEnvironmentVariableLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "name": { + "description": "Name of the env object.", + "type": "string" + }, + "value": { + "description": "Value of the env object.", + "type": "string" + } + } + }, + "AddOnInstallMode": { + "description": "Representation of an add-on InstallMode field.", + "type": "string", + "enum": [ + "all_namespaces", + "own_namespace" + ] + }, + "AddOnInstallation": { + "description": "Representation of an add-on installation in a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnInstallation' if this is a complete object or 'AddOnInstallationLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "addon": { + "description": "Link to add-on attached to this cluster.", + "$ref": "#/components/schemas/AddOn" + }, + "addon_version": { + "description": "Link to the installed version of this add-on.", + "$ref": "#/components/schemas/AddOnVersion" + }, + "billing": { + "description": "Billing details for add-on installation resource ", + "$ref": "#/components/schemas/AddOnInstallationBilling" + }, + "creation_timestamp": { + "description": "Date and time when the add-on was initially installed in the cluster.", + "type": "string", + "format": "date-time" + }, + "operator_version": { + "description": "Version of the operator installed by the add-on.", + "type": "string" + }, + "parameters": { + "description": "List of add-on parameters for this add-on installation.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnInstallationParameter" + } + }, + "state": { + "description": "Overall state of the add-on installation.", + "$ref": "#/components/schemas/AddOnInstallationState" + }, + "state_description": { + "description": "Reason for the current State.", + "type": "string" + }, + "updated_timestamp": { + "description": "Date and time when the add-on installation information was last updated.", + "type": "string", + "format": "date-time" + } + } + }, + "AddOnInstallationBilling": { + "description": "Representation of an add-on installation billing.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnInstallationBilling' if this is a complete object or 'AddOnInstallationBillingLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "billing_marketplace_account": { + "description": "Account ID for billing market place", + "type": "string" + }, + "billing_model": { + "description": "Billing Model for addon resources", + "$ref": "#/components/schemas/BillingModel" + } + } + }, + "AddOnInstallationParameter": { + "description": "Representation of an add-on installation parameter.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnInstallationParameter' if this is a complete object or 'AddOnInstallationParameterLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "value": { + "description": "Value of the parameter.", + "type": "string" + } + } + }, + "AddOnInstallationState": { + "description": "Representation of an add-on installation State field.", + "type": "string", + "enum": [ + "deleting", + "failed", + "installing", + "pending", + "ready" + ] + }, + "AddOnNamespace": { + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnNamespace' if this is a complete object or 'AddOnNamespaceLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "annotations": { + "description": "Annotations to be applied to this namespace.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "labels": { + "description": "Labels to be applied to this namespace.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "name": { + "description": "Name of the namespace.", + "type": "string" + } + } + }, + "AddOnParameter": { + "description": "Representation of an add-on parameter.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnParameter' if this is a complete object or 'AddOnParameterLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "addon": { + "description": "Link to add-on.", + "$ref": "#/components/schemas/AddOn" + }, + "conditions": { + "description": "Conditions in which this parameter is valid for", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnRequirement" + } + }, + "default_value": { + "description": "Indicates the value default for the add-on parameter.", + "type": "string" + }, + "description": { + "description": "Description of the add-on parameter.", + "type": "string" + }, + "editable": { + "description": "Indicates if this parameter can be edited after creation.", + "type": "boolean" + }, + "editable_direction": { + "description": "Restricts if the parameter can be upscaled/downscaled\nExpected values are \"up\", \"down\", or \"\" (no restriction).", + "type": "string" + }, + "enabled": { + "description": "Indicates if this parameter is enabled for the add-on.", + "type": "boolean" + }, + "name": { + "description": "Name of the add-on parameter.", + "type": "string" + }, + "options": { + "description": "List of options for the add-on parameter value.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnParameterOption" + } + }, + "required": { + "description": "Indicates if this parameter is required by the add-on.", + "type": "boolean" + }, + "validation": { + "description": "Validation rule for the add-on parameter.", + "type": "string" + }, + "validation_err_msg": { + "description": "Error message to return should the parameter be invalid.", + "type": "string" + }, + "value_type": { + "description": "Type of value of the add-on parameter.", + "type": "string" + } + } + }, + "AddOnParameterOption": { + "description": "Representation of an add-on parameter option.", + "properties": { + "name": { + "description": "Name of the add-on parameter option.", + "type": "string" + }, + "rank": { + "description": "Rank of option to be used in cases where editable direction should be restricted.", + "type": "integer", + "format": "int32" + }, + "requirements": { + "description": "List of add-on requirements for this parameter option.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnRequirement" + } + }, + "value": { + "description": "Value of the add-on parameter option.", + "type": "string" + } + } + }, + "AddOnRequirement": { + "description": "Representation of an add-on requirement.", + "properties": { + "id": { + "description": "ID of the add-on requirement.", + "type": "string" + }, + "data": { + "description": "Data for the add-on requirement.", + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "enabled": { + "description": "Indicates if this requirement is enabled for the add-on.", + "type": "boolean" + }, + "resource": { + "description": "Type of resource of the add-on requirement.", + "type": "string" + }, + "status": { + "description": "Optional cluster specific status for the add-on.", + "$ref": "#/components/schemas/AddOnRequirementStatus" + } + } + }, + "AddOnRequirementStatus": { + "description": "Representation of an add-on requirement status.", + "properties": { + "error_msgs": { + "description": "Error messages detailing reasons for unfulfilled requirements.", + "type": "array", + "items": { + "type": "string" + } + }, + "fulfilled": { + "description": "Indicates if this requirement is fulfilled.", + "type": "boolean" + } + } + }, + "AddOnSecretPropagation": { + "description": "Representation of an addon secret propagation", + "properties": { + "id": { + "description": "ID of the secret propagation", + "type": "string" + }, + "destination_secret": { + "description": "DestinationSecret is location of the secret to be added", + "type": "string" + }, + "enabled": { + "description": "Indicates is this secret propagation is enabled for the addon", + "type": "boolean" + }, + "source_secret": { + "description": "SourceSecret is location of the source secret", + "type": "string" + } + } + }, + "AddOnSubOperator": { + "description": "Representation of an add-on sub operator. A sub operator is an operator\nwho's life cycle is controlled by the add-on umbrella operator. ", + "properties": { + "enabled": { + "description": "Indicates if the sub operator is enabled for the add-on", + "type": "boolean" + }, + "operator_name": { + "description": "Name of the add-on sub operator", + "type": "string" + }, + "operator_namespace": { + "description": "Namespace of the add-on sub operator", + "type": "string" + } + } + }, + "AddOnVersion": { + "description": "Representation of an add-on version.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddOnVersion' if this is a complete object or 'AddOnVersionLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "additional_catalog_sources": { + "description": "Additional catalog sources associated with this addon version", + "type": "array", + "items": { + "$ref": "#/components/schemas/AdditionalCatalogSource" + } + }, + "available_upgrades": { + "description": "AvailableUpgrades is the list of versions this version can be upgraded to.", + "type": "array", + "items": { + "type": "string" + } + }, + "channel": { + "description": "The specific addon catalog source channel of packages", + "type": "string" + }, + "config": { + "description": "Additional configs to be used by the addon once its installed in the cluster.", + "$ref": "#/components/schemas/AddOnConfig" + }, + "enabled": { + "description": "Indicates if this add-on version can be added to clusters.", + "type": "boolean" + }, + "package_image": { + "description": "The package image for this addon version", + "type": "string" + }, + "parameters": { + "description": "List of parameters for this add-on version.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnParameter" + } + }, + "pull_secret_name": { + "description": "The pull secret name used for this addon version.", + "type": "string" + }, + "requirements": { + "description": "List of requirements for this add-on version.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnRequirement" + } + }, + "source_image": { + "description": "The catalog source image for this add-on version.", + "type": "string" + }, + "sub_operators": { + "description": "List of sub operators for this add-on version.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnSubOperator" + } + } + } + }, + "AdditionalCatalogSource": { + "description": "Representation of an addon catalog source object used by addon versions.", + "properties": { + "id": { + "description": "ID of the additional catalog source", + "type": "string" + }, + "enabled": { + "description": "Indicates is this additional catalog source is enabled for the addon", + "type": "boolean" + }, + "image": { + "description": "Image of the additional catalog source.", + "type": "string" + }, + "name": { + "description": "Name of the additional catalog source.", + "type": "string" + } + } + }, + "AddonUpgradePolicy": { + "description": "Representation of an upgrade policy that can be set for a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddonUpgradePolicy' if this is a complete object or 'AddonUpgradePolicyLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "addon_id": { + "description": "Addon ID this upgrade policy is defined for", + "type": "string" + }, + "cluster_id": { + "description": "Cluster ID this upgrade policy is defined for.", + "type": "string" + }, + "next_run": { + "description": "Next time the upgrade should run.", + "type": "string", + "format": "date-time" + }, + "schedule": { + "description": "Schedule cron expression that defines automatic upgrade scheduling.", + "type": "string" + }, + "schedule_type": { + "description": "Schedule type can be either \"manual\" (single execution) or \"automatic\" (re-occurring).", + "type": "string" + }, + "upgrade_type": { + "description": "Upgrade type specify the type of the upgrade. Must be \"ADDON\".", + "type": "string" + }, + "version": { + "description": "Version is the desired upgrade version.", + "type": "string" + } + } + }, + "AddonUpgradePolicyState": { + "description": "Representation of an addon upgrade policy state that that is set for a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'AddonUpgradePolicyState' if this is a complete object or 'AddonUpgradePolicyStateLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "description": { + "description": "Description of the state.", + "type": "string" + }, + "value": { + "description": "State value can be 'pending', 'scheduled', 'cancelled', 'started', 'delayed',\n'failed' or 'completed'.", + "$ref": "#/components/schemas/UpgradePolicyStateValue" + } + } + }, + "AdminCredentials": { + "description": "Temporary administrator credentials generated during the installation of the\ncluster.", + "properties": { + "password": { + "description": "Cluster administrator password.", + "type": "string" + }, + "user": { + "description": "Cluster administrator user name.", + "type": "string" + } + } + }, + "AlertInfo": { + "description": "Provides information about a single alert firing on the cluster.", + "properties": { + "name": { + "description": "The alert name. Multiple alerts with same name are possible.", + "type": "string" + }, + "severity": { + "description": "The alert severity.", + "$ref": "#/components/schemas/AlertSeverity" + } + } + }, + "AlertSeverity": { + "description": "Severity of a cluster alert received via telemetry.", + "type": "string", + "enum": [ + "critical", + "none", + "warning" + ] + }, + "AlertsInfo": { + "description": "Provides information about the alerts firing on the cluster.", + "properties": { + "alerts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlertInfo" + } + } + } + }, + "AuditLog": { + "description": "Contains the necessary attributes to support audit log forwarding", + "properties": { + "role_arn": { + "description": "ARN of the CloudWatch audit log forwarding role", + "type": "string" + } + } + }, + "AutoscalerResourceLimits": { + "properties": { + "gpus": { + "description": "Minimum and maximum number of different GPUs in cluster, in the format ::.\nCluster autoscaler will not scale the cluster beyond these numbers. Can be passed multiple times.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AutoscalerResourceLimitsGPULimit" + } + }, + "cores": { + "description": "Minimum and maximum number of cores in cluster, in the format :.\nCluster autoscaler will not scale the cluster beyond these numbers.", + "$ref": "#/components/schemas/ResourceRange" + }, + "max_nodes_total": { + "description": "Maximum number of nodes in all node groups.\nCluster autoscaler will not grow the cluster beyond this number.", + "type": "integer", + "format": "int32" + }, + "memory": { + "description": "Minimum and maximum number of gigabytes of memory in cluster, in the format :.\nCluster autoscaler will not scale the cluster beyond these numbers.", + "$ref": "#/components/schemas/ResourceRange" + } + } + }, + "AutoscalerResourceLimitsGPULimit": { + "properties": { + "range": { + "$ref": "#/components/schemas/ResourceRange" + }, + "type": { + "description": "The type of GPU to associate with the minimum and maximum limits.\nThis value is used by the Cluster Autoscaler to identify Nodes that will have GPU capacity by searching\nfor it as a label value on the Node objects. For example, Nodes that carry the label key\n`cluster-api/accelerator` with the label value being the same as the Type field will be counted towards\nthe resource limits by the Cluster Autoscaler.", + "type": "string" + } + } + }, + "AutoscalerScaleDownConfig": { + "properties": { + "delay_after_add": { + "description": "How long after scale up that scale down evaluation resumes.", + "type": "string" + }, + "delay_after_delete": { + "description": "How long after node deletion that scale down evaluation resumes, defaults to scan-interval.", + "type": "string" + }, + "delay_after_failure": { + "description": "How long after scale down failure that scale down evaluation resumes.", + "type": "string" + }, + "enabled": { + "description": "Should cluster-autoscaler scale down the cluster.", + "type": "boolean" + }, + "unneeded_time": { + "description": "How long a node should be unneeded before it is eligible for scale down.", + "type": "string" + }, + "utilization_threshold": { + "description": "Node utilization level, defined as sum of requested resources divided by capacity, below which a node can be considered for scale down.", + "type": "string" + } + } + }, + "AwsEtcdEncryption": { + "description": "Contains the necessary attributes to support etcd encryption for AWS based clusters.", + "properties": { + "kms_key_arn": { + "description": "ARN of the KMS to be used for the etcd encryption", + "type": "string" + } + } + }, + "Azure": { + "description": "Microsoft Azure settings of a cluster.", + "properties": { + "managed_resource_group_name": { + "description": "[Required] The name of the Azure Resource Group where the Azure Resources related\nto the cluster are created. The Azure Resource Group is created with the given\nvalue, within the Azure Subscription `subscription_id` of the cluster.\n`managed_resource_group_name` cannot be equal to the value of `managed_resource_group`.\n`managed_resource_group_name` is located in the same Azure location as the\ncluster's region.\nNot to be confused with `resource_group_name`, which is the Azure Resource Group Name\nwhere the own Azure Resource associated to the cluster resides.", + "type": "string" + }, + "network_security_group_resource_id": { + "description": "[Required] The Azure Resource ID of a pre-existing\nAzure Network Security Group.\nThe Network Security Group specified in network_security_group_resource_id\nmust already be associated to the Azure Subnet `subnet_resource_id`.\nIt is the Azure Network Security Group associated to the cluster's subnet\nspecified in `subnet_resource_id`.\n`network_security_group_resource_id` must be located in the same Azure\nlocation as the cluster's region.\nThe Azure Subscription specified as part of\n`network_security_group_resource_id` must be located in the same Azure\nSubscription as `subscription_id`.\nThe Azure Resource Group Name specified as part of `network_security_group_resource_id`\nmust belong to the Azure Subscription `subscription_id`, and in the same\nAzure location as the cluster's region.\nThe Azure Resource Group Name specified as part of `network_security_group_resource_id`\nmust be a different Resource Group Name than the one specified in\n`managed_resource_group_name`.\nThe Azure Resource Group Name specified as part of `network_security_group_resource_id`\ncan be the same, or a different one than the one specified in\n`resource_group_name`.", + "type": "string" + }, + "resource_group_name": { + "description": "[Required] The Azure Resource Group Name of the cluster. It must be within `subscription_id`\nof the cluster. `resource_group_name` is located in the same Azure location\nas the cluster's region.", + "type": "string" + }, + "resource_name": { + "description": "[Required] The Azure Resource Name of the cluster. It must be within the\nAzure Resource Group Name `resource_group_name`.\n`resource_name` is located in the same Azure location as the cluster's region.", + "type": "string" + }, + "subnet_resource_id": { + "description": "[Required] The Azure Resource ID of a pre-existing Azure\nSubnet. It is an Azure Subnet used for the Data Plane of the cluster.\n`subnet_resource_id` must be located in the same Azure location as the\ncluster's region.\nThe Azure Subscription specified as part of the `subnet_resource_id`\nmust be located in the same Azure Subscription as `subscription_id`.\nThe Azure Resource Group Name specified as part of `subnet_resource_id`\nmust belong to the Azure Subscription `subscription_id`, and in the same\nAzure location as the cluster's region.\nThe Azure Resource Group Name specified as part of `subnet_resource_id`\nmust be a different Resource Group Name than the one specified in\n`managed_resource_group_name`.\nThe Azure Resource Group Name specified as part of the `subnet_resource_id`\ncan be the same, or a different one than the one specified in\n`resource_group_name`.", + "type": "string" + }, + "subscription_id": { + "description": "[Required] The Azure Subscription ID associated with the cluster. It must belong to\nthe Microsoft Entra Tenant ID `tenant_id`.", + "type": "string" + }, + "tenant_id": { + "description": "[Required] The Microsoft Entra Tenant ID where the cluster belongs.", + "type": "string" + } + } + }, + "AzureNodePool": { + "description": "Representation of azure node pool specific parameters.", + "properties": { + "os_disk_size_gibibytes": { + "description": "The size in GiB to assign to the OS disks of the\nNodes in the Node Pool. The property\nis the number of bytes x 1024^3.\nIf not specified, OS disk size is 30 GiB.", + "type": "integer", + "format": "int32" + }, + "os_disk_storage_account_type": { + "description": "The disk storage account type to use for the OS disks of the Nodes in the\nNode Pool. Valid values are:\n* Standard_LRS: HDD\n* StandardSSD_LRS: Standard SSD\n* Premium_LRS: Premium SDD\n* UltraSSD_LRS: Ultra SDD\n\nIf not specified, `Premium_LRS` is used.", + "type": "string" + }, + "vm_size": { + "description": "The Azure Virtual Machine size identifier used for the\nNodes of the Node Pool.\nAvailability of VM sizes are dependent on the Azure Location\nof the parent Cluster.\nRequired during creation.", + "type": "string" + }, + "ephemeral_os_disk_enabled": { + "description": "Enables Ephemeral OS Disks for the Nodes in the Node Pool.\nIf not specified, no Ephemeral OS Disks are used.", + "type": "boolean" + }, + "resource_name": { + "description": "ResourceName is the Azure Resource Name of the NodePool.\nResourceName must be within the Azure Resource Group Name of the parent\nCluster it belongs to.\nResourceName must be located in the same Azure Location as the parent\nCluster it belongs to.\nResourceName must be located in the same Azure Subscription as the parent\nCluster it belongs to.\nResourceName must belong to the same Microsoft Entra Tenant ID as the parent\nCluster it belongs to.\nRequired during creation.\nImmutable.", + "type": "string" + } + } + }, + "BillingModel": { + "description": "Billing model for cluster resources.", + "type": "string", + "enum": [ + "marketplace", + "marketplace-aws", + "marketplace-gcp", + "marketplace-rhm", + "marketplace-azure", + "standard" + ] + }, + "BillingModelItem": { + "description": "BillingModelItem represents a billing model", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'BillingModelItem' if this is a complete object or 'BillingModelItemLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "billing_model_type": { + "description": "BillingModelType is the type of the BillingModel. e.g. standard, marketplace.", + "type": "string" + }, + "description": { + "description": "Single line description of the billing model.", + "type": "string" + }, + "display_name": { + "description": "User friendly display name of the billing model.", + "type": "string" + }, + "marketplace": { + "description": "Indicates the marketplace of the billing model. e.g. gcp, aws, etc.", + "type": "string" + } + } + }, + "BreakGlassCredential": { + "description": "Representation of a break glass credential.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'BreakGlassCredential' if this is a complete object or 'BreakGlassCredentialLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "expiration_timestamp": { + "description": "ExpirationTimestamp is the date and time when the credential will expire.", + "type": "string", + "format": "date-time" + }, + "kubeconfig": { + "description": "Kubeconfig is the generated kubeconfig for this credential. It is only stored in memory", + "type": "string" + }, + "revocation_timestamp": { + "description": "RevocationTimestamp is the date and time when the credential has been revoked.", + "type": "string", + "format": "date-time" + }, + "status": { + "description": "Status is the status of this credential", + "$ref": "#/components/schemas/BreakGlassCredentialStatus" + }, + "username": { + "description": "Username is the user which will be used for this credential.", + "type": "string" + } + } + }, + "BreakGlassCredentialStatus": { + "description": "Status of the break glass credential.", + "type": "string", + "enum": [ + "awaiting_revocation", + "created", + "expired", + "failed", + "issued", + "revoked" + ] + }, + "ByoOidc": { + "description": "ByoOidc configuration.", + "properties": { + "enabled": { + "description": "Boolean flag indicating if the cluster should be creating using _ByoOidc_.\n\nBy default this is `false`.\n\nTo enable it the cluster needs to be ROSA cluster and the organization of the user needs\nto have the `byo-oidc` feature toggle enabled.", + "type": "boolean" + } + } + }, + "ClientComponent": { + "description": "The reference of a component that will consume the client configuration.", + "properties": { + "name": { + "description": "The name of the component.", + "type": "string" + }, + "namespace": { + "description": "The namespace of the component.", + "type": "string" + } + } + }, + "CloudVPC": { + "description": "Description of a cloud provider virtual private cloud.", + "properties": { + "aws_security_groups": { + "description": "List of AWS security groups with details.", + "type": "array", + "items": { + "$ref": "#/components/schemas/SecurityGroup" + } + }, + "aws_subnets": { + "description": "List of AWS subnetworks with details.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Subnetwork" + } + }, + "cidr_block": { + "description": "CIDR block of the virtual private cloud.", + "type": "string" + }, + "id": { + "description": "ID of virtual private cloud.", + "type": "string" + }, + "name": { + "description": "Name of virtual private cloud according to its `Name` tag on AWS.", + "type": "string" + }, + "red_hat_managed": { + "description": "If the resource is RH managed.", + "type": "boolean" + }, + "subnets": { + "description": "List of subnets used by the virtual private cloud.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "CloudProvider": { + "description": "Cloud provider.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'CloudProvider' if this is a complete object or 'CloudProviderLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "display_name": { + "description": "Name of the cloud provider for display purposes. It can contain any characters,\nincluding spaces.", + "type": "string" + }, + "name": { + "description": "Human friendly identifier of the cloud provider, for example `aws`.", + "type": "string" + }, + "regions": { + "description": "(optional) Provider's regions - only included when listing providers with `fetchRegions=true`.", + "type": "array", + "items": { + "$ref": "#/components/schemas/CloudRegion" + } + } + } + }, + "CloudProviderData": { + "description": "Description of a cloud provider data used for cloud provider inquiries.", + "properties": { + "aws": { + "description": "Amazon Web Services settings.", + "$ref": "#/components/schemas/AWS" + }, + "gcp": { + "description": "Google cloud platform settings.", + "$ref": "#/components/schemas/GCP" + }, + "availability_zones": { + "description": "Availability zone", + "type": "array", + "items": { + "type": "string" + } + }, + "key_location": { + "description": "Key location", + "type": "string" + }, + "key_ring_name": { + "description": "Key ring name", + "type": "string" + }, + "region": { + "description": "Region", + "$ref": "#/components/schemas/CloudRegion" + }, + "subnets": { + "description": "Subnets", + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "description": "Openshift version", + "$ref": "#/components/schemas/Version" + }, + "vpc_ids": { + "description": "VPC ids", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "CloudRegion": { + "description": "Description of a region of a cloud provider.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'CloudRegion' if this is a complete object or 'CloudRegionLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "ccs_only": { + "description": "'true' if the region is supported only for CCS clusters, 'false' otherwise.", + "type": "boolean" + }, + "kms_location_id": { + "description": "(GCP only) Comma-separated list of KMS location IDs that can be used with this region.\nE.g. \"global,nam4,us\". Order is not guaranteed.", + "type": "string" + }, + "kms_location_name": { + "description": "(GCP only) Comma-separated list of display names corresponding to KMSLocationID.\nE.g. \"Global,nam4 (Iowa, South Carolina, and Oklahoma),US\". Order is not guaranteed but will match KMSLocationID.\nUnfortunately, this API doesn't allow robust splitting - Contact ocm-feedback@redhat.com if you want to rely on this.", + "type": "string" + }, + "cloud_provider": { + "description": "Link to the cloud provider that the region belongs to.", + "$ref": "#/components/schemas/CloudProvider" + }, + "display_name": { + "description": "Name of the region for display purposes, for example `N. Virginia`.", + "type": "string" + }, + "enabled": { + "description": "Whether the region is enabled for deploying a managed cluster.", + "type": "boolean" + }, + "govcloud": { + "description": "Whether the region is an AWS GovCloud region.", + "type": "boolean" + }, + "name": { + "description": "Human friendly identifier of the region, for example `us-east-1`.\n\nNOTE: Currently for all cloud providers and all regions `id` and `name` have exactly\nthe same values.", + "type": "string" + }, + "supports_hypershift": { + "description": "'true' if the region is supported for Hypershift deployments, 'false' otherwise.", + "type": "boolean" + }, + "supports_multi_az": { + "description": "Whether the region supports multiple availability zones.", + "type": "boolean" + } + } + }, + "Cluster": { + "description": "Definition of an _OpenShift_ cluster.\n\nThe `cloud_provider` attribute is a reference to the cloud provider. When a\ncluster is retrieved it will be a link to the cloud provider, containing only\nthe kind, id and href attributes:\n\n```json\n{\n \"cloud_provider\": {\n \"kind\": \"CloudProviderLink\",\n \"id\": \"123\",\n \"href\": \"/api/clusters_mgmt/v1/cloud_providers/123\"\n }\n}\n```\n\nWhen a cluster is created this is optional, and if used it should contain the\nidentifier of the cloud provider to use:\n\n```json\n{\n \"cloud_provider\": {\n \"id\": \"123\",\n }\n}\n```\n\nIf not included, then the cluster will be created using the default cloud\nprovider, which is currently Amazon Web Services.\n\nThe region attribute is mandatory when a cluster is created.\n\nThe `aws.access_key_id`, `aws.secret_access_key` and `dns.base_domain`\nattributes are mandatory when creation a cluster with your own Amazon Web\nServices account.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Cluster' if this is a complete object or 'ClusterLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "api": { + "description": "Information about the API of the cluster.", + "$ref": "#/components/schemas/ClusterAPI" + }, + "aws": { + "description": "Amazon Web Services settings of the cluster.", + "$ref": "#/components/schemas/AWS" + }, + "aws_infrastructure_access_role_grants": { + "description": "List of AWS infrastructure access role grants on this cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AWSInfrastructureAccessRoleGrant" + } + }, + "ccs": { + "description": "Contains configuration of a Customer Cloud Subscription cluster.", + "$ref": "#/components/schemas/CCS" + }, + "dns": { + "description": "DNS settings of the cluster.", + "$ref": "#/components/schemas/DNS" + }, + "fips": { + "description": "Create cluster that uses FIPS Validated / Modules in Process cryptographic libraries.", + "type": "boolean" + }, + "gcp": { + "description": "Google cloud platform settings of the cluster.", + "$ref": "#/components/schemas/GCP" + }, + "gcp_encryption_key": { + "description": "Key used for encryption of GCP cluster nodes.", + "$ref": "#/components/schemas/GCPEncryptionKey" + }, + "gcp_network": { + "description": "GCP Network.", + "$ref": "#/components/schemas/GCPNetwork" + }, + "additional_trust_bundle": { + "description": "Additional trust bundle.", + "type": "string" + }, + "addons": { + "description": "List of add-ons on this cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/AddOnInstallation" + } + }, + "autoscaler": { + "description": "Link to an optional _ClusterAutoscaler_ that is coupled with the cluster.", + "$ref": "#/components/schemas/ClusterAutoscaler" + }, + "azure": { + "description": "Microsoft Azure settings of the cluster.", + "$ref": "#/components/schemas/Azure" + }, + "billing_model": { + "description": "Billing model for cluster resources.", + "$ref": "#/components/schemas/BillingModel" + }, + "byo_oidc": { + "description": "Contains information about BYO OIDC.", + "$ref": "#/components/schemas/ByoOidc" + }, + "cloud_provider": { + "description": "Link to the cloud provider where the cluster is installed.", + "$ref": "#/components/schemas/CloudProvider" + }, + "console": { + "description": "Information about the console of the cluster.", + "$ref": "#/components/schemas/ClusterConsole" + }, + "creation_timestamp": { + "description": "Date and time when the cluster was initially created, using the\nformat defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt).", + "type": "string", + "format": "date-time" + }, + "delete_protection": { + "description": "Delete protection", + "$ref": "#/components/schemas/DeleteProtection" + }, + "disable_user_workload_monitoring": { + "description": "Indicates whether the User workload monitoring is enabled or not\nIt is enabled by default", + "type": "boolean" + }, + "domain_prefix": { + "description": "DomainPrefix of the cluster. This prefix is optionally assigned by the user when the\ncluster is created. It will appear in the Cluster's domain when the cluster is provisioned.", + "type": "string" + }, + "etcd_encryption": { + "description": "Indicates whether that etcd is encrypted or not.\nThis is set only during cluster creation.", + "type": "boolean" + }, + "expiration_timestamp": { + "description": "Date and time when the cluster will be automatically deleted, using the format defined in\n[RFC3339](https://www.ietf.org/rfc/rfc3339.txt). If no timestamp is provided, the cluster\nwill never expire.\n\nThis option is unsupported.", + "type": "string", + "format": "date-time" + }, + "external_id": { + "description": "External identifier of the cluster, generated by the installer.", + "type": "string" + }, + "external_auth_config": { + "description": "External authentication configuration", + "$ref": "#/components/schemas/ExternalAuthConfig" + }, + "external_configuration": { + "description": "ExternalConfiguration shows external configuration on the cluster.", + "$ref": "#/components/schemas/ExternalConfiguration" + }, + "flavour": { + "description": "Link to the _flavour_ that was used to create the cluster.", + "$ref": "#/components/schemas/Flavour" + }, + "groups": { + "description": "Link to the collection of groups of user of the cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Group" + } + }, + "health_state": { + "description": "HealthState indicates the overall health state of the cluster.", + "$ref": "#/components/schemas/ClusterHealthState" + }, + "htpasswd": { + "description": "Details for `htpasswd` identity provider.", + "$ref": "#/components/schemas/HTPasswdIdentityProvider" + }, + "hypershift": { + "description": "Hypershift configuration.", + "$ref": "#/components/schemas/Hypershift" + }, + "identity_providers": { + "description": "Link to the collection of identity providers of the cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentityProvider" + } + }, + "inflight_checks": { + "description": "List of inflight checks on this cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/InflightCheck" + } + }, + "infra_id": { + "description": "InfraID is used for example to name the VPCs.", + "type": "string" + }, + "ingresses": { + "description": "List of ingresses on this cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Ingress" + } + }, + "kubelet_config": { + "description": "Details of cluster-wide KubeletConfig", + "$ref": "#/components/schemas/KubeletConfig" + }, + "load_balancer_quota": { + "description": "Load Balancer quota to be assigned to the cluster.", + "type": "integer", + "format": "int32" + }, + "machine_pools": { + "description": "List of machine pools on this cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachinePool" + } + }, + "managed": { + "description": "Flag indicating if the cluster is managed (by Red Hat) or\nself-managed by the user.", + "type": "boolean" + }, + "managed_service": { + "description": "Contains information about Managed Service", + "$ref": "#/components/schemas/ManagedService" + }, + "multi_az": { + "description": "Flag indicating if the cluster should be created with nodes in\ndifferent availability zones or all the nodes in a single one\nrandomly selected.", + "type": "boolean" + }, + "multi_arch_enabled": { + "description": "Indicate whether the cluster is enabled for multi arch workers", + "type": "boolean" + }, + "name": { + "description": "Name of the cluster. This name is assigned by the user when the\ncluster is created. This is used to uniquely identify the cluster", + "type": "string" + }, + "network": { + "description": "Network settings of the cluster.", + "$ref": "#/components/schemas/Network" + }, + "node_drain_grace_period": { + "description": "Node drain grace period.", + "$ref": "#/components/schemas/Value" + }, + "node_pools": { + "description": "List of node pools on this cluster.\nNodePool is a scalable set of worker nodes attached to a hosted cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/NodePool" + } + }, + "nodes": { + "description": "Information about the nodes of the cluster.", + "$ref": "#/components/schemas/ClusterNodes" + }, + "openshift_version": { + "description": "Version of _OpenShift_ installed in the cluster, for example `4.0.0-0.2`.\n\nWhen retrieving a cluster this will always be reported.\n\nWhen provisioning a cluster this will be ignored, as the version to\ndeploy will be determined internally.", + "type": "string" + }, + "product": { + "description": "Link to the product type of this cluster.", + "$ref": "#/components/schemas/Product" + }, + "properties": { + "description": "User defined properties for tagging and querying.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "provision_shard": { + "description": "ProvisionShard contains the properties of the provision shard, including AWS and GCP related configurations", + "$ref": "#/components/schemas/ProvisionShard" + }, + "proxy": { + "description": "Proxy.", + "$ref": "#/components/schemas/Proxy" + }, + "region": { + "description": "Link to the cloud provider region where the cluster is installed.", + "$ref": "#/components/schemas/CloudRegion" + }, + "state": { + "description": "Overall state of the cluster.", + "$ref": "#/components/schemas/ClusterState" + }, + "status": { + "description": "Status of cluster", + "$ref": "#/components/schemas/ClusterStatus" + }, + "storage_quota": { + "description": "Storage quota to be assigned to the cluster.", + "$ref": "#/components/schemas/Value" + }, + "subscription": { + "description": "Link to the subscription that comes from the account management service when the cluster\nis registered.", + "$ref": "#/components/schemas/Subscription" + }, + "version": { + "description": "Link to the version of _OpenShift_ that will be used to install the cluster.", + "$ref": "#/components/schemas/Version" + } + } + }, + "ClusterAPI": { + "description": "Information about the API of a cluster.", + "properties": { + "url": { + "description": "The URL of the API server of the cluster.", + "type": "string" + }, + "listening": { + "description": "The listening method of the API server.", + "$ref": "#/components/schemas/ListeningMethod" + } + } + }, + "ClusterAutoscaler": { + "description": "Cluster-wide autoscaling configuration.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ClusterAutoscaler' if this is a complete object or 'ClusterAutoscalerLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "balance_similar_node_groups": { + "description": "BalanceSimilarNodeGroups enables/disables the\n`--balance-similar-node-groups` cluster-autoscaler feature.\nThis feature will automatically identify node groups with\nthe same instance type and the same set of labels and try\nto keep the respective sizes of those node groups balanced.", + "type": "boolean" + }, + "balancing_ignored_labels": { + "description": "This option specifies labels that cluster autoscaler should ignore when considering node group similarity.\nFor example, if you have nodes with \"topology.ebs.csi.aws.com/zone\" label, you can add name of this label here\nto prevent cluster autoscaler from splitting nodes into different node groups based on its value.", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore_daemonsets_utilization": { + "description": "Should CA ignore DaemonSet pods when calculating resource utilization for scaling down. false by default.", + "type": "boolean" + }, + "log_verbosity": { + "description": "Sets the autoscaler log level.\nDefault value is 1, level 4 is recommended for DEBUGGING and level 6 will enable almost everything.", + "type": "integer", + "format": "int32" + }, + "max_node_provision_time": { + "description": "Maximum time CA waits for node to be provisioned.", + "type": "string" + }, + "max_pod_grace_period": { + "description": "Gives pods graceful termination time before scaling down.", + "type": "integer", + "format": "int32" + }, + "pod_priority_threshold": { + "description": "To allow users to schedule \"best-effort\" pods, which shouldn't trigger\nCluster Autoscaler actions, but only run when there are spare resources available,\nMore info: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-does-cluster-autoscaler-work-with-pod-priority-and-preemption.", + "type": "integer", + "format": "int32" + }, + "resource_limits": { + "description": "Constraints of autoscaling resources.", + "$ref": "#/components/schemas/AutoscalerResourceLimits" + }, + "scale_down": { + "description": "Configuration of scale down operation.", + "$ref": "#/components/schemas/AutoscalerScaleDownConfig" + }, + "skip_nodes_with_local_storage": { + "description": "Enables/Disables `--skip-nodes-with-local-storage` CA feature flag. If true cluster autoscaler will never delete nodes with pods with local storage, e.g. EmptyDir or HostPath. true by default at autoscaler.", + "type": "boolean" + } + } + }, + "ClusterConfigurationMode": { + "description": "Configuration mode of a cluster.", + "type": "string", + "enum": [ + "full", + "read_only" + ] + }, + "ClusterConsole": { + "description": "Information about the console of a cluster.", + "properties": { + "url": { + "description": "The URL of the console of the cluster.", + "type": "string" + } + } + }, + "ClusterCredentials": { + "description": "Credentials of the a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ClusterCredentials' if this is a complete object or 'ClusterCredentialsLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "kubeconfig": { + "description": "Administrator _kubeconfig_ file for the cluster.", + "type": "string" + } + } + }, + "ClusterDeployment": { + "description": "Representation of a clusterdeployment.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ClusterDeployment' if this is a complete object or 'ClusterDeploymentLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "content": { + "description": "Content of the clusterdeployment.", + "type": "object" + } + } + }, + "ClusterHealthState": { + "description": "ClusterHealthState indicates the health of a cluster.", + "type": "string", + "enum": [ + "healthy", + "unhealthy", + "unknown" + ] + }, + "ClusterLink": { + "description": "Definition of a cluster link.", + "properties": { + "href": { + "description": "HREF for the cluster, filled in response.", + "type": "string" + }, + "id": { + "description": "The cluster's ID.", + "type": "string" + } + } + }, + "ClusterNodes": { + "description": "Counts of different classes of nodes inside a cluster.", + "properties": { + "autoscale_compute": { + "description": "Details for auto-scaling the compute machine pool.\nCompute and AutoscaleCompute cannot be used together.", + "$ref": "#/components/schemas/MachinePoolAutoscaling" + }, + "availability_zones": { + "description": "The availability zones upon which the nodes are created.", + "type": "array", + "items": { + "type": "string" + } + }, + "compute": { + "description": "Number of compute nodes of the cluster.\nCompute and AutoscaleCompute cannot be used together.", + "type": "integer", + "format": "int32" + }, + "compute_labels": { + "description": "The labels set on the \"default\" compute machine pool.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "compute_machine_type": { + "description": "The compute machine type to use, for example `r5.xlarge`.", + "$ref": "#/components/schemas/MachineType" + }, + "compute_root_volume": { + "description": "The compute machine root volume capabilities.", + "$ref": "#/components/schemas/RootVolume" + }, + "infra": { + "description": "Number of infrastructure nodes of the cluster.", + "type": "integer", + "format": "int32" + }, + "infra_machine_type": { + "description": "The infra machine type to use, for example `r5.xlarge` (Optional).", + "$ref": "#/components/schemas/MachineType" + }, + "master": { + "description": "Number of master nodes of the cluster.", + "type": "integer", + "format": "int32" + }, + "master_machine_type": { + "description": "The master machine type to use, for example `r5.xlarge` (Optional).", + "$ref": "#/components/schemas/MachineType" + }, + "security_group_filters": { + "description": "List of security groups to be applied to nodes (Optional).", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachinePoolSecurityGroupFilter" + } + }, + "total": { + "description": "Total number of nodes of the cluster.", + "type": "integer", + "format": "int32" + } + } + }, + "ClusterOperatorInfo": { + "properties": { + "condition": { + "description": "Operator status. Empty string if unknown.", + "$ref": "#/components/schemas/ClusterOperatorState" + }, + "name": { + "description": "Name of the operator.", + "type": "string" + }, + "reason": { + "description": "Extra detail on condition, if available. Empty string if unknown.", + "type": "string" + }, + "time": { + "description": "Time when the sample was obtained, in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) format.", + "type": "string", + "format": "date-time" + }, + "version": { + "description": "Current version of the operator. Empty string if unknown.", + "type": "string" + } + } + }, + "ClusterOperatorState": { + "description": "Overall state of a cluster operator.", + "type": "string", + "enum": [ + "available", + "degraded", + "failing", + "upgrading" + ] + }, + "ClusterOperatorsInfo": { + "description": "Provides detailed information about the operators installed on the cluster.", + "properties": { + "operators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ClusterOperatorInfo" + } + } + } + }, + "ClusterRegistration": { + "description": "Registration of a new cluster to the service.\n\nFor example, to register a cluster that has been provisioned outside\nof this service, send a a request like this:\n\n```http\nPOST /api/clusters_mgmt/v1/register_cluster HTTP/1.1\n```\n\nWith a request body like this:\n\n```json\n{\n \"external_id\": \"d656aecf-11a6-4782-ad86-8f72638449ba\",\n \"subscription_id\": \"...\",\n \"organization_id\": \"...\"\n}\n```", + "properties": { + "console_url": { + "description": "Optional Console URL of the cluster.", + "type": "string" + }, + "external_id": { + "description": "Identifier of the cluster generated by the installer.", + "type": "string" + }, + "organization_id": { + "description": "Organization identifier of the cluster generated by the\naccount manager.", + "type": "string" + }, + "subscription_id": { + "description": "Subscription identifier of the cluster generated by the account\nmanager.", + "type": "string" + } + } + }, + "ClusterResources": { + "description": "Cluster Resource which belongs to a cluster, example Cluster Deployment.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ClusterResources' if this is a complete object or 'ClusterResourcesLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster ID for the fetched resources", + "type": "string" + }, + "creation_timestamp": { + "description": "Date and time when the resources were fetched.", + "type": "string", + "format": "date-time" + }, + "resources": { + "description": "Returned map of cluster resources fetched.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "ClusterState": { + "description": "Overall state of a cluster.", + "type": "string", + "enum": [ + "error", + "hibernating", + "installing", + "pending", + "powering_down", + "ready", + "resuming", + "uninstalling", + "unknown", + "validating", + "waiting" + ] + }, + "ClusterStatus": { + "description": "Detailed status of a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ClusterStatus' if this is a complete object or 'ClusterStatusLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "dns_ready": { + "description": "DNSReady from Provisioner", + "type": "boolean" + }, + "oidc_ready": { + "description": "OIDCReady from user configuration.", + "type": "boolean" + }, + "configuration_mode": { + "description": "Configuration mode", + "$ref": "#/components/schemas/ClusterConfigurationMode" + }, + "current_compute": { + "description": "Current Replicas available for a Hosted Cluster", + "type": "integer", + "format": "int32" + }, + "description": { + "description": "Detailed description of the cluster status.", + "type": "string" + }, + "limited_support_reason_count": { + "description": "Limited Support Reason Count", + "type": "integer", + "format": "int32" + }, + "provision_error_code": { + "description": "Provisioning Error Code", + "type": "string" + }, + "provision_error_message": { + "description": "Provisioning Error Message", + "type": "string" + }, + "state": { + "description": "The overall state of the cluster.", + "$ref": "#/components/schemas/ClusterState" + } + } + }, + "ComponentRoute": { + "description": "Representation of a Component Route.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ComponentRoute' if this is a complete object or 'ComponentRouteLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "hostname": { + "description": "Hostname of the route.", + "type": "string" + }, + "tls_secret_ref": { + "description": "TLS Secret reference of the route.", + "type": "string" + } + } + }, + "ComponentRouteType": { + "description": "Type of Component Route.", + "type": "string", + "enum": [ + "console", + "downloads", + "oauth" + ] + }, + "ControlPlaneUpgradePolicy": { + "description": "Representation of an upgrade policy that can be set for a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ControlPlaneUpgradePolicy' if this is a complete object or 'ControlPlaneUpgradePolicyLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster ID this upgrade policy for control plane is defined for.", + "type": "string" + }, + "creation_timestamp": { + "description": "Timestamp for creation of resource.", + "type": "string", + "format": "date-time" + }, + "enable_minor_version_upgrades": { + "description": "Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed).", + "type": "boolean" + }, + "last_update_timestamp": { + "description": "Timestamp for last update that happened to resource.", + "type": "string", + "format": "date-time" + }, + "next_run": { + "description": "Next time the upgrade should run.", + "type": "string", + "format": "date-time" + }, + "schedule": { + "description": "Schedule cron expression that defines automatic upgrade scheduling.", + "type": "string" + }, + "schedule_type": { + "description": "Schedule type of the control plane upgrade.", + "$ref": "#/components/schemas/ScheduleType" + }, + "state": { + "description": "State of the upgrade policy for the hosted control plane.", + "$ref": "#/components/schemas/UpgradePolicyState" + }, + "upgrade_type": { + "description": "Upgrade type of the control plane.", + "$ref": "#/components/schemas/UpgradeType" + }, + "version": { + "description": "Version is the desired upgrade version.", + "type": "string" + } + } + }, + "CredentialRequest": { + "description": "Contains the necessary attributes to allow each operator to access the necessary AWS resources", + "properties": { + "name": { + "description": "Name of the credentials secret used to access cloud resources", + "type": "string" + }, + "namespace": { + "description": "Namespace where the credentials secret lives in the cluster", + "type": "string" + }, + "policy_permissions": { + "description": "List of policy permissions needed to access cloud resources", + "type": "array", + "items": { + "type": "string" + } + }, + "service_account": { + "description": "Service account name to use when authenticating", + "type": "string" + } + } + }, + "DeleteProtection": { + "description": "DeleteProtection configuration.", + "properties": { + "enabled": { + "description": "Boolean flag indicating if the cluster should be be using _DeleteProtection_.\n\nBy default this is `false`.\n\nTo enable it a SREP needs to patch the value through OCM API", + "type": "boolean" + } + } + }, + "DetectionType": { + "type": "string", + "enum": [ + "auto", + "manual" + ] + }, + "Ec2MetadataHttpTokens": { + "description": "Which Ec2MetadataHttpTokens to use for metadata service interaction options for EC2 instances", + "type": "string", + "enum": [ + "optional", + "required" + ] + }, + "EncryptionKey": { + "description": "Description of a cloud provider encryption key.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'EncryptionKey' if this is a complete object or 'EncryptionKeyLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "name": { + "description": "Name of the encryption key.", + "type": "string" + } + } + }, + "Environment": { + "description": "Description of an environment", + "properties": { + "backplane_url": { + "description": "the backplane url for the environment", + "type": "string" + }, + "last_limited_support_check": { + "description": "last time that the worker checked for limited support clusters", + "type": "string", + "format": "date-time" + }, + "last_upgrade_available_check": { + "description": "last time that the worker checked for available upgrades", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "environment name", + "type": "string" + } + } + }, + "Event": { + "description": "Representation of a trackable event.", + "properties": { + "body": { + "description": "Body of the event to track the details of the tracking event as Key value pair", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "key": { + "description": "Key of the event to be tracked. This key should start with an\nuppercase letter followed by alphanumeric characters or\nunderscores. The entire key needs to be smaller than 64 characters.", + "type": "string" + } + } + }, + "ExternalAuth": { + "description": "Representation of an external authentication provider.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ExternalAuth' if this is a complete object or 'ExternalAuthLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "claim": { + "description": "The rules on how to transform information from an ID token into a cluster identity.", + "$ref": "#/components/schemas/ExternalAuthClaim" + }, + "clients": { + "description": "The list of the platform's clients that need to request tokens from the issuer.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalAuthClientConfig" + } + }, + "issuer": { + "description": "The issuer describes the attributes of the OIDC token issuer.", + "$ref": "#/components/schemas/TokenIssuer" + } + } + }, + "ExternalAuthClaim": { + "description": "The claims and validation rules used in the configuration of the external authentication.", + "properties": { + "mappings": { + "description": "Mapping describes rules on how to transform information from an ID token into a cluster identity.", + "$ref": "#/components/schemas/TokenClaimMappings" + }, + "validation_rules": { + "description": "ValidationRules are rules that are applied to validate token claims to authenticate users.", + "type": "array", + "items": { + "$ref": "#/components/schemas/TokenClaimValidationRule" + } + } + } + }, + "ExternalAuthClientConfig": { + "description": "ExternalAuthClientConfig contains configuration for the platform's clients that\nneed to request tokens from the issuer.", + "properties": { + "id": { + "description": "The identifier of the OIDC client from the OIDC provider.", + "type": "string" + }, + "component": { + "description": "The component that is supposed to consume this client configuration.", + "$ref": "#/components/schemas/ClientComponent" + }, + "extra_scopes": { + "description": "ExtraScopes is an optional set of scopes to request tokens with.", + "type": "array", + "items": { + "type": "string" + } + }, + "secret": { + "description": "The secret of the OIDC client from the OIDC provider.", + "type": "string" + } + } + }, + "ExternalAuthConfig": { + "description": "ExternalAuthConfig configuration", + "properties": { + "enabled": { + "description": "Boolean flag indicating if the cluster should use an external authentication configuration.\n\nBy default this is false.\n\nTo enable it the cluster needs to be ROSA HCP cluster and the organization of the user needs\nto have the `external-authentication` feature toggle enabled.", + "type": "boolean" + }, + "external_auths": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExternalAuth" + } + } + } + }, + "ExternalConfiguration": { + "description": "Representation of cluster external configuration.", + "properties": { + "labels": { + "description": "list of labels externally configured on the clusterdeployment.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Label" + } + }, + "manifests": { + "description": "list of manifest externally configured for a hosted cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Manifest" + } + }, + "syncsets": { + "description": "list of syncsets externally configured on the cluster.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Syncset" + } + } + } + }, + "Flavour": { + "description": "Set of predefined properties of a cluster. For example, a _huge_ flavour can be a cluster\nwith 10 infra nodes and 1000 compute nodes.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Flavour' if this is a complete object or 'FlavourLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "aws": { + "description": "Default _Amazon Web Services_ settings of the cluster.", + "$ref": "#/components/schemas/AWSFlavour" + }, + "gcp": { + "description": "Default _Google Cloud Platform_ settings of the cluster.", + "$ref": "#/components/schemas/GCPFlavour" + }, + "name": { + "description": "Human friendly identifier of the cluster, for example `4`.\n\nNOTE: Currently for all flavours the `id` and `name` attributes have exactly the\nsame values.", + "type": "string" + }, + "network": { + "description": "Default network settings of the cluster.\n\nThese can be overridden specifying in the cluster itself a different set of settings.", + "$ref": "#/components/schemas/Network" + }, + "nodes": { + "description": "Number of nodes that will be used by default when creating a cluster that uses\nthis flavour.\n\nThese can be overridden specifying in the cluster itself a different number of nodes.", + "$ref": "#/components/schemas/FlavourNodes" + } + } + }, + "FlavourNodes": { + "description": "Counts of different classes of nodes inside a flavour.", + "properties": { + "master": { + "description": "Number of master nodes of the cluster.", + "type": "integer", + "format": "int32" + } + } + }, + "GcpAuthentication": { + "description": "Google cloud platform authentication method of a cluster.", + "properties": { + "href": { + "description": "Self link", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object", + "type": "string" + }, + "kind": { + "description": "Indicates the type of this object", + "type": "string" + } + } + }, + "GcpSecurity": { + "description": "Google cloud platform security settings of a cluster.", + "properties": { + "secure_boot": { + "description": "Determines if Shielded VM feature \"Secure Boot\" should be set for the nodes of the cluster.", + "type": "boolean" + } + } + }, + "GithubIdentityProvider": { + "description": "Details for `github` identity providers.", + "properties": { + "ca": { + "description": "Optional trusted certificate authority bundle to use when making requests tot he server.", + "type": "string" + }, + "client_id": { + "description": "Client identifier of a registered _GitHub_ OAuth application.", + "type": "string" + }, + "client_secret": { + "description": "Client secret of a registered _GitHub_ OAuth application.", + "type": "string" + }, + "hostname": { + "description": "For _GitHub Enterprise_ you must provide the host name of your instance, such as\n`example.com`. This value must match the _GitHub Enterprise_ host name value in the\n`/setup/settings` file and cannot include a port number.\n\nFor plain _GitHub_ omit this parameter.", + "type": "string" + }, + "organizations": { + "description": "Optional list of organizations. Cannot be used in combination with the Teams field.", + "type": "array", + "items": { + "type": "string" + } + }, + "teams": { + "description": "Optional list of teams. Cannot be used in combination with the Organizations field.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "GitlabIdentityProvider": { + "description": "Details for `gitlab` identity providers.", + "properties": { + "ca": { + "description": "Optional trusted certificate authority bundle to use when making requests tot he server.", + "type": "string" + }, + "url": { + "description": "URL of the _GitLab_ instance.", + "type": "string" + }, + "client_id": { + "description": "Client identifier of a registered _GitLab_ OAuth application.", + "type": "string" + }, + "client_secret": { + "description": "Client secret issued by _GitLab_.", + "type": "string" + } + } + }, + "GoogleIdentityProvider": { + "description": "Details for `google` identity providers.", + "properties": { + "client_id": { + "description": "Client identifier of a registered _Google_ project.", + "type": "string" + }, + "client_secret": { + "description": "Client secret issued by _Google_.", + "type": "string" + }, + "hosted_domain": { + "description": "Optional hosted domain to restrict sign-in accounts to.", + "type": "string" + } + } + }, + "Group": { + "description": "Representation of a group of users.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Group' if this is a complete object or 'GroupLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "users": { + "description": "List of users of the group.", + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "GroupsClaim": { + "properties": { + "claim": { + "description": "The claim used in the token.", + "type": "string" + }, + "prefix": { + "description": "A prefix contatenated in the claim (Optional).", + "type": "string" + } + } + }, + "Hypershift": { + "description": "Hypershift configuration.", + "properties": { + "enabled": { + "description": "Boolean flag indicating if the cluster should be creating using _Hypershift_.\n\nBy default this is `false`.\n\nTo enable it the cluster needs to be ROSA cluster and the organization of the user needs\nto have the `hypershift` capability enabled.", + "type": "boolean" + } + } + }, + "HypershiftConfig": { + "description": "Hypershift configuration.", + "properties": { + "enabled": { + "description": "Boolean flag indicating if the cluster should be creating using _Hypershift_.\n\nBy default this is `false`.\n\nTo enable it the cluster needs to be ROSA cluster and the organization of the user needs\nto have the `hypershift` capability enabled.", + "type": "boolean" + }, + "management_cluster": { + "description": "Contains the name of the current management cluster for this Hypershift cluster.\nEmpty for non Hypershift clusters.", + "type": "string" + } + } + }, + "IdentityProvider": { + "description": "Representation of an identity provider.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'IdentityProvider' if this is a complete object or 'IdentityProviderLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "ldap": { + "description": "Details for `ldap` identity providers.", + "$ref": "#/components/schemas/LDAPIdentityProvider" + }, + "challenge": { + "description": "When `true` unauthenticated token requests from non-web clients (like the CLI) are sent a\n`WWW-Authenticate` challenge header for this provider.", + "type": "boolean" + }, + "github": { + "description": "Details for `github` identity providers.", + "$ref": "#/components/schemas/GithubIdentityProvider" + }, + "gitlab": { + "description": "Details for `gitlab` identity providers.", + "$ref": "#/components/schemas/GitlabIdentityProvider" + }, + "google": { + "description": "Details for `google` identity providers.", + "$ref": "#/components/schemas/GoogleIdentityProvider" + }, + "htpasswd": { + "description": "Details for `htpasswd` identity providers.", + "$ref": "#/components/schemas/HTPasswdIdentityProvider" + }, + "login": { + "description": "When `true` unauthenticated token requests from web clients (like the web console) are\nredirected to the authorize URL to log in.", + "type": "boolean" + }, + "mapping_method": { + "description": "Controls how mappings are established between this provider's identities and user\nobjects.", + "$ref": "#/components/schemas/IdentityProviderMappingMethod" + }, + "name": { + "description": "The name of the identity provider.", + "type": "string" + }, + "open_id": { + "description": "Details for `openid` identity providers.", + "$ref": "#/components/schemas/OpenIDIdentityProvider" + }, + "type": { + "description": "Type of identity provider. The rest of the attributes will be populated according to this\nvalue. For example, if the type is `github` then only the `github` attribute will be\npopulated.", + "$ref": "#/components/schemas/IdentityProviderType" + } + } + }, + "IdentityProviderMappingMethod": { + "description": "Controls how mappings are established between provider identities and user objects.", + "type": "string", + "enum": [ + "add", + "claim", + "generate", + "lookup" + ] + }, + "IdentityProviderType": { + "description": "Type of identity provider.", + "type": "string", + "enum": [ + "LDAPIdentityProvider", + "GithubIdentityProvider", + "GitlabIdentityProvider", + "GoogleIdentityProvider", + "HTPasswdIdentityProvider", + "OpenIDIdentityProvider" + ] + }, + "ImageOverrides": { + "description": "ImageOverrides holds the lists of available images per cloud provider.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ImageOverrides' if this is a complete object or 'ImageOverridesLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "aws": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AMIOverride" + } + }, + "gcp": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GCPImageOverride" + } + } + } + }, + "InflightCheck": { + "description": "Representation of check running before the cluster is provisioned.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'InflightCheck' if this is a complete object or 'InflightCheckLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "details": { + "description": "Details regarding the state of the inflight check.", + "type": "object" + }, + "ended_at": { + "description": "The time the check finished running.", + "type": "string", + "format": "date-time" + }, + "name": { + "description": "The name of the inflight check.", + "type": "string" + }, + "restarts": { + "description": "The number of times the inflight check restarted.", + "type": "integer", + "format": "int32" + }, + "started_at": { + "description": "The time the check started running.", + "type": "string", + "format": "date-time" + }, + "state": { + "description": "State of the inflight check.", + "$ref": "#/components/schemas/InflightCheckState" + } + } + }, + "InflightCheckState": { + "description": "State of an inflight check.", + "type": "string", + "enum": [ + "failed", + "passed", + "pending", + "running" + ] + }, + "Ingress": { + "description": "Representation of an ingress.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Ingress' if this is a complete object or 'IngressLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "dns_name": { + "description": "DNS Name of the ingress.", + "type": "string" + }, + "cluster_routes_hostname": { + "description": "Cluster routes hostname.", + "type": "string" + }, + "cluster_routes_tls_secret_ref": { + "description": "Cluster routes TLS Secret reference.", + "type": "string" + }, + "component_routes": { + "description": "Component Routes settings.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ComponentRoute" + } + }, + "default": { + "description": "Indicates if this is the default ingress.", + "type": "boolean" + }, + "excluded_namespaces": { + "description": "A set of excluded namespaces for the ingress.", + "type": "array", + "items": { + "type": "string" + } + }, + "listening": { + "description": "Listening method of the ingress", + "$ref": "#/components/schemas/ListeningMethod" + }, + "load_balancer_type": { + "description": "Load Balancer type of the ingress", + "$ref": "#/components/schemas/LoadBalancerFlavor" + }, + "route_namespace_ownership_policy": { + "description": "Namespace Ownership Policy for the ingress.", + "$ref": "#/components/schemas/NamespaceOwnershipPolicy" + }, + "route_selectors": { + "description": "A set of labels for the ingress. ", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "route_wildcard_policy": { + "description": "Wildcard policy for the ingress.", + "$ref": "#/components/schemas/WildcardPolicy" + } + } + }, + "InstanceIAMRoles": { + "description": "Contains the necessary attributes to support role-based authentication on AWS.", + "properties": { + "master_role_arn": { + "description": "The IAM role ARN that will be attached to master instances", + "type": "string" + }, + "worker_role_arn": { + "description": "The IAM role ARN that will be attached to worker instances", + "type": "string" + } + } + }, + "KeyRing": { + "description": "Description of a cloud provider key ring.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'KeyRing' if this is a complete object or 'KeyRingLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "name": { + "description": "Name of the key ring.", + "type": "string" + } + } + }, + "KubeletConfig": { + "description": "OCM representation of KubeletConfig, exposing the fields of Kubernetes\nKubeletConfig that can be managed by users", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'KubeletConfig' if this is a complete object or 'KubeletConfigLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "name": { + "description": "Allows the user to specify the name to be used to identify this KubeletConfig.\nOptional. A name will be generated if not provided.", + "type": "string" + }, + "pod_pids_limit": { + "description": "Allows the user to specify the podPidsLimit to be applied via KubeletConfig.\nUseful if workloads have greater PIDs limit requirements than the OCP default.", + "type": "integer", + "format": "int32" + } + } + }, + "Label": { + "description": "Representation of a label in clusterdeployment.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Label' if this is a complete object or 'LabelLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "key": { + "description": "the key of the label", + "type": "string" + }, + "value": { + "description": "the value to set in the label", + "type": "string" + } + } + }, + "LimitedSupportReason": { + "description": "A reason that a cluster is in limited support.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'LimitedSupportReason' if this is a complete object or 'LimitedSupportReasonLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "creation_timestamp": { + "description": "The time the reason was detected.", + "type": "string", + "format": "date-time" + }, + "details": { + "description": "URL with a link to a detailed description of the reason.", + "type": "string" + }, + "detection_type": { + "description": "Indicates if the reason was detected automatically or manually.\nWhen creating a new reason this field should be empty or \"manual\".", + "$ref": "#/components/schemas/DetectionType" + }, + "summary": { + "description": "Summary of the reason.", + "type": "string" + }, + "template": { + "description": "Optional link to a template with summary and details.", + "$ref": "#/components/schemas/LimitedSupportReasonTemplate" + } + } + }, + "LimitedSupportReasonTemplate": { + "description": "A template for cluster limited support reason.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'LimitedSupportReasonTemplate' if this is a complete object or 'LimitedSupportReasonTemplateLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "details": { + "description": "A detailed description of the reason.", + "type": "string" + }, + "summary": { + "description": "Summary of the reason.", + "type": "string" + } + } + }, + "ListeningMethod": { + "description": "Cluster components listening method.", + "type": "string", + "enum": [ + "external", + "internal" + ] + }, + "LoadBalancerFlavor": { + "description": "Type of load balancer for AWS cloud provider parameters.", + "type": "string", + "enum": [ + "classic", + "nlb" + ] + }, + "Log": { + "description": "Log of the cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Log' if this is a complete object or 'LogLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "content": { + "description": "Content of the log.", + "type": "string" + } + } + }, + "MachinePool": { + "description": "Representation of a machine pool in a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'MachinePool' if this is a complete object or 'MachinePoolLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "aws": { + "description": "AWS specific parameters (Optional).", + "$ref": "#/components/schemas/AWSMachinePool" + }, + "autoscaling": { + "description": "Details for auto-scaling the machine pool.\nReplicas and autoscaling cannot be used together.", + "$ref": "#/components/schemas/MachinePoolAutoscaling" + }, + "availability_zones": { + "description": "The availability zones upon which the nodes are created.", + "type": "array", + "items": { + "type": "string" + } + }, + "instance_type": { + "description": "The instance type of Nodes to create.", + "type": "string" + }, + "labels": { + "description": "The labels set on the Nodes created.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "replicas": { + "description": "The number of Machines (and Nodes) to create.\nReplicas and autoscaling cannot be used together.", + "type": "integer", + "format": "int32" + }, + "root_volume": { + "description": "The machine root volume capabilities.", + "$ref": "#/components/schemas/RootVolume" + }, + "security_group_filters": { + "description": "List of security groups to be applied to MachinePool (Optional)", + "type": "array", + "items": { + "$ref": "#/components/schemas/MachinePoolSecurityGroupFilter" + } + }, + "subnets": { + "description": "The subnets upon which the nodes are created.", + "type": "array", + "items": { + "type": "string" + } + }, + "taints": { + "description": "The taints set on the Nodes created.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Taint" + } + } + } + }, + "MachinePoolAutoscaling": { + "description": "Representation of a autoscaling in a machine pool.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'MachinePoolAutoscaling' if this is a complete object or 'MachinePoolAutoscalingLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "max_replicas": { + "description": "The maximum number of replicas for the machine pool.", + "type": "integer", + "format": "int32" + }, + "min_replicas": { + "description": "The minimum number of replicas for the machine pool.", + "type": "integer", + "format": "int32" + } + } + }, + "MachinePoolSecurityGroupFilter": { + "description": "Security Group Filter object, containing name of the filter tag and value of the filter tag", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "MachineType": { + "description": "Machine type.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'MachineType' if this is a complete object or 'MachineTypeLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "ccs_only": { + "description": "'true' if the instance type is supported only for CCS clusters, 'false' otherwise.", + "type": "boolean" + }, + "cpu": { + "description": "The amount of cpu's of the machine type.", + "$ref": "#/components/schemas/Value" + }, + "architecture": { + "description": "The architecture of the machine type.", + "$ref": "#/components/schemas/ProcessorType" + }, + "category": { + "description": "The category which the machine type is suitable for.", + "$ref": "#/components/schemas/MachineTypeCategory" + }, + "cloud_provider": { + "description": "Link to the cloud provider that the machine type belongs to.", + "$ref": "#/components/schemas/CloudProvider" + }, + "generic_name": { + "description": "Generic name for quota purposes, for example `highmem-4`.\nCloud provider agnostic - many values are shared between \"similar\"\nmachine types on different providers.\nCorresponds to `resource_name` values in \"compute.node\" quota cost data.", + "type": "string" + }, + "memory": { + "description": "The amount of memory of the machine type.", + "$ref": "#/components/schemas/Value" + }, + "name": { + "description": "Human friendly identifier of the machine type, for example `r5.xlarge - Memory Optimized`.", + "type": "string" + }, + "size": { + "description": "The size of the machine type.", + "$ref": "#/components/schemas/MachineTypeSize" + } + } + }, + "MachineTypeCategory": { + "description": "Machine type category.", + "type": "string", + "enum": [ + "accelerated_computing", + "compute_optimized", + "general_purpose", + "memory_optimized" + ] + }, + "MachineTypeSize": { + "description": "Machine type size.", + "type": "string", + "enum": [ + "large", + "medium", + "small" + ] + }, + "ManagedService": { + "description": "Contains the necessary attributes to support role-based authentication on AWS.", + "properties": { + "enabled": { + "description": "Indicates whether the cluster belongs to a managed service\nThis should only be set by the \"Managed Service\" service.\nclusters with this set can only be modified by the \"Managed Service\" service.", + "type": "boolean" + } + } + }, + "Manifest": { + "description": "Representation of a manifestwork.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Manifest' if this is a complete object or 'ManifestLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "workloads": { + "description": "List of k8s objects to deploy on a hosted cluster.", + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "NamespaceOwnershipPolicy": { + "description": "Type of Namespace Ownership Policy.", + "type": "string", + "enum": [ + "InterNamespaceAllowed", + "Strict" + ] + }, + "Network": { + "description": "Network configuration of a cluster.", + "properties": { + "host_prefix": { + "description": "Network host prefix which is defaulted to `23` if not specified.", + "type": "integer", + "format": "int32" + }, + "machine_cidr": { + "description": "IP address block from which to assign machine IP addresses, for example `10.0.0.0/16`.", + "type": "string" + }, + "pod_cidr": { + "description": "IP address block from which to assign pod IP addresses, for example `10.128.0.0/14`.", + "type": "string" + }, + "service_cidr": { + "description": "IP address block from which to assign service IP addresses, for example `172.30.0.0/16`.", + "type": "string" + }, + "type": { + "description": "The main controller responsible for rendering the core networking components.", + "type": "string" + } + } + }, + "NetworkVerification": { + "properties": { + "cloud_provider_data": { + "description": "Cloud provider data to execute the network verification.", + "$ref": "#/components/schemas/CloudProviderData" + }, + "cluster_id": { + "description": "Cluster ID needed to execute the network verification.", + "type": "string" + }, + "items": { + "description": "Details about each subnet network verification.", + "type": "array", + "items": { + "$ref": "#/components/schemas/SubnetNetworkVerification" + } + }, + "platform": { + "description": "Platform needed to execute the network verification.", + "$ref": "#/components/schemas/Platform" + }, + "total": { + "description": "Amount of network verifier executions started.", + "type": "integer", + "format": "int32" + } + } + }, + "NodeInfo": { + "description": "Provides information about a node from specific type in the cluster.", + "properties": { + "amount": { + "description": "The amount of the nodes from this type.", + "type": "integer", + "format": "int32" + }, + "type": { + "description": "The Node type.", + "$ref": "#/components/schemas/NodeType" + } + } + }, + "NodePool": { + "description": "Representation of a node pool in a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'NodePool' if this is a complete object or 'NodePoolLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "aws_node_pool": { + "description": "AWS specific parameters (Optional).", + "$ref": "#/components/schemas/AWSNodePool" + }, + "auto_repair": { + "description": "Specifies whether health checks should be enabled for machines in the NodePool.", + "type": "boolean" + }, + "autoscaling": { + "description": "Details for auto-scaling the machine pool.\nReplicas and autoscaling cannot be used together.", + "$ref": "#/components/schemas/NodePoolAutoscaling" + }, + "availability_zone": { + "description": "The availability zone upon which the node is created.", + "type": "string" + }, + "azure_node_pool": { + "description": "Azure specific parameters.", + "$ref": "#/components/schemas/AzureNodePool" + }, + "kubelet_configs": { + "description": "The names of the KubeletConfigs for this node pool.", + "type": "array", + "items": { + "type": "string" + } + }, + "labels": { + "description": "The labels set on the Nodes created.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "management_upgrade": { + "description": "Management parameters (Optional).", + "$ref": "#/components/schemas/NodePoolManagementUpgrade" + }, + "node_drain_grace_period": { + "description": "Time to wait for a NodePool to drain when it is upgraded or replaced before it is forcibly removed.", + "$ref": "#/components/schemas/Value" + }, + "replicas": { + "description": "The number of Machines (and Nodes) to create.\nReplicas and autoscaling cannot be used together.", + "type": "integer", + "format": "int32" + }, + "status": { + "description": "NodePool status.", + "$ref": "#/components/schemas/NodePoolStatus" + }, + "subnet": { + "description": "The subnet upon which the nodes are created.", + "type": "string" + }, + "taints": { + "description": "The taints set on the Nodes created.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Taint" + } + }, + "tuning_configs": { + "description": "The names of the tuning configs for this node pool.", + "type": "array", + "items": { + "type": "string" + } + }, + "version": { + "description": "Version of the node pool.", + "$ref": "#/components/schemas/Version" + } + } + }, + "NodePoolAutoscaling": { + "description": "Representation of a autoscaling in a node pool.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'NodePoolAutoscaling' if this is a complete object or 'NodePoolAutoscalingLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "max_replica": { + "description": "The maximum number of replicas for the node pool.", + "type": "integer", + "format": "int32" + }, + "min_replica": { + "description": "The minimum number of replicas for the node pool.", + "type": "integer", + "format": "int32" + } + } + }, + "NodePoolManagementUpgrade": { + "description": "Representation of node pool management.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'NodePoolManagementUpgrade' if this is a complete object or 'NodePoolManagementUpgradeLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "max_surge": { + "description": "Maximum number of nodes in the NodePool of a ROSA HCP cluster that can be scheduled above the desired number of nodes during the upgrade.", + "type": "string" + }, + "max_unavailable": { + "description": "Maximum number of nodes in the NodePool of a ROSA HCP cluster that can be unavailable during the upgrade.", + "type": "string" + }, + "type": { + "description": "Type of strategy for handling upgrades.", + "type": "string" + } + } + }, + "NodePoolStatus": { + "description": "Representation of the status of a node pool.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'NodePoolStatus' if this is a complete object or 'NodePoolStatusLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "current_replicas": { + "description": "The current number of replicas for the node pool.", + "type": "integer", + "format": "int32" + }, + "message": { + "description": "Adds additional information about the NodePool status when the node pool doesn't reach the desired replicas.", + "type": "string" + } + } + }, + "NodePoolUpgradePolicy": { + "description": "Representation of an upgrade policy that can be set for a node pool.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'NodePoolUpgradePolicy' if this is a complete object or 'NodePoolUpgradePolicyLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster ID this upgrade policy for node pool is defined for.", + "type": "string" + }, + "creation_timestamp": { + "description": "Timestamp for creation of resource.", + "type": "string", + "format": "date-time" + }, + "enable_minor_version_upgrades": { + "description": "Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed).", + "type": "boolean" + }, + "last_update_timestamp": { + "description": "Timestamp for last update that happened to resource.", + "type": "string", + "format": "date-time" + }, + "next_run": { + "description": "Next time the upgrade should run.", + "type": "string", + "format": "date-time" + }, + "node_pool_id": { + "description": "Node Pool ID this upgrade policy is defined for.", + "type": "string" + }, + "schedule": { + "description": "Schedule cron expression that defines automatic upgrade scheduling.", + "type": "string" + }, + "schedule_type": { + "description": "Schedule type of the upgrade.", + "$ref": "#/components/schemas/ScheduleType" + }, + "state": { + "description": "State of the upgrade policy for the node pool.", + "$ref": "#/components/schemas/UpgradePolicyState" + }, + "upgrade_type": { + "description": "Upgrade type of the node pool.", + "$ref": "#/components/schemas/UpgradeType" + }, + "version": { + "description": "Version is the desired upgrade version.", + "type": "string" + } + } + }, + "NodeType": { + "description": "Type of node received via telemetry.", + "type": "string", + "enum": [ + "compute", + "infra", + "master" + ] + }, + "NodesInfo": { + "description": "Provides information about the nodes in the cluster.", + "properties": { + "nodes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/NodeInfo" + } + } + } + }, + "OidcConfig": { + "description": "Contains the necessary attributes to support oidc configuration hosting under Red Hat or registering a Customer's byo oidc config.", + "properties": { + "href": { + "description": "HREF for the oidc config, filled in response.", + "type": "string" + }, + "id": { + "description": "ID for the oidc config, filled in response.", + "type": "string" + }, + "creation_timestamp": { + "description": "Creation timestamp, filled in response.", + "type": "string", + "format": "date-time" + }, + "installer_role_arn": { + "description": "ARN of the AWS role to assume when installing the cluster as to reveal the secret, supplied in request. It is only to be used in Unmanaged Oidc Config.", + "type": "string" + }, + "issuer_url": { + "description": "Issuer URL, filled in response when Managed and supplied in Unmanaged.", + "type": "string" + }, + "last_update_timestamp": { + "description": "Last update timestamp, filled when patching a valid attribute of this oidc config.", + "type": "string", + "format": "date-time" + }, + "last_used_timestamp": { + "description": "Last used timestamp, filled by the latest cluster that used this oidc config.", + "type": "string", + "format": "date-time" + }, + "managed": { + "description": "Indicates whether it is Managed or Unmanaged (Customer hosted).", + "type": "boolean" + }, + "organization_id": { + "description": "Organization ID, filled in response respecting token provided.", + "type": "string" + }, + "reusable": { + "description": "Indicates whether the Oidc Config can be reused.", + "type": "boolean" + }, + "secret_arn": { + "description": "Secrets Manager ARN for the OIDC private key, supplied in request. It is only to be used in Unmanaged Oidc Config.", + "type": "string" + } + } + }, + "OpenIDClaims": { + "description": "_OpenID_ identity provider claims.", + "properties": { + "email": { + "description": "List of claims to use as the mail address.", + "type": "array", + "items": { + "type": "string" + } + }, + "groups": { + "description": "List of claims to use as the group name.", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "List of claims to use as the display name.", + "type": "array", + "items": { + "type": "string" + } + }, + "preferred_username": { + "description": "List of claims to use as the preferred user name when provisioning a user.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "OpenIDIdentityProvider": { + "description": "Details for `openid` identity providers.", + "properties": { + "ca": { + "description": "Certificate bunde to use to validate server certificates for the configured URL.", + "type": "string" + }, + "claims": { + "description": "Claims used to configure the provider.", + "$ref": "#/components/schemas/OpenIDClaims" + }, + "client_id": { + "description": "Identifier of a client registered with the _OpenID_ provider.", + "type": "string" + }, + "client_secret": { + "description": "Client secret.", + "type": "string" + }, + "extra_authorize_parameters": { + "description": "Optional map of extra parameters to add to the authorization token request.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "extra_scopes": { + "description": "Optional list of scopes to request, in addition to the `openid` scope, during the\nauthorization token request.", + "type": "array", + "items": { + "type": "string" + } + }, + "issuer": { + "description": "The URL that the OpenID Provider asserts as the Issuer Identifier", + "type": "string" + } + } + }, + "OperatorIAMRole": { + "description": "Contains the necessary attributes to allow each operator to access the necessary AWS resources", + "properties": { + "id": { + "description": "Randomly-generated ID to identify the operator role", + "type": "string" + }, + "name": { + "description": "Name of the credentials secret used to access cloud resources", + "type": "string" + }, + "namespace": { + "description": "Namespace where the credentials secret lives in the cluster", + "type": "string" + }, + "role_arn": { + "description": "Role to assume when accessing AWS resources", + "type": "string" + }, + "service_account": { + "description": "Service account name to use when authenticating", + "type": "string" + } + } + }, + "OrganizationLink": { + "description": "Definition of an organization link.", + "properties": { + "href": { + "description": "HREF for the Organization, filled in response.", + "type": "string" + }, + "id": { + "description": "The organization's ID.", + "type": "string" + } + } + }, + "PendingDeleteCluster": { + "description": "Represents a pending delete entry for a specific cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'PendingDeleteCluster' if this is a complete object or 'PendingDeleteClusterLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "best_effort": { + "description": "Flag indicating if the cluster deletion should be best-effort mode or not.", + "type": "boolean" + }, + "cluster": { + "description": "Cluster is the details of the cluster that is pending deletion.", + "$ref": "#/components/schemas/Cluster" + }, + "creation_timestamp": { + "description": "Date and time when the cluster was initially created, using the\nformat defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt).", + "type": "string", + "format": "date-time" + } + } + }, + "Platform": { + "description": "Representation of an platform type field.", + "type": "string", + "enum": [ + "aws", + "aws-classic", + "aws-hosted-cp", + "gcp", + "hostedcluster" + ] + }, + "PrivateLinkClusterConfiguration": { + "description": "Manages the configuration for the Private Links.", + "properties": { + "principals": { + "description": "List of additional principals for the Private Link", + "type": "array", + "items": { + "$ref": "#/components/schemas/PrivateLinkPrincipal" + } + } + } + }, + "PrivateLinkConfiguration": { + "description": "Manages the configuration for the Private Links.", + "properties": { + "principals": { + "description": "List of additional principals for the Private Link", + "$ref": "#/components/schemas/PrivateLinkPrincipals" + } + } + }, + "PrivateLinkPrincipal": { + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'PrivateLinkPrincipal' if this is a complete object or 'PrivateLinkPrincipalLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "principal": { + "description": "ARN for a principal that is allowed for this Private Link.", + "type": "string" + } + } + }, + "PrivateLinkPrincipals": { + "description": "Contains a list of principals for the Private Link.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'PrivateLinkPrincipals' if this is a complete object or 'PrivateLinkPrincipalsLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "principals": { + "description": "List of additional principals for the Private Link", + "type": "array", + "items": { + "$ref": "#/components/schemas/PrivateLinkPrincipal" + } + } + } + }, + "ProcessorType": { + "description": "Processor type category.", + "type": "string", + "enum": [ + "amd64", + "arm64" + ] + }, + "Product": { + "description": "Representation of an product that can be selected as a cluster type.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Product' if this is a complete object or 'ProductLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "name": { + "description": "Name of the product.", + "type": "string" + } + } + }, + "ProductMinimalVersion": { + "description": "Representation of a product minimal version.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ProductMinimalVersion' if this is a complete object or 'ProductMinimalVersionLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "rosa_cli": { + "description": "The ROSA CLI minimal version.", + "type": "string" + }, + "start_date": { + "description": "The start date for this minimal version.", + "type": "string", + "format": "date-time" + } + } + }, + "ProductTechnologyPreview": { + "description": "Representation of a product technology preview.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ProductTechnologyPreview' if this is a complete object or 'ProductTechnologyPreviewLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "additional_text": { + "description": "Message associated with this technology preview.", + "type": "string" + }, + "end_date": { + "description": "The end date for this technology preview.", + "type": "string", + "format": "date-time" + }, + "start_date": { + "description": "The start date for this technology preview.", + "type": "string", + "format": "date-time" + } + } + }, + "ProvisionShard": { + "description": "Contains the properties of the provision shard, including AWS and GCP related configurations", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ProvisionShard' if this is a complete object or 'ProvisionShardLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "aws_account_operator_config": { + "description": "Contains the configuration for the AWS account operator.", + "$ref": "#/components/schemas/ServerConfig" + }, + "aws_base_domain": { + "description": "Contains the AWS base domain.", + "type": "string" + }, + "gcp_base_domain": { + "description": "Contains the GCP base domain.", + "type": "string" + }, + "gcp_project_operator": { + "description": "Contains the configuration for the GCP project operator.", + "$ref": "#/components/schemas/ServerConfig" + }, + "cloud_provider": { + "description": "Contains the cloud provider name.", + "$ref": "#/components/schemas/CloudProvider" + }, + "creation_timestamp": { + "description": "Date and time when the provision shard was initially created, using the\nformat defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt).", + "type": "string", + "format": "date-time" + }, + "hive_config": { + "description": "Contains the configuration for Hive.", + "$ref": "#/components/schemas/ServerConfig" + }, + "hypershift_config": { + "description": "Contains the configuration for Hypershift.", + "$ref": "#/components/schemas/ServerConfig" + }, + "last_update_timestamp": { + "description": "Date and time when the provision shard was last updated, using the\nformat defined in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt).", + "type": "string", + "format": "date-time" + }, + "management_cluster": { + "description": "Contains the name of the management cluster for Hypershift clusters that are assigned to this shard.\nThis field is populated by OCM, and must not be overwritten via API.", + "type": "string" + }, + "region": { + "description": "Contains the cloud-provider region in which the provisioner spins up the cluster.", + "$ref": "#/components/schemas/CloudRegion" + }, + "status": { + "description": "Status of the provision shard. Possible values: active/maintenance/offline.", + "type": "string" + } + } + }, + "ProvisionShardTopology": { + "type": "string", + "enum": [ + "dedicated" + ] + }, + "Proxy": { + "description": "Proxy configuration of a cluster.", + "properties": { + "http_proxy": { + "description": "HTTPProxy is the URL of the proxy for HTTP requests.", + "type": "string" + }, + "https_proxy": { + "description": "HTTPSProxy is the URL of the proxy for HTTPS requests.", + "type": "string" + }, + "no_proxy": { + "description": "NoProxy is a comma-separated list of domains and CIDRs for which \nthe proxy should not be used", + "type": "string" + } + } + }, + "ReleaseImageDetails": { + "properties": { + "available_upgrades": { + "description": "AvailableUpgrades is the list of versions this version can be upgraded to.", + "type": "array", + "items": { + "type": "string" + } + }, + "release_image": { + "description": "ReleaseImage contains the URI of Openshift release image.", + "type": "string" + } + } + }, + "ReleaseImages": { + "properties": { + "arm64": { + "description": "Arm64 will contain the reference for the arm64 image which will be used for cluster deployments", + "$ref": "#/components/schemas/ReleaseImageDetails" + }, + "multi": { + "description": "Multi will contain the reference for the multi image which will be used for cluster deployments", + "$ref": "#/components/schemas/ReleaseImageDetails" + } + } + }, + "ResourceRange": { + "properties": { + "max": { + "type": "integer", + "format": "int32" + }, + "min": { + "type": "integer", + "format": "int32" + } + } + }, + "RolePolicy": { + "properties": { + "arn": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "RolePolicyBinding": { + "properties": { + "arn": { + "type": "string" + }, + "creation_timestamp": { + "type": "string", + "format": "date-time" + }, + "last_update_timestamp": { + "type": "string", + "format": "date-time" + }, + "name": { + "type": "string" + }, + "policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RolePolicy" + } + }, + "status": { + "$ref": "#/components/schemas/RolePolicyBindingStatus" + }, + "type": { + "type": "string" + } + } + }, + "RolePolicyBindingStatus": { + "properties": { + "description": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "RootVolume": { + "description": "Root volume capabilities.", + "properties": { + "aws": { + "description": "AWS volume specification", + "$ref": "#/components/schemas/AWSVolume" + }, + "gcp": { + "description": "GCP Volume specification", + "$ref": "#/components/schemas/GCPVolume" + } + } + }, + "ScheduleType": { + "description": "ScheduleType defines which type of scheduling should be used for the upgrade policy.", + "type": "string", + "enum": [ + "automatic", + "manual" + ] + }, + "SecurityGroup": { + "description": "AWS security group object", + "properties": { + "id": { + "description": "The security group ID.", + "type": "string" + }, + "name": { + "description": "Name of the security group according to its `Name` tag on AWS.", + "type": "string" + }, + "red_hat_managed": { + "description": "If the resource is RH managed.", + "type": "boolean" + } + } + }, + "ServerConfig": { + "description": "Representation of a server config", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'ServerConfig' if this is a complete object or 'ServerConfigLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "kubeconfig": { + "description": "The kubeconfig of the server.", + "type": "string" + }, + "server": { + "description": "The URL of the server.", + "type": "string" + }, + "topology": { + "description": "The topology of a provision shard (Optional).", + "$ref": "#/components/schemas/ProvisionShardTopology" + } + } + }, + "SocketTotalNodeRoleOSMetricNode": { + "description": "Representation of information from telemetry about a the socket capacity\nby node role and OS.", + "properties": { + "node_roles": { + "description": "Representation of the node role for a cluster.", + "type": "array", + "items": { + "type": "string" + } + }, + "operating_system": { + "description": "The operating system.", + "type": "string" + }, + "socket_total": { + "description": "The total socket capacity of nodes with this set of roles and operating system.", + "type": "number", + "format": "float" + }, + "time": { + "type": "string", + "format": "date-time" + } + } + }, + "SocketTotalsNodeRoleOSMetricNode": { + "description": "Representation of information from telemetry about the socket capacity by node\nrole and OS of a cluster.", + "properties": { + "socket_totals": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SocketTotalNodeRoleOSMetricNode" + } + } + } + }, + "StorageQuota": { + "description": "Representation of a storage quota ", + "properties": { + "unit": { + "description": "Unit of storage", + "type": "string" + }, + "value": { + "description": "Numerical value", + "type": "number", + "format": "float" + } + } + }, + "StsSupportJumpRole": { + "description": "Isolated STS support role created per organization.", + "properties": { + "role_arn": { + "description": "ARN of the support role created in the SRE jump account.", + "type": "string" + } + } + }, + "SubnetNetworkVerification": { + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'SubnetNetworkVerification' if this is a complete object or 'SubnetNetworkVerificationLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "details": { + "description": "Slice of failures that happened during a subnet network verification.", + "type": "array", + "items": { + "type": "string" + } + }, + "platform": { + "description": "Platform supplied to the network verifier for this subnet.", + "$ref": "#/components/schemas/Platform" + }, + "state": { + "description": "State of the subnet network verification.", + "type": "string" + }, + "tags": { + "description": "Tags supplied to the network verifier for this subnet.", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "Subnetwork": { + "description": "AWS subnetwork object to be used while installing a cluster", + "properties": { + "cidr_block": { + "description": "The CIDR Block of the subnet.", + "type": "string" + }, + "availability_zone": { + "description": "The availability zone to which the subnet is related.", + "type": "string" + }, + "name": { + "description": "Name of the subnet according to its `Name` tag on AWS.", + "type": "string" + }, + "public": { + "description": "Whether or not it is a public subnet.", + "type": "boolean" + }, + "red_hat_managed": { + "description": "If the resource is RH managed.", + "type": "boolean" + }, + "subnet_id": { + "description": "The subnet ID to be used while installing a cluster.", + "type": "string" + } + } + }, + "Subscription": { + "description": "Definition of a subscription.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Subscription' if this is a complete object or 'SubscriptionLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + } + } + }, + "Syncset": { + "description": "Representation of a syncset.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Syncset' if this is a complete object or 'SyncsetLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "resources": { + "description": "List of k8s objects to configure for the cluster.", + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "Taint": { + "description": "Representation of a Taint set on a MachinePool in a cluster.", + "properties": { + "effect": { + "description": "The effect on the node for the pods matching the taint, i.e: NoSchedule, NoExecute, PreferNoSchedule.", + "type": "string" + }, + "key": { + "description": "The key for the taint", + "type": "string" + }, + "value": { + "description": "The value for the taint.", + "type": "string" + } + } + }, + "TokenClaimMappings": { + "description": "The claim mappings defined for users and groups.", + "properties": { + "groups": { + "description": "Groups is a name of the claim that should be used to construct groups for the cluster identity.", + "$ref": "#/components/schemas/GroupsClaim" + }, + "username": { + "description": "Username is a name of the claim that should be used to construct usernames for the cluster identity.", + "$ref": "#/components/schemas/UsernameClaim" + } + } + }, + "TokenClaimValidationRule": { + "description": "The rule that is applied to validate token claims to authenticate users.", + "properties": { + "claim": { + "description": "Claim is a name of a required claim.", + "type": "string" + }, + "required_value": { + "description": "RequiredValue is the required value for the claim.", + "type": "string" + } + } + }, + "TokenIssuer": { + "description": "Representation of a token issuer used in an external authentication.", + "properties": { + "ca": { + "description": "Certificate bundle to use to validate server certificates for the configured URL.", + "type": "string" + }, + "url": { + "description": "URL is the serving URL of the token issuer.", + "type": "string" + }, + "audiences": { + "description": "Audiences is an array of audiences that the token was issued for.\nValid tokens must include at least one of these values in their\n\"aud\" claim.\nMust be set to exactly one value.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "TrustedIp": { + "description": "Representation of a trusted ip address in clusterdeployment.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'TrustedIp' if this is a complete object or 'TrustedIpLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "enabled": { + "description": "The boolean set to show if the ip is enabled.", + "type": "boolean" + } + } + }, + "TuningConfig": { + "description": "Representation of a tuning config.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'TuningConfig' if this is a complete object or 'TuningConfigLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "name": { + "description": "Name of the tuning config.", + "type": "string" + }, + "spec": { + "description": "Spec of the tuning config.", + "type": "object" + } + } + }, + "UpgradePolicy": { + "description": "Representation of an upgrade policy that can be set for a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'UpgradePolicy' if this is a complete object or 'UpgradePolicyLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "cluster_id": { + "description": "Cluster ID this upgrade policy is defined for.", + "type": "string" + }, + "enable_minor_version_upgrades": { + "description": "Indicates if minor version upgrades are allowed for automatic upgrades (for manual it's always allowed).", + "type": "boolean" + }, + "next_run": { + "description": "Next time the upgrade should run.", + "type": "string", + "format": "date-time" + }, + "schedule": { + "description": "Schedule cron expression that defines automatic upgrade scheduling.", + "type": "string" + }, + "schedule_type": { + "description": "Schedule type of the upgrade.", + "$ref": "#/components/schemas/ScheduleType" + }, + "upgrade_type": { + "description": "Upgrade type specify the type of the upgrade.", + "$ref": "#/components/schemas/UpgradeType" + }, + "version": { + "description": "Version is the desired upgrade version.", + "type": "string" + } + } + }, + "UpgradePolicyState": { + "description": "Representation of an upgrade policy state that that is set for a cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'UpgradePolicyState' if this is a complete object or 'UpgradePolicyStateLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "description": { + "description": "Description of the state.", + "type": "string" + }, + "value": { + "description": "State value can be 'pending', 'scheduled', 'cancelled', 'started', 'delayed', \n'failed' or 'completed'.", + "$ref": "#/components/schemas/UpgradePolicyStateValue" + } + } + }, + "UpgradePolicyStateValue": { + "description": "Overall state of a cluster upgrade policy.", + "type": "string", + "enum": [ + "cancelled", + "completed", + "delayed", + "failed", + "pending", + "scheduled", + "started" + ] + }, + "UpgradeType": { + "description": "UpgradeType defines which type of upgrade should be used.", + "type": "string", + "enum": [ + "OSD", + "ADDON", + "ControlPlane", + "NodePool" + ] + }, + "User": { + "description": "Representation of a user.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'User' if this is a complete object or 'UserLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + } + } + }, + "UsernameClaim": { + "description": "The username claim mapping.", + "properties": { + "claim": { + "description": "The claim used in the token.", + "type": "string" + }, + "prefix": { + "description": "A prefix contatenated in the claim (Optional).", + "type": "string" + }, + "prefix_policy": { + "description": "PrefixPolicy specifies how a prefix should apply.\n\nBy default, claims other than `email` will be prefixed with the issuer URL to\nprevent naming clashes with other plugins.\n\nSet to \"NoPrefix\" to disable prefixing.", + "type": "string" + } + } + }, + "Value": { + "description": "Numeric value and the unit used to measure it.\n\nUnits are not mandatory, and they're not specified for some resources. For\nresources that use bytes, the accepted units are:\n\n- 1 B = 1 byte\n- 1 KB = 10^3 bytes\n- 1 MB = 10^6 bytes\n- 1 GB = 10^9 bytes\n- 1 TB = 10^12 bytes\n- 1 PB = 10^15 bytes\n\n- 1 B = 1 byte\n- 1 KiB = 2^10 bytes\n- 1 MiB = 2^20 bytes\n- 1 GiB = 2^30 bytes\n- 1 TiB = 2^40 bytes\n- 1 PiB = 2^50 bytes", + "properties": { + "unit": { + "description": "Name of the unit used to measure the value.", + "type": "string" + }, + "value": { + "description": "Numeric value.", + "type": "number", + "format": "float" + } + } + }, + "Version": { + "description": "Representation of an _OpenShift_ version.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'Version' if this is a complete object or 'VersionLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "gcp_marketplace_enabled": { + "description": "GCPMarketplaceEnabled indicates if this version can be used to create GCP Marketplace clusters.", + "type": "boolean" + }, + "rosa_enabled": { + "description": "ROSAEnabled indicates whether this version can be used to create ROSA clusters.", + "type": "boolean" + }, + "available_upgrades": { + "description": "AvailableUpgrades is the list of versions this version can be upgraded to.", + "type": "array", + "items": { + "type": "string" + } + }, + "channel_group": { + "description": "ChannelGroup is the name of the group where this image belongs.\nChannelGroup is a mechanism to partition the images to different groups,\neach image belongs to only a single group.", + "type": "string" + }, + "default": { + "description": "Indicates if this should be selected as the default version when a cluster is created\nwithout specifying explicitly the version.", + "type": "boolean" + }, + "enabled": { + "description": "Indicates if this version can be used to create clusters.", + "type": "boolean" + }, + "end_of_life_timestamp": { + "description": "EndOfLifeTimestamp is the date and time when the version will get to End of Life, using the\nformat defined in https://www.ietf.org/rfc/rfc3339.txt[RC3339].", + "type": "string", + "format": "date-time" + }, + "hosted_control_plane_default": { + "description": "HostedControlPlaneDefault is a flag that indicates if this should be selected as the default version when a\nHCP cluster is created without specifying explicitly the version.", + "type": "boolean" + }, + "hosted_control_plane_enabled": { + "description": "HostedControlPlaneEnabled indicates whether this version can be used to create HCP clusters.", + "type": "boolean" + }, + "image_overrides": { + "description": "ImageOverrides contains the lists of images per cloud provider.", + "$ref": "#/components/schemas/ImageOverrides" + }, + "raw_id": { + "description": "RawID is the id of the version - without channel group and prefix.", + "type": "string" + }, + "release_image": { + "description": "ReleaseImage contains the URI of Openshift release image for amd64 architecture.", + "type": "string" + }, + "release_images": { + "description": "ReleaseImages contains the URI of OpenShift release images for arm64 and multi architectures.", + "$ref": "#/components/schemas/ReleaseImages" + } + } + }, + "VersionGate": { + "description": "Representation of an _OpenShift_ version gate.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'VersionGate' if this is a complete object or 'VersionGateLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "sts_only": { + "description": "STSOnly indicates if this version gate is for STS clusters only", + "type": "boolean" + }, + "creation_timestamp": { + "description": "CreationTimestamp is the date and time when the version gate was created,\nformat defined in https://www.ietf.org/rfc/rfc3339.txt[RC3339].", + "type": "string", + "format": "date-time" + }, + "description": { + "description": "Description of the version gate.", + "type": "string" + }, + "documentation_url": { + "description": "DocumentationURL is the URL for the documentation of the version gate.", + "type": "string" + }, + "label": { + "description": "Label representing the version gate in OpenShift.", + "type": "string" + }, + "value": { + "description": "Value represents the required value of the label.", + "type": "string" + }, + "version_raw_id_prefix": { + "description": "VersionRawIDPrefix represents the versions prefix that the gate applies to.", + "type": "string" + }, + "warning_message": { + "description": "WarningMessage is a warning that will be displayed to the user before they acknowledge the gate", + "type": "string" + } + } + }, + "VersionGateAgreement": { + "description": "VersionGateAgreement represents a version gate that the user agreed to for a specific cluster.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'VersionGateAgreement' if this is a complete object or 'VersionGateAgreementLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "agreed_timestamp": { + "description": "The time the user agreed to the version gate", + "type": "string", + "format": "date-time" + }, + "version_gate": { + "description": "link to the version gate that the user agreed to", + "$ref": "#/components/schemas/VersionGate" + } + } + }, + "WifAccessMethod": { + "type": "string", + "enum": [ + "impersonate", + "wif" + ] + }, + "WifConfig": { + "description": "Definition of an wif_config resource.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'WifConfig' if this is a complete object or 'WifConfigLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "display_name": { + "description": "The name OCM clients will display for this wif_config.", + "type": "string" + }, + "gcp": { + "description": "Holds GCP related data.", + "$ref": "#/components/schemas/WifGcp" + }, + "organization": { + "description": "The OCM organization that this wif_config resource belongs to.", + "$ref": "#/components/schemas/OrganizationLink" + } + } + }, + "WifCredentialRequest": { + "properties": { + "secret_ref": { + "$ref": "#/components/schemas/WifSecretRef" + }, + "service_account_names": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "WifGcp": { + "properties": { + "impersonator_email": { + "description": "This is the service account email that OCM will use to access other SAs. ", + "type": "string" + }, + "project_id": { + "description": "This represents the GCP project ID in which the wif resources will be configured.", + "type": "string" + }, + "service_accounts": { + "description": "The list of service accounts and their associated roles that will need to be\nconfigured on the user's GCP project.", + "type": "array", + "items": { + "$ref": "#/components/schemas/WifServiceAccount" + } + }, + "workload_identity_pool": { + "description": "The workload identity configuration data that will be used to create the\nworkload identity pool on the user's account.", + "$ref": "#/components/schemas/WifPool" + } + } + }, + "WifIdentityProvider": { + "properties": { + "allowed_audiences": { + "type": "array", + "items": { + "type": "string" + } + }, + "identity_provider_id": { + "type": "string" + }, + "issuer_url": { + "type": "string" + }, + "jwks": { + "type": "string" + } + } + }, + "WifPool": { + "properties": { + "identity_provider": { + "description": "Identity provider configuration data that will be created as part of the\nworkload identity pool.", + "$ref": "#/components/schemas/WifIdentityProvider" + }, + "pool_id": { + "description": "The Id of the workload identity pool.", + "type": "string" + }, + "pool_name": { + "description": "The display name of the workload identity pool.", + "type": "string" + } + } + }, + "WifRole": { + "properties": { + "permissions": { + "type": "array", + "items": { + "type": "string" + } + }, + "predefined": { + "type": "boolean" + }, + "role_id": { + "type": "string" + } + } + }, + "WifSecretRef": { + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + } + } + }, + "WifServiceAccount": { + "properties": { + "access_method": { + "$ref": "#/components/schemas/WifAccessMethod" + }, + "credential_request": { + "$ref": "#/components/schemas/WifCredentialRequest" + }, + "osd_role": { + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WifRole" + } + }, + "service_account_id": { + "type": "string" + } + } + }, + "WifTemplate": { + "description": "Definition of an wif_template resource.", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will be 'WifTemplate' if this is a complete object or 'WifTemplateLink' if it is just a link.", + "type": "string" + }, + "id": { + "description": "Unique identifier of the object.", + "type": "string" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "service_accounts": { + "description": "The list of service accounts and their associated roles that this template\nwould require to be configured on the user's GCP project.", + "type": "array", + "items": { + "$ref": "#/components/schemas/WifServiceAccount" + } + } + } + }, + "WildcardPolicy": { + "description": "Type of wildcard policy.", + "type": "string", + "enum": [ + "WildcardsAllowed", + "WildcardsDisallowed" + ] + }, + "Error": { + "type": "object", + "properties": { + "kind": { + "description": "Indicates the type of this object. Will always be 'Error'", + "type": "string" + }, + "id": { + "description": "Numeric identifier of the error.", + "type": "integer", + "format": "int32" + }, + "href": { + "description": "Self link.", + "type": "string" + }, + "code": { + "description": "Globally unique code of the error, composed of the unique identifier of the API and the numeric identifier of the error. For example, for if the numeric identifier of the error is `93` and the identifier of the API is `clusters_mgmt` then the code will be `CLUSTERS-MGMT-93`.", + "type": "string" + }, + "reason": { + "description": "Human readable description of the error.", + "type": "string" + }, + "details": { + "description": "Extra information about the error.", + "type": "object", + "additionalProperties": true + } + } + } + }, + "securitySchemes": { + "bearer": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + }, + "security": [ + { + "bearer": [ + + ] + } + ] +} \ No newline at end of file